разреженная матрица переопределена система линейных уравнений c / c ++ библиотека - PullRequest
3 голосов
/ 29 октября 2011

Мне нужна библиотека для решения систем Ax = b, где A - несимметричная разреженная матрица, с 8 записями на строку (и она может быть довольно большой).Я думаю, что библиотека, которая реализует градиент biconjugate, должна быть в порядке, но я не могу найти ту, которая работает (я пробовал iml ++, но в пакетах iml ++ / sparselib ++ отсутствуют некоторые заголовки).Любые советы?

Ответы [ 3 ]

3 голосов
/ 29 октября 2011

Существуют стандартные способы лечения переопределенных систем.Например, Википедия гласит:

Набор линейных одновременных уравнений может быть записан в матричной форме как Ax = y.Если уравнений больше, чем переменных, система называется переопределенной и не имеет (в общем случае) решений.Затем систему можно изменить на (A T A) x = A T y.Новая система имеет столько же уравнений, сколько переменных (матрица A T A является квадратной матрицей) и может быть решена обычным способом.Решение представляет собой решение методом наименьших квадратов исходной переопределенной системы, минимизирующее евклидову норму || Ax - y ||, меру расхождения между двумя сторонами в исходной системе.

Поэтому вы можете использовать любой стандартный квадратный матричный разреженный решатель.

Лично я использую прямой решатель из CSparse Тима Дэвиса.Тим написал много отличных прямых разреженных решателей.Действительно, его UMFPACK является еще одним отличным вариантом и используется, например, MATLAB.Обратите внимание, что оба эти решателя предлагают интерфейсы C.Если вы ищете что-то с собственным интерфейсом C ++, то мне нечего предложить.

У меня был некоторый опыт работы с итерационными решателями.Однако я обнаружил, что для рассматриваемых задач итерационные методы стали нестабильными для больших матриц.У меня был гораздо больший успех с прямыми решателями.Конечно, вполне вероятно, что вы можете получить обратный опыт в зависимости от типа матрицы, которую выдает ваша проблема.

0 голосов
/ 03 февраля 2014

К ответу Дэвида Хеффернана: не забывайте одну важную вещь: необходимо проверить / доказать, что матрица A имеет линейно независимые столбцы, в противном случае может случиться, что (A ^ TA) будет единичным (и тогда, конечно, не будет работать ).

0 голосов
/ 29 октября 2011

Похоже, ARPACK решает проблемы разреженных несимметричных матриц. Существует версия C ++

...