1

就我而言,我想用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

右轴 ( b ):

       -1.962
       2.78817e-19
       -5.886

拉姆达

       -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);

我做错了什么?

4

1 回答 1

2

JacobiSVD 考虑所有非零奇异值来求解。我推荐使用 ColPivHouseholderQR。

于 2013-06-22T14:39:59.453 回答