在实践中我应该使用什么值来近似函数的梯度?
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))
的东西,因为对于大x
,h=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)
是最优的,等等
对于某些函数 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))
的东西,因为对于大x
,h=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)
是最优的,等等