就我而言,我想用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);
我做错了什么?