Матрица Инверсии Холесского Факторизация -> результаты не точны
Я вычисляю обратную квадратную матрицу, используя разные библиотеки с помощью факторизации Холецкого. Однако мои результаты не такие, как я ожидал. Я не специалист по математике, но я ожидал получить более близкий результат.
Я использую библиотеки 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Это то, что численные методы человек назвал бы единичной матрицей.
Поэтому я говорю, что ответ, который я получаю, правильный. Вы должны проверить свои так же, и прочитать то, что каждый компьютерщик должен знать об арифметике с плавающей точкой.