在我正在编写的C语言数值求解器中,我需要倒置一个2x2矩阵,并将其乘以另一个矩阵的右侧。
在我的求解器的前几次迭代中,这似乎给出了正确的答案,然而,在几步之后,事情开始增长并最终爆炸。
现在,与使用SciPy的实现进行比较,我发现相同的数学不会爆炸。我唯一能找到的区别是SciPy代码使用scipy.linalg.inv(),它在内部使用LAPACK来执行反演。
当我用上述计算替换对inv()的调用时,Python版本确实会爆炸,所以我非常确定这是问题所在。计算中出现了小差异,这使我相信这是一个数字问题--对于一个反演操作来说,这并不奇怪。
我使用双精度浮点数(64位),希望数字问题不会成为问题,但显然情况并非如此。
但是:我想在我的C代码中解决这个问题,而不需要调用像LAPACK这样的库,因为将其移植到纯C的整个原因是让它在目标系统上运行。此外,我想理解问题,而不仅仅是调用黑盒。如果可能的话,最终我也想让它使用单精度运行。
所以,我的问题是,对于这样一个小矩阵,是否有一种更稳定的数值方法来计算A的逆?谢谢。编辑:目前正在尝试弄清楚是否可以通过求解C来避免求逆。
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来避免求逆。