Мне нужна библиотека для решения систем Ax=b, где A — несимметричная разреженная матрица с 8 элементами в строке (и она может быть довольно большой). Я думаю, что библиотека, реализующая бисопряженный градиент, должна подойти, но я не могу найти работающую (я пробовал iml++, но в пакетах iml++/sparselib++ отсутствуют некоторые заголовки). Какие-нибудь советы?
разреженная матрица переопределенной системы линейных уравнений библиотека c/c++
Ответы (3)
Существуют стандартные способы обработки переопределенных систем. Например, Википедия говорит следующее:
Система линейных одновременных уравнений может быть записана в матричной форме как Ax = y. Если уравнений больше, чем переменных, система называется переопределенной и не имеет (в общем случае) решений. Затем систему можно изменить на (ATA)x = ATy. Новая система имеет столько же уравнений, сколько и переменных (матрица ATA — квадратная матрица) и решается обычным образом. Решение представляет собой решение методом наименьших квадратов исходной переопределенной системы, сводящее к минимуму евклидову норму ||Ax − y||, меру расхождения между двумя сторонами в исходной системе.
Поэтому вы можете использовать любой стандартный решатель разреженных квадратных матриц.
Лично я использую прямой решатель от CSparse Тима Дэвиса. Тим написал ряд отличных прямых разреженных решателей. Действительно, его UMFPACK является еще одним отличным вариантом и используется, например, в MATLAB. . Обратите внимание, что оба этих решателя предлагают интерфейсы C. Если вы ищете что-то с родным интерфейсом C++, то мне нечего предложить.
У меня был некоторый опыт работы с итеративными решателями. Однако я обнаружил, что для задач, которые я рассматривал, итерационные методы становятся нестабильными для больших матриц. Я добился гораздо большего успеха с прямыми решателями. Конечно, вполне вероятно, что у вас может быть обратный опыт в зависимости от типа матрицы, которую создает ваша проблема.
CSparse
, потому что, как это ни парадоксально, простейшие алгоритмы лучше всего подходят для решения моих задач. Но я считаю, что вам нужно сформировать A^tA и A^tb самостоятельно. Конечно, у CSparse есть подпрограммы для создания этих продуктов. Я бы ожидал, что UMFPACK сделает то же самое.
- person David Heffernan; 31.10.2011
Похоже, что ARPACK решает проблемы с разреженными несимметричными матрицами. Есть версия на С++.
К ответу Дэвида Хеффернана: не забывайте одну важную вещь: необходимо проверить/доказать, что матрица A имеет линейно независимые столбцы, иначе может случиться так, что (A ^ T A) является сингулярным (и тогда это, конечно, не сработает).