Существуют стандартные способы лечения переопределенных систем.Например, Википедия гласит:
Набор линейных одновременных уравнений может быть записан в матричной форме как Ax = y.Если уравнений больше, чем переменных, система называется переопределенной и не имеет (в общем случае) решений.Затем систему можно изменить на (A T A) x = A T y.Новая система имеет столько же уравнений, сколько переменных (матрица A T A является квадратной матрицей) и может быть решена обычным способом.Решение представляет собой решение методом наименьших квадратов исходной переопределенной системы, минимизирующее евклидову норму || Ax - y ||, меру расхождения между двумя сторонами в исходной системе.
Поэтому вы можете использовать любой стандартный квадратный матричный разреженный решатель.
Лично я использую прямой решатель из CSparse Тима Дэвиса.Тим написал много отличных прямых разреженных решателей.Действительно, его UMFPACK является еще одним отличным вариантом и используется, например, MATLAB.Обратите внимание, что оба эти решателя предлагают интерфейсы C.Если вы ищете что-то с собственным интерфейсом C ++, то мне нечего предложить.
У меня был некоторый опыт работы с итерационными решателями.Однако я обнаружил, что для рассматриваемых задач итерационные методы стали нестабильными для больших матриц.У меня был гораздо больший успех с прямыми решателями.Конечно, вполне вероятно, что вы можете получить обратный опыт в зависимости от типа матрицы, которую выдает ваша проблема.