В числовом решатель я работаю в C, мне нужно, чтобы инвертировать матрицу 2х2 и затем умножается на правой стороне другой матрицы:численно стабильной обратной матрицы 2х2
C = B . inv(A)
У меня есть используют следующее определение перевернутой матрицы 2х2:
a = A[0][0];
b = A[0][1];
c = A[1][0];
d = A[1][1];
invA[0][0] = d/(a*d-b*c);
invA[0][1] = -b/(a*d-b*c);
invA[1][0] = -c/(a*d-b*c);
invA[1][1] = a/(a*d-b*c);
в течение первых нескольких итераций моего решатель это, кажется, дает правильные ответы, однако, после нескольких шагов вещи начинают расти и в конце концов взорвется.
Теперь, по сравнению с реализацией с использованием SciPy, я обнаружил, что та же математика не взрывается. Единственное различие, которое я могу найти, это то, что в коде SciPy используется scipy.linalg.inv()
, который внутренне использует LAPACK для выполнения инверсии.
При замене вызова на inv()
с приведенными выше расчетами версия Python взрывается, поэтому я уверен, что это проблема. Небольшие различия в расчетах ползут, что заставляет меня думать, что это числовая проблема - не совсем неожиданная для операции инверсии.
Я использую поплавки с двойной точностью (64-разрядные), надеясь, что числовые проблемы не будут проблемой, но, по-видимому, это не так.
Но: Я хотел бы решить это в своем коде на C без необходимости обращаться к библиотеке, такой как LAPACK, потому что вся причина переноса ее на чистый C - это заставить ее работать в целевой системе. Более того, я хотел бы понять проблему, а не просто позвонить в черный ящик. В конце концов, я бы хотел, чтобы он работал с одной точностью, если это было возможно.
Итак, мой вопрос заключается в том, что для такой малой матрицы существует более стабильный способ вычисления обратного значения A?
Спасибо.
Редактировать: В настоящее время пытается выяснить, могу ли я только avoid the inversion путем решения для C
.
В каком смысле он взрывается? Числовое переполнение? Какие типы являются матричными элементами, какие значения? – fge
Ответы на вопросы fge помогут. Здесь также существует возможность деления на ноль, что может вызвать «взрыв». – greg
Извините, если я не был чист, взрыв не возникает непосредственно из этой операции, а из ошибок, введенных этой операцией, в функцию обратной связи, которую я здесь не описывал. – Steve