python:任意精度

时间:2015-04-20 18:02:43

标签: python

我尝试使用这个简单的程序来计算具有正常精度的函数的导数:

# second derivative of a function
def diff2(f, x, h=1E-6):
        r = (f(x-h) - 2*f(x) + f(x+h))/float(h*h)
        return r

# define the function to derivate
def g(t):
        return t**(-6)

# decresing h increasing the precision of the derivative
# ROUND-OFF problems are present
for k in range(1,15):
        h = 10**(-k) # 15 different value of h
        d2g = diff2(g, 1, h) # compute d'' of g 15-th times in point t=1
        print 'h=%.0e: %.5f' % (h, d2g)

从打印操作可以看出,由于四舍五入,当k大于8时,我有问题。我知道我可以使用:

from decimal import *

但我不知道如何在我的函数中实现这些命令。

有人能帮帮我吗?

3 个答案:

答案 0 :(得分:2)

如果你想在x_0位置使用导数并用浮点数进行计算,那么最小化数值误差的h的最佳值是sqrt(sys.float_info.epsilon)*x_0,对于你{{1}的情况大约为1E-8 }}。

有关此值的更多信息和派生,请参阅从第4页开始直至this short script on Numerical Differentiation结尾的x_0=1一章。

答案 1 :(得分:2)

值得研究python模块mpmath,它可以处理任意精度。例如:

>>> from mpmath import mp
>>> mp.dps = 50
>>> print(mp.quad(lambda x: mp.exp(-x**2), [-mp.inf, mp.inf]) ** 2)
3.1415926535897932384626433832795028841971693993751

您可以简单地更改类型,让您的功能更精确地工作。值得注意的是@halex的评论和答案。

答案 2 :(得分:1)

您可以使用十进制模块:

from decimal import Decimal

# second derivative of a function
def diff2(f, x, h=1E-6):
    x, h = Decimal(x), Decimal(h)
    r = (f(x - h) - 2 * f(x) + f(x + h)) / Decimal(h * h)
    return r