如何全局更改 Python 中一段代码的精度以对其进行调试?

计算科学 Python scipy 牛顿法 麻木的 精确
2021-12-20 04:35:41

我正在使用 Python 中的 Newton-Raphson 方法求解非线性方程组。这涉及迭代地使用solve(Ax,b)函数(spsolve在我的例子中,它用于稀疏矩阵),直到错误或更新减少到某个阈值以下。我的具体问题涉及计算函数,例如x/(ex1), 对于小的计算错误x通过 Python,甚至使用np.expm1().

尽管有这些困难,我的解决方案似乎收敛了,因为错误变成了1016. 但是,相关量在物理上没有表现,我怀疑这是由于这些计算的精度。例如,由于电位差很小,我正在尝试计算电流。当这个电位差变得非常小时,这个电流开始振荡,这是错误的,因为电流必须守恒。

我想全局提高代码的精度,但我不确定这是否有用,因为我不确定这种提高的精度是否会反映在诸如spsolve. 我对使用Decimal library也有同样的感觉,这也很麻烦。有人可以就如何解决这个问题给我一些一般性建议或将我指向相关帖子吗?

1个回答

这个答案中,我建议使用mpmathPython 库来获得任意精度。

请注意,由于矩阵 inmpmath实现为字典

仅存储非零值,因此表示稀疏矩阵很便宜。

因此,这个特定的库似乎非常适合您的调试目的。

我发现这个库(和一般方法)对于调试目的非常有用,主要是为了让自己相信我的顽固错误不是来自浮点运算的有限精度。因为如果确实如此,那么要解决的问题要复杂一个数量级。

请注意,使用任意精度的库会显着降低您的代码速度;因此,如果你发现你的问题得到了解决,你仍然有很大的动力去想出一个使用常规双精度的解决方案。