作为调试Python代码的一种方式,您可以全局更改代码的精度吗?

作为调试Python代码的一种方式,您可以全局更改代码的精度吗?,python,numpy,scipy,Python,Numpy,Scipy,我正在用Python中的Newton-Raphson方法求解一个非线性方程组。这涉及到迭代使用solve(Ax,b)函数(在我的例子中是spsolve,它用于稀疏矩阵),直到错误或更新减少到某个阈值以下。我的具体问题涉及到计算诸如x/(e^x-1)之类的函数,Python甚至使用np.expm1()对小x进行了糟糕的计算 尽管存在这些困难,但我的解决方案似乎是收敛的,因为误差为10^-16。然而,依赖量在物理上不起作用,我怀疑这是由于这些计算的精度。例如,我试图计算由于一个小的电位差而产生的电流

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

尽管存在这些困难,但我的解决方案似乎是收敛的,因为误差为10^-16。然而,依赖量在物理上不起作用,我怀疑这是由于这些计算的精度。例如,我试图计算由于一个小的电位差而产生的电流。当电位差变得很小时,电流开始振荡,这是错误的,因为电流必须守恒

我想在全局范围内提高代码的精度,但我不确定这样做是否有用,因为我不确定这种提高的精度是否会反映在spsolve等函数中。我对使用十进制库也有同样的感觉,这也会很麻烦。有人能给我一些关于如何去做这件事的一般性建议吗,或者给我指出一个相关的职位


谢谢大家!

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

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

简短的回答会很有用。在没有看到这一点的情况下,我所能建议的是a)尝试十进制库(它提供了很多可定制性,在中应该不难替代)或b)改变单位(例如a->mA),并将所有东西都放大1000倍。也就是说,从某种意义上说,提高精度。@FiddleStix将所有值乘以1000将使绝对误差增大1000倍,而根本不改变相对误差。
numpy
的精度是固定的,因为它使用标准的浮点表示法。简短的。在没有看到这一点的情况下,我所能建议的是a)尝试十进制库(它提供了很多可定制性,在中应该不难替代)或b)改变单位(例如a->mA),并将所有东西都放大1000倍。也就是说,从某种意义上说,提高精度。@FiddleStix将所有值乘以1000将使绝对误差增大1000倍,而根本不改变相对误差。
numpy
的精度是固定的,因为它使用标准的浮点表示法。