Некорректный определитель, рассчитанный с помощью Math.Net Matrix <double>.Determinant () - PullRequest
0 голосов
/ 23 января 2019

Я пишу программу, которая использует метод Ньютона-Рафсона для решения выпуклой нелинейной системы уравнений.В какой-то момент значение матрицы Якоби системы имеет определитель, который вычисляется как равный 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 голосов
/ 24 января 2019

При дальнейшем исследовании я обнаружил, что проблема здесь связана с числовой стабильностью.Число кондиционирования матрицы m в вышеприведенном коде равно 8,3073429186615851E + 25.Это говорит о том, что расхождение в детерминанте между Calc и Math.Net является результатом ошибок округления в операции копирования-вставки, которые увеличиваются плохо обусловленной матрицей.(В операции копирования-вставки существуют ошибки округления, так как я копирую десятичное приближение двойных чисел из Visual Studio в Calc, а не фактическое двоичное значение).

В дополнение к ранее упомянутой ошибке копирования-вставки также возможно, что Calc и Math.Net по-разному вычисляют детерминанты, и плохое согласование матрицы приводит к очень большим ошибкам с плавающей запятой.

...