从欠定系统中删除不可解的方程

Mic*_*rny 4 c++ linear-algebra eigen

我的程序试图解决线性方程组.为了做到这一点,它组装矩阵coeff_matrix和向量value_vector,并使用Eigen来解决它们,如:

Eigen::VectorXd sol_vector = coeff_matrix
        .colPivHouseholderQr().solve(value_vector);
Run Code Online (Sandbox Code Playgroud)

问题是系统可能过度和不足.在前一种情况下,Eigen提供正确或不正确的解决方案,我使用检查解决方案coeff_matrix * sol_vector - value_vector.

但是,请考虑以下方程组:

a + b - c     =  0
        c - d =  0
        c     = 11
      - c + d =  0
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,Eigen正确地解决了后三个方程,但也给出了a和的解b.

我想要实现的是,只有只有一个解决方案的方程式才能得到解决,剩下的方程式(这里的第一个方程式)将保留在系统中.

换句话说,我正在寻找一种方法来找出当时在给定的方程组中可以求解哪些方程,哪种方法不能,因为将有多个解.

你能否提出任何实现这一目标的好方法?

编辑:请注意,在大多数情况下,矩阵不是正方形.我在这里添加了一行,只是为了注意过度确定也可能发生.

cha*_*ang 6

我认为您想要的是奇异值分解(SVD),它将为您提供您想要的精确值.在SVD之后,"只有一个解的方程将被解决",并且解是伪逆的.它还将为您提供零空间(无限解来自)和左空空间(其中不一致来自,即没有解决方案).

  • 实际上,学习SVD需要相当多的数学,这是线性代数的高潮.我只是用谷歌搜索了一些介绍,见[这里](http://stat.asu.edu/~eric/msri/matlab2.pdf)和[这里](http://www.math.pitt.edu/~sussmanm /2071Spring08/lab09/index.html).HTH. (3认同)