首页 > 解决方案 > 您可以在 Python 中全局更改一段代码的精度,作为调试它的一种方式吗?

问题描述

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

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

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

谢谢!

标签: pythonnumpyscipy

解决方案


您可以尝试使用 mpmath,但使用 YMMV。通常 scipy 使用双精度。在绝大多数情况下,分析数值误差的来源比仅仅尝试用更高宽度的浮点数重新实现所有东西更有效率。


推荐阅读