【问题标题】:Removing unsolvable equations from an underdetermined system从欠定系统中删除不可解的方程
【发布时间】:2012-07-10 13:12:21
【问题描述】:

我的程序试图求解一个线性方程组。为此,它组​​装矩阵coeff_matrix 和向量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 的解。

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

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

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

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

【问题讨论】:

    标签: c++ linear-algebra eigen


    【解决方案1】:

    我认为您想要的是singular value decomposition (SVD),它将为您提供您想要的确切信息。 SVD之后,“只有一个解的方程将被解”,解是伪逆的。它还会为您提供零空间(无限解的来源)和左零空间(不一致的来源,即无解)。

    【讨论】:

    • 你能给我指出一些有助于我理解如何使用它的页面或文档吗?维基百科说了很多数学......
    • 其实学习SVD需要相当多的数学,这是线性代数的高潮。我刚刚在 Google 上搜索了一些介绍,请参阅 herehere。 HTH。
    • 谢谢。我稍微移动了一下空空间并组装了一些我粘贴为解决方案的东西(因为 cmets 不适合实际代码)。不确定我是发明了真实的东西还是只是一种随机的模式。
    【解决方案2】:

    根据 SVD 评论,我可以做这样的事情:

    Eigen::FullPivLU<Eigen::MatrixXd> lu = coeff_matrix.fullPivLu();
    
    Eigen::VectorXd sol_vector = lu.solve(value_vector);
    Eigen::VectorXd null_vector = lu.kernel().rowwise().sum();
    

    AFAICS,对应于单个解的null_vector 行是0s,而对应于非确定解的行是1s。我可以使用 Eigen 的默认阈值在所有示例中重现这一点。

    但是,我不确定我做的是否正确,或者只是注意到了一个随机模式。

    【讨论】:

    • 如果我没记错我的线性代数,那似乎是对的。我在允许使用 matlab 的应用线性代数考试中使用了类似的技巧,但必须逐步找出解决方案。
    【解决方案3】:

    您需要计算系统的行列式。如果行列式是 0,那么你有无限数量的解决方案。如果行列式很小,则存在解,但我不相信计算机找到的解(这会导致数值不稳定)。

    这里是什么是行列式以及如何计算它的链接:http://en.wikipedia.org/wiki/Determinant

    请注意,高斯消除也应该起作用:http://en.wikipedia.org/wiki/Gaussian_elimination 使用这种方法,如果有无数个解决方案,您最终会得到 0 行。

    编辑

    如果矩阵不是方阵,首先需要提取一个方阵。有两种情况:

    1. 您的变量比方程多:那么您要么没有解,要么没有解。
    2. 方程多于变量:在这种情况下,求一个非空行列式的平方子矩阵。求解该矩阵并检查解。如果解决方案不适合,则意味着您没有解决方案。如果解适合,则意味着额外的方程线性依赖于提取的方程。

    在这两种情况下,在检查矩阵的维度之前,删除只有 0 的行和列。

    至于高斯消元,它应该直接用于非方阵。但是,这一次,您应该检查非空行(即具有一些非 0 值的行)的数量是否等于变量的数量。如果它更少,你有无限数量的解决方案,如果它更多,你没有任何解决方案。

    【讨论】:

    • 行列式仅在方阵中有效。
    • @MichałGórny 我为非方形案例编辑了我的解决方案。但只有方阵承认唯一的解决方案。此外,您的示例是使用方阵。
    • 我的示例也是一个超定矩阵,其中两个变量具有唯一解。没有什么是那么简单的...顺便说一句,我正在考虑类似的事情,但我担心所有这些计算会使求解效率非常低。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    相关资源
    最近更新 更多