我正在尝试编写一个函数,该函数在给定点 x
处递归计算函数的 n 阶导数。我使用了导数的简单定义:
f'(x) = f(x + h) - f(x)
---------------
h
lim h -> 0
def deriv(f, x, n=1, h=1e-4):
if n == 0: # 0th order deriv is the function itself (base case)
return f(x)
return (deriv(f, x+h, n-1, h) - deriv(f, x, n-1, h))/h
f = lambda x: x**3
print("x\tf(x)\tf'(x)\tf''(x)\tf'''(x)")
for x in range(5, 10):
print(x, f(x), deriv(f, x), deriv(f, x, 2), deriv(f, x, 3), sep='\t')
对于 h = 1e-4
,我得到以下结果:
x f(x) f'(x) f''(x) f'''(x)
5 125 75.00150000979033 30.00060075919464 5.982769835100044
6 216 108.00180000984483 36.00059699238045 6.053824108676054
7 343 147.00210000967218 42.00060175207909 5.968558980384842
8 512 192.0024000094145 48.00060651177773 5.7980287238024175
9 729 243.00270000935598 54.0005999027926 6.02540239924565
我关注最后一列:x^3
的三阶导数应该是 6
并且值非常接近于 6
!现在我虽然将 h
变小会导致更准确的结果,所以我将其更改为 1e-5
,但结果不正确:
x f(x) f'(x) f''(x) f'''(x)
5 125 75.00014999664018 30.000251172168642 -28.421709430404004
6 216 108.00017999486043 36.000358250021236 -56.84341886080801
7 343 147.0002099949852 41.99989689368522 56.84341886080801
8 512 192.0002399970144 47.9997197544435 0.0
9 729 243.00026999526378 53.998974181013175 227.37367544323203
前两列似乎没问题。我认为问题在于浮点数不准确,但我无法确定到底出了什么问题,以及超出的阈值会导致结果不准确。