Math.Net系统的线性方程组,其值为0

时间:2017-05-11 07:08:57

标签: c# .net math matrix mathdotnet

当我对矩阵的实际解决方案之一为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行的情况。可以这样做吗?

否则,当使用现有Math.Net线性代数求解器操作的0是其中一个变量的唯一可能解决方案时,有什么方法可以识别吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

返回

[10000, 1000, 0]

有趣的是,使用MKL Native Provider,这也适用于普通的Solve例程,但不适用于托管提供商(如您所知),也不适用于OpenBLAS原生提供者。