当我对矩阵的实际解决方案之一为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是其中一个变量的唯一可能解决方案时,有什么方法可以识别吗?
谢谢!
答案 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原生提供者。