linear — Решение недоопределенной системы уравнений в Eigen (C ++)

В моем случае я хочу решить недоопределенную систему уравнений, A * λ = b, с JacobiSVD решатель из Eigen (3.0.12).

Система линейных уравнений имеет следующую структуру в моей программе на C ++:

Коэффициент матрицы ():

       0.6           5.68434e-20      -0.2
5.68434e-20   7.06819e-39      -4.26326e-20
-0.2          -4.26326e-20     0.4

RHS (б):

       -1.962
2.78817e-19
-5.886

лямбда:

       -9.81
3.94467e+19         <---------- error (Where does this come from?)
-19.62
  • Ранг матрицы А — Ранг (A) = 2
  • Таким образом, матрица не имеет полного ранга. Следовательно, A является единственной и необратимой.
  • Состояние — cond (A) = Inf
  • Для решения A * λ = b я использовал SVD метод разложения из Eigen (JacobiSVD)

Я также проверил это с помощью MATLAB:
http://www.pictureupload.us/image-172220092351c5ae0c1706e.htm

На начальном этапе первые шаги моделирования являются приблизительно правильными. Но есть очень маленькая числовая ошибка, которая увеличивается при решении A * λ = b.

Затем происходит сбой системы, и мои результаты больше не верны, и я получаю результаты NaN.

Вот код:

/******** SVD ********/
JacobiSVD<TMatrixX> svd(A, ComputeThinU | ComputeThinV);
lambda = svd.solve(b);

Что я сделал не так?

1

Решение

JacobiSVD рассматривает все ненулевые особые значения для решения. Я рекомендую использовать ColPivHouseholderQR.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector