Math.Net Matrix <double> .Determinant()计算出的不正确的行列式

时间:2019-01-22 23:28:45

标签: c# .net newtons-method

我正在编写一个使用Newton-Raphson方法求解凸非线性方程组的程序。一方面,系统的雅各比矩阵的值具有一个确定为等于0的行列式,但是当我将矩阵转置为LibreOffice Calc并计算行列式时,我发现它不是0。

以下是Visual Studio和LibreOffice Calc中矩阵和行列式的图像:

enter image description here

enter image description here

enter image description here

到目前为止,我已经尝试使用基本行操作将矩阵简化为对角矩阵。这可能表明矩阵是非奇异的,行列式不是0。

以下是对其应用了几行操作后的矩阵:

enter image description here

我认为差异可能是浮点错误的结果,但我不知道如何检查。而且,差异的大小使得这种情况似乎不太可能。

编辑: 我一直在尝试重现上面的结果,但是我一直遇到困难。以下代码(基于上面的矩阵)将行列式-4.10496081041529E + 88打印到控制台:

using MathNet.Numerics.LinearAlgebra;
using System;
namespace MatrixDeterminantExample {
    class Program {
        static void Main(string[] args) {
            Matrix<double> m = Matrix<double>.Build.Dense(4, 4);
            m[0, 0] = 3.13E+17;
            m[0, 1] = 0;
            m[0, 2] = 0;
            m[0, 3] = -5.70602814759918E+027;
            m[1, 0] = 0;
            m[1, 1] = 1250000000000;
            m[1, 2] = 0;
            m[1, 3] = -1250000000000;
            m[2, 0] = 0;
            m[2, 1] = 0;
            m[2, 2] = 4.16E+23;
            m[2, 3] = -2529352014499.78;
            m[3, 0] = -5.71E+27;
            m[3, 1] = -1250000000000;
            m[3, 2] = -2529352014499.77;
            m[3, 3] = 1.03841786481613E+038;
            Console.WriteLine(m.Determinant());
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在进一步研究中,我发现这里的问题与数值稳定性有关。上面代码中矩阵m的条件数为8.3073429186615851E + 25。这表明Calc和Math.Net之间的行列式差异是复制-粘贴操作中舍入误差的结果,条件差的矩阵会放大舍入误差。 (由于我将double的十进制近似值从Visual Studio复制到Calc,而不是实际的二进制值,因此复制粘贴操作中存在舍入误差。)

除了前面提到的复制粘贴错误外,Calc和Math.Net计算行列式的可能性也可能不同,并且矩阵条件不佳会导致很大的浮点错误。