在我用C工作的數值解算器的數值穩定逆,我需要反轉一個2x2矩陣,它隨後被另一矩陣相乘右側:一個2x2矩陣
C = B . inv(A)
我有在使用倒置×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