решение сингулярной матрицы

Я пытаюсь написать небольшую распаковку для сеток. При этом используется метод конечных элементов для определения минимального линейного напряжения между уплощенной и необработанной поверхностью. На данный момент есть некоторые вершины, закрепленные для получения результата. Без этого треугольники вращаются и перемещаются случайным образом...

Но поскольку это закрепление не является необходимым для задачи, лучшим решением будет прямое решение сингулярной матрицы. Petsc предоставляет некоторые методы для решения сингулярной системы, предоставляя некоторую информацию о пустом пространстве. http://www.mcs.anl.gov/petsc/petsc-current/docs/manual.pdf#section.4.6 Интересно, есть ли альтернатива этому в Eigen. Если нет, есть ли другие возможности решить эту проблему без фиксации/закрепления вершин.

спасибо, с уважением

см. также эту ссылку для получения дополнительной информации: история разработки


person Lo L    schedule 14.11.2016    source источник
comment
Если нулевое пространство известно аналитически, то вы можете попробовать написать собственный предобуславливатель, который будет проектором, предназначенным для устранения жестких движений. См. stackoverflow.com/questions/ 39980074/ и bitbucket.org/eigen/eigen/src/ Взгляните на scicomp.stackexchange.com/questions/7488/   -  person francis    schedule 26.12.2016


Ответы (1)


Эйген предоставляет алгоритм декомпозиции SVD: Jacobi SVD.

Разложение SVD дает нулевое пространство. Следуя обозначениям из статьи в Википедии, пусть M = U D V будет SVD-разложением M, где D диагональная матрица сингулярных значений. Затем из диапазона, нулевого пробела и ранга:

Сингулярные справа векторы [V], соответствующие исчезающим сингулярным значениям M, охватывают нулевое пространство M

person billx    schedule 15.11.2016
comment
Я думаю, что SVD не подходит для больших матриц. Я хотел бы использовать решатель сопряженных градиентов. - person Lo L; 16.11.2016
comment
SVD - это довольно трудоемкая декомпозиция, но реализация в Eigen очень надежна (с точки зрения численной точности). На какой размер матрицы вы ориентируетесь? - person billx; 16.11.2016
comment
Вы также можете взглянуть на классы PartialPivLU и FullPivLU, которые могут дать вам ядро. eigen.tuxfamily.org/dox/ - person billx; 16.11.2016
comment
Я думаю, что матрица может достигать 10 ^ 6 x 10 ^ 6, но она очень разреженная и симметричная. Это итерационная процедура, в которой я использую последний результат в качестве предположения для следующего линейного решения. - person Lo L; 17.11.2016
comment
Теперь я использую множитель Лагранжа для всех 3 степеней свободы (2 перевода на один оборот). Таким образом, это ограничивает общее перемещение по оси x, полное перемещение по оси y и общее вращение. Это работает довольно хорошо. Но я все еще ищу ответы, как спроецировать решение nullspace из rhs. - person Lo L; 17.11.2016