我正在使用以下函数来近似函数在某个点的导数:
def prime_x(f, x, h):
if not f(x+h) == f(x) and not h == 0.0:
return (f(x+h) - f(x)) / h
else:
raise PrecisionError
作为一项测试,我以 3.0和3.0f
的身份通过。在哪里:fx
x
fx
def fx(x):
import math
return math.exp(x)*math.sin(x)
其中有exp(x)*(sin(x)+cos(x))
作为衍生物。现在,根据谷歌和我的计算器
exp(3)*(sin(3)+cos(3)) = -17.050059
.
到目前为止,一切都很好。但是当我决定用小值测试函数时,h
我得到了以下结果:
print prime_x(fx, 3.0, 10**-5)
-17.0502585578
print prime_x(fx, 3.0, 10**-10)
-17.0500591423
print prime_x(fx, 3.0, 10**-12)
-17.0512493014
print prime_x(fx, 3.0, 10**-13)
-17.0352620898
print prime_x(fx, 3.0, 10**-16)
__main__.PrecisionError: Mantissa is 16 digits
为什么当 h 减小时(在某个点之后)误差会增加?我期待相反,直到f(x+h)
等于f(x)
。