【问题标题】:Math.Net system of linear equations with a 0 value in solution求解中值为 0 的 Math.Net 线性方程组
【发布时间】:2017-10-10 01:29:42
【问题描述】:

当矩阵的实际解之一为 0 时,我试图在 Math.Net 中求解矩阵,但我得到 -NaN- 作为结果。

这是一个为简单起见已经简化的示例矩阵。

1 0  1 | 10000 
0 1 -1 | 1000
0 0  0 | 0

代码示例:

public void DoExample()
{
    Matrix<double> A = Matrix<double>.Build.DenseOfArray(new double[,] {
        { 1, 0, 1 }, 
        { 0, 1, -1 }, 
        { 0, 0, 0 }, 
    });

    Vector<double> B = Vector<double>.Build.Dense(new double[] { 10000, 1000, 0 });

    var result = A.Solve(B);
}

我希望得到的解决方案是 [ 10000, 1000, 0 ]

如你所见,我想要的结果已经是增广向量。这是因为我在此示例中使用 Gauss-Jordan 手动将矩阵简化为简化的行梯形 (RREF)。如果我可以在 Math.Net 中以某种方式使用 Gauss-Jordan 运算来执行此操作,我可以检查 RREF 矩阵中存在全 0 行的情况。这个可以吗?

否则,我有什么方法可以识别何时 0 是使用现有 Math.Net 线性代数求解器运算的变量之一的唯一可能解决方案?

谢谢!

【问题讨论】:

  • 尝试 SVD 求解器。它会用你的退化矩阵做最好的事情。如您所见,您有三个未知数,但只有两个方程。您能做的最好的事情就是根据另外两个解决三个中的一个。
  • 达菲莫,谢谢。我非常关注这个问题,因为我的预期值之一是 0,以至于我错过了这个问题。也许我可以开始用我的应用程序替换以前已知的“好”值,以便在这些情况下欺骗合理的解决方案。有没有办法检测哪个变量是免费的(或缺乏足够的清晰度)?
  • 这三个变量中的任何一个都可以被认为是“免费的”。在这种情况下,第三个是自然的 b/c 它的行全为零。
  • 哦,SVD求解器在使用solve方法时也会失败。我不知道使用迭代求解器方法是否会有所帮助。 (我完全迷失了这些,因为在线文档令人生畏,我找不到好的例子。)
  • 在我的名字中搜索 SVD。前段时间详细浏览了一遍。 stackoverflow.com/questions/19763698/…

标签: c# .net math matrix math.net


【解决方案1】:

这是degenerate matrix with rank 2,你不能指望得到真正的解决方案(有无数个解决方案)

【讨论】:

  • @foreach_potato,举个例子,[9999, 1001, 1] 是这个方程组的一个很好的解,就像你所希望的那样
  • 感谢 MBo 和 SergGr 为我说明了这一点。今天早上我缺乏想出任何其他解决方案的想象力。
【解决方案2】:

迭代求解器实际上可以处理这个,例如

using MathNet.Numerics.LinearAlgebra.Double.Solvers;
A.SolveIterative(B, new MlkBiCgStab());

返回

[10000, 1000, 0]

有趣的是,对于 MKL Native Provider,这也适用于正常的 Solve 例程,但不适用于托管提供程序(如您所见),也不适用于例如OpenBLAS 原生提供者。

【讨论】:

  • 哇,这比我想象的还要神奇!我将尝试这个并简单地检查结果,而不是替换可疑变量(如上所述)。谢谢,克里斯托夫!
  • 那个求解器倾向于得到解决方案,但并不总是我所期望的。例如,通过将第 1 行移到前面来运行相同的矩阵会给我一个 [0, 11000, 10000] 的不同解决方案,所以相同的矩阵,但基于算法在场景中所做的任何事情的不同结果。如果不提供一些输入,我就不能真正依赖结果。我可以使用预处理器提供可接受的值以尝试遵守吗?抱歉,我没有找到预处理器如何工作的示例。
  • 我不确定我是否按照您的意思将第 1 行移到前面 - 如果我切换 A 和 B 的第 0 行和第 1 行,我会得到完全相同的结果。你在你的情况下得到的仍然是正确的解决方案吗?
  • 对不起,我打错了。如果将第 3 行移动到矩阵的顶部(现在它是第 1 行),您将得到我提到的另一个解决方案。换句话说:A:{0,0,0},{1,0,1},{0,1,-1}B:{0,10000,1000}结果:{0,11000,10000}跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多