【问题标题】:Solving a underdetermined equation system in Eigen (C++)在 Eigen (C++) 中求解欠定方程组
【发布时间】:2013-06-19 10:30:12
【问题描述】:

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

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

我做错了什么?

【问题讨论】:

    标签: c++ linear-algebra eigen algebra svd


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多