python 精度更高
higher precision in python
我是 运行 一些使用 numpy
和 scipy
和 math
的 python
v3.3.2 脚本。我怀疑我的计算存在数值精度问题,我想提高我编写的某些特定模块的精度,看看它是否会对最终结果产生影响。在我的模块中,我使用了一些代数运算和 numpy.sqrt
.
如何在我已经编写的模块中操纵计算精度?(我可以修改它)。我看到有几个模块可用,例如 decimal
和 mpmath
以及 bigfloat
,我试图从文档中找出哪个更适合我的任务。第一个已经安装,我应该安装另外两个。理想情况下,我想在模块顶部编写一个命令并指定我在该模块中需要的精度,是否存在类似的东西?
编辑 --------
我认为问题可能出在二阶导数的计算上:
def secondderivative(x,y):
xl = np.roll(x,1) # x1
xr = np.roll(x,-1)# x3
yl = np.roll(y,1)
yr = np.roll(y,-1)
ind = np.where(np.isnan(y) | np.isnan(yl) | np.isnan(yr) )[0]
deriv2 = (2 * yl / ((x - xl) * (xr - xl))
- 2 * y / ((xr - x) * (x - xl))
+ 2 * yr / ((xr - xl) * (xr - x)))
for i in ind:
deriv2[i] = np.nan
deriv2[0] = np.nan
deriv2[len(deriv2)-1] = np.nan
return deriv2
我看到梯度的结果完全不同:
np.gradient(np.gradient(y,x),x)
当您的代码基于 numpy/scipy 和 co. 时,您只能使用这些库支持的类型。这是 overview.
段落 Extended precision 与您相关。
将 numpy/scipy 与 decimal、mpmath 和 co 相结合。需要做很多工作(在一般情况下)!
如果显示一些代码以便人们可以猜到发生了什么,那就更明智了。即使精度有限,也有一些技术可以发挥作用:例如iterative-refinement in solving linear systems.
我是 运行 一些使用 numpy
和 scipy
和 math
的 python
v3.3.2 脚本。我怀疑我的计算存在数值精度问题,我想提高我编写的某些特定模块的精度,看看它是否会对最终结果产生影响。在我的模块中,我使用了一些代数运算和 numpy.sqrt
.
如何在我已经编写的模块中操纵计算精度?(我可以修改它)。我看到有几个模块可用,例如 decimal
和 mpmath
以及 bigfloat
,我试图从文档中找出哪个更适合我的任务。第一个已经安装,我应该安装另外两个。理想情况下,我想在模块顶部编写一个命令并指定我在该模块中需要的精度,是否存在类似的东西?
编辑 --------
我认为问题可能出在二阶导数的计算上:
def secondderivative(x,y):
xl = np.roll(x,1) # x1
xr = np.roll(x,-1)# x3
yl = np.roll(y,1)
yr = np.roll(y,-1)
ind = np.where(np.isnan(y) | np.isnan(yl) | np.isnan(yr) )[0]
deriv2 = (2 * yl / ((x - xl) * (xr - xl))
- 2 * y / ((xr - x) * (x - xl))
+ 2 * yr / ((xr - xl) * (xr - x)))
for i in ind:
deriv2[i] = np.nan
deriv2[0] = np.nan
deriv2[len(deriv2)-1] = np.nan
return deriv2
我看到梯度的结果完全不同:
np.gradient(np.gradient(y,x),x)
当您的代码基于 numpy/scipy 和 co. 时,您只能使用这些库支持的类型。这是 overview.
段落 Extended precision 与您相关。
将 numpy/scipy 与 decimal、mpmath 和 co 相结合。需要做很多工作(在一般情况下)!
如果显示一些代码以便人们可以猜到发生了什么,那就更明智了。即使精度有限,也有一些技术可以发挥作用:例如iterative-refinement in solving linear systems.