Матрица Инверсии Холесского Факторизация -> результаты не точны

Я вычисляю обратную квадратную матрицу, используя разные библиотеки с помощью факторизации Холецкого. Однако мои результаты не такие, как я ожидал. Я не специалист по математике, но я ожидал получить более близкий результат.

Я использую библиотеки MLK, magma и CULA для вычисления обратной матрицы в процессорах и графических процессорах. После выполнения этих библиотек я заметил, что результаты всегда отличаются в одном элементе. Скажем, я хочу рассчитать обратное A= [0.237306,0.000458;0.000458,0.238497]:

A[0] = 0.237306 
A[1] = 0.000458 
A[2] = 0.000458 
A[3] = 0.238497

Результат, который я получаю:

inv(A)[0] = 4.213983 
inv(A)[1] = -0.008092 
inv(A)[2] = 0.000458 
inv(A)[3] = 4.192946 

Тем не менее, правильный результат должен быть

   4.2139841  -0.0080924
  -0.0080924   4.1929404

Как вы видете, inv(A)[3] отличается, хотя с остальными они в порядке. Вот как должна работать Инверсия Холецкого? Это правильный / приблизительный результат или я что-то здесь не так делаю?

2 ответа

Решение

Я понимаю, что происходит. Эти библиотеки вычисляют обратную матрицу, верхнюю или нижнюю, как указал Александр С. Таким образом, в зависимости от аргумента, который вы передаете в библиотеку (Upper или Lower), он вычисляет обратную величину верхней или нижней части матрицы. Я думал, что вы можете рассчитать полную обратную матрицу, но, видимо, это невозможно.

Вероятно, это связано со спецификацией IEEE для чисел с плавающей запятой и неточностью, которая встроена в работу с ними.

Вы не говорите, указали ли вы 32-битные или 64-битные числа с плавающей запятой. Попробуйте увеличить свою точность.

Еще один момент, на который следует обратить внимание: люди обычно не вычисляют обратную матрицу, потому что она подвержена ошибкам округления. Лучшим выбором является декомпозиция LU и прямая обратная замена.

Откуда вы получили "правильный" ответ? Как вы оцениваете правильность своего результата?

Я знаю, что это не лучший инструмент для численных методов, но если я возьму вашу матрицу:

0,237306 0,000458 0,000458 0,238497

и запустить его через MINVERSE, я получаю этот ответ:

4.213984 -0.00809 -0.00899 4.19294

Я могу проверить его достоверность, умножив оригинал и обратное, чтобы узнать, получу ли я обратно матрицу идентификации. Вот что я получил от MMULT:

1 2.1684e-19 -2.168e-19 1

Это то, что численные методы человек назвал бы единичной матрицей.

Поэтому я говорю, что ответ, который я получаю, правильный. Вы должны проверить свои так же, и прочитать то, что каждый компьютерщик должен знать об арифметике с плавающей точкой.

Другие вопросы по тегам