我使用以下代码计算一阶导数:
def f(x):
f = np.exp(x)
return f
def dfdx(x):
Df = (f(x+h)-f(x-h)) / (2*h)
return Df
例如,对于 x == 10
这可以正常工作。但是当我将 h
设置为 10E-14
或以下时,Df
开始
获得与期望值 f(10)
相差甚远的值,并且期望值与 Df
之间的相对误差变得巨大。
这是为什么呢?这里发生了什么?
最佳答案
f(x)
的计算最多有 |f(x)|*mu
的舍入误差,其中 mu
是浮点型的机器常数。因此中心差分公式的总误差约为
2*|f(x)|*mu/(2*h) + |f'''(x)|/6 * h^2
在本例中,指数函数等于它的所有导数,因此误差与
mu/h + h^2/6
最小值在 h = (3*mu)^(1/3)
,对于 mu=1e-16
的 double 格式大约是 h=1e-5
.
如果在分母中使用评估点之间的实际差异 (x+h)-(x-h)
而不是 2*h
,则精度会提高。这可以在下面精确导数距离的对数对数图中看出。
关于Python 数值微分和 h 的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55200212/