在Eigen(C ++)中求解欠定方程组

时间:2013-06-22 10:27:12

标签: c++ linear eigen algebra svd

就我而言,我想用Eigen(3.0.12)中的 JacobiSVD 求解器求解一个欠定方程系统A *λ= b。

线性方程系统在我的C ++程序中具有以下结构:

系数矩阵( A ):

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

RHS( b ):

       -1.962
       2.78817e-19
       -5.886

LAMBDA

       -9.81
       3.94467e+19         <---------- error (Where does this come from?)
       -19.62
  • 矩阵A的等级为 - Rank(A)= 2
  • 因此矩阵没有满级。因此,A是单数且不可逆。
  • 条件是 - cond(A)= Inf
  • 为了解决A *λ= b,我使用了Eigen(JacobiSVD)的 SVD 分解方法

我也用MATLAB验证了这一点: http://www.pictureupload.us/image-172220092351c5ae0c1706e.htm

一开始,第一个模拟步骤是近似正确的。但是有一个非常小的数值误差,在求解A *λ= b时会增加。

然后系统崩溃,我的结果不再正确,我得到NaN结果。

这里是代码:

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

我做错了什么?

1 个答案:

答案 0 :(得分:2)

JacobiSVD考虑所有非零奇异值进行求解。我建议使用ColPivHouseholderQR。