繁体   English   中英

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

[英]Incorrect Determinant calculated by Math.Net Matrix<double>.Determinant()

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

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

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

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

这是对其应用了若干行操作后的矩阵:

在此处输入图片说明

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

编辑:我一直在尝试重现上面的结果,但是我一直遇到困难。 以下代码(基于上面的矩阵)将行列式-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());
        }
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM