在我正在使用 C 语言的数值求解器中,我需要反转一个 2x2 矩阵,然后在右侧乘以另一个矩阵:
C = B . inv(A)
我一直在使用倒置 2x2 矩阵的以下定义:
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 的逆?
谢谢。
编辑:目前试图弄清楚我是否可以通过求解来避免反转C
。