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

标签 c++ linear-algebra eigen

我的程序试图求解线性方程组。为此,它组​​装了矩阵 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 正确求解了后三个方程,而且还给出了 ab 的解。

我想实现的是,只有只有一个解的方程才会被求解,其余的(这里是第一个方程)将保留在系统中。

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

您能建议实现该目标的任何好方法吗?

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

最佳答案

我想你想要的是 singular value decomposition (SVD) ,这会给你确切的你想要什么。 SVD 后,“只有一个解的方程将被求解”,并且解是伪逆的。它还将为您提供零空间(无限解决方案的来源)和左零空间(不一致的来源,即无解决方案)。

关于c++ - 从欠定系统中删除不可解的方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11414057/

相关文章:

c++ - 如何在 CMake 中添加 "-l"(ell) 编译器标志

c++ - CPPUTest 的 Eigen ?

c++ - 为 Eigen 类型特化一个函数

c++ - 数组符号之间的差异

c++ - 使用模板在编译时初始化数组指针的 const vector

库中的 C++ 常量;不起作用

c++ - 矩形边界内的旋转线

linear-algebra - 特征库中的广义特征值和向量

python - Numpy:将数组转换为三角矩阵

c++ - Eigen::Ref<> 与 std::reference_wrapper<> 的优缺点是什么?