在实践中我应该使用什么值来近似函数的梯度?

What value should I use to approximate gradient of a function in practice?

对于某些函数 f(x),我想使用以下近似值找到 f'(x) 和 f''(x):

[f(x+h) - f(x)] / h

在每种情况下我应该选择哪些h值?我知道对于 f'(x) 它应该是 h = sqrt(epsilon) 其中 epsilon 是机器 epsilon。但是我是否必须以不同方式处理 f''(x) 的 h 值?我的猜测是截断和舍入误差在某种程度上相互抵消并产生了这个值。

我应该如何估算双精度的误差(作为示例)?

你应该使用类似h=sqrt(epsilon)*(1+abs(x))的东西,因为对于大xh=sqrt(epsilon)的相对精度会降低。

通常,第 k 个导数的差分公式的计算误差与 epsilon/h^k 成正比,这会增加近似公式的阶数理论误差 h^p。如果两个贡献大致相等,则总误差最小,即 h=epsilon^(1/(k+p)),然后需要针对 x.

的大小进行缩放

在以下示例中让 x 具有比例 1 以避免该比例。在你的单边一阶导数公式k=p=1中,所以h=epsilon^(1/2)。如果取对称差分公式,那么k=1, p=2和最优的h大约是epsilon^(1/3)。如果使用对称二阶差分公式逼近二阶导数,则得到 k=p=2,因此 h=epsilon^(1/4) 是最优的,等等