为什么复杂的步长微分优于中心微分

计算科学 有限差分
2021-12-11 18:59:25

我在 Cleve's Corner 看到了这篇文章,他在那里展示了复杂的步骤微分比中心差异更准确。两种方法的错误是O(h2). 那么,为什么复杂的阶跃微分会产生更好的结果呢?是因为隐藏在O(h2)对于复杂的步骤微分更好?

2个回答

实际上,复杂步长方法的舍入误差要低得多,因为所有导数项都在虚部中处理,而不与实部直接交互,而不是有限差分计算。

复杂步骤的优点是您可以采用非常低的扰动大小h(我通常使用1050),而你只会下到周围h=ϵmachine108用于避免过度舍入误差的经典有限差分公式(例如,请参见链接的 Matlab 帖子中的收敛图)。

事实上,让我们考虑泰勒级数f有一个复杂的扰动:

f(x+ih)=f(x)+ihf(x)h2f(x)ih3f(x)+O(h4)+iO(h5)

取虚部并除以h, 你得到:

f(x)h2f(x)+O(h4)
通过采取非常小的h,第二项和第三项由于虚部的舍入误差而完全消失,从而为您提供机器精度的准确评估f(x),您很可能永远无法使用经典的有限差分方案(或者可能使用非常高阶的方案)来实现。另一种方法是使用自动微分。

另一方面是复杂的步骤通常很容易实现(如果语言允许轻松处理复杂的变量)。例如对于标量函数f,您可以在 Python 中将其一阶导数构造为单线:

fprime = lambda x: np.imag( f(x + 1e-50*1i) ) * 1e50

按照@nicoguaro 的建议回答。这些方法具有相同的截断误差但不具有相同的舍入误差,这就是它们具有不同数值精度的原因。