我的程序试图求解线性方程组。为此,它组装了矩阵 coeff_matrix
和 vector value_vector
,并使用 Eigen 来解决它们,例如:
Eigen::VectorXd sol_vector = coeff_matrix
.colPivHouseholderQr().solve(value_vector);
问题在于系统既可能是过度确定的,也可能是欠定的。在前一种情况下,Eigen 给出了正确或不正确的解决方案,我使用 coeff_matrix * sol_vector - value_vector
检查解决方案。
但是,请考虑以下方程组:
a + b - c = 0
c - d = 0
c = 11
- c + d = 0
在这种特殊情况下,Eigen 正确求解了后三个方程,而且还给出了 a
和 b
的解。
我想实现的是,只有只有一个解的方程才会被求解,其余的(这里是第一个方程)将保留在系统中。
换句话说,我正在寻找一种方法来找出当时在给定方程组中哪些方程可以求解,哪些方程不能求解,因为会有多个解。
您能建议实现该目标的任何好方法吗?
编辑:请注意,在大多数情况下,矩阵不是正方形的。我在这里又添加了一行,只是为了说明过度确定也可能发生。
最佳答案
我想你想要的是 singular value decomposition (SVD) ,这会给你确切的你想要什么。 SVD 后,“只有一个解的方程将被求解”,并且解是伪逆的。它还将为您提供零空间(无限解决方案的来源)和左零空间(不一致的来源,即无解决方案)。
关于c++ - 从欠定系统中删除不可解的方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11414057/