我尝试使用这个简单的程序来计算具有正常精度的函数的导数:
# 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 *
但我不知道如何在我的函数中实现这些命令。
有人能帮帮我吗?
答案 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