Math.Net 解中值为 0 的线性方程组

Math.Net system of linear equations with a 0 value in solution

当矩阵的实际解之一为 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 线性代数求解器运算的变量之一的唯一可能解?

谢谢!

这是degenerate matrix with rank2,你不能指望得到真解(解有无穷多个)

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

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

returns

[10000, 1000, 0]

有趣的是,对于 MKL Native Provider,这也适用于正常的 Solve 例程,但不适用于托管提供程序(正如您已经发现的那样),也不适用于例如OpenBLAS 本机提供程序。