具有近似数值导数的 Newton-Raphson 逼近的缺点

计算科学 参考请求 近似
2021-12-05 22:46:50

假设我有一些功能f我想找到x这样f(x)0. 我可能会使用 Newton-Raphson 方法。但这需要我知道导函数f(x). 的解析表达式f可能不可用。例如,f可以通过查阅实验值数据库的一段复杂的计算机代码来定义。

但即使f很复杂,我可以近似f(a)对于任何特定的a通过选择一个小数字ϵ和计算f(a)f(a+ϵ)f(a)ϵ.

我听说这种方法有明显的缺点,但我不知道它们是什么。维基百科暗示“使用这种近似会导致类似于割线法的结果,其收敛速度比牛顿法慢。”

有人可以详细说明这一点,并提供特别讨论该技术问题的参考吗?

2个回答

为了记号,我们假设f:RnRn(即,它是一个向量值函数,将向量作为输入并输出相同大小的向量)。有两个问题:计算成本和数值精度。

计算导数Df(x)(雅可比矩阵,J(x), 或者(f(x))T, 或任何你喜欢的) 使用有限差分将需要n功能评价。如果您可以直接从定义中使用浮点算术计算导数,则必须计算差商

Df(x)ei=limε0f(x+εei)f(x)ε

对于每个,假设你不做任何类型的“智能有限差分”(如 Curtis-Powell-Reid),因为你知道(或可以检测到) . 如果很大,那可能是很多函数评估。如果您有的解析表达式,那么计算它可能会更便宜。在某些情况下,也可以使用自动(也称为算法)微分方法以大约 3 到 5 倍的函数评估成本i=1,,nDfnDfDf

还有数字方面的问题。显然,在计算机上,当标量变为零时,我们不能取其极限,所以当我们逼近时,我们实际上选择为“小”并计算Dfε

Df(x)eif(x+εei)f(x)ε,

其中表示它是一个近似值,我们希望它是一个非常好的近似值。在浮点算术中计算这个近似值是很困难的,因为如果你选择太大,你的近似值可能会很糟糕,但是如果你选择的太小,可能会有很大的舍入误差。这些影响在Wikipedia 关于数值微分的文章中有所介绍;可以在文章中找到更详细的参考资料。εε

如果雅可比矩阵中的误差不是太大,Newton-Raphson 迭代将收敛。有关详细的理论分析,请参阅Nick Higham的《数值算法的准确性和稳定性》第 25 章,或Françoise Tisseur 的论文,它是基于此的。Df

库通常会为您处理这些算法细节,通常,Newton-Raphson 算法(或其变体)的库实现会很好地收敛,但每隔一段时间,就会出现由于缺点而导致一些麻烦的问题多于。在标量情况下,我会使用Brent 方法,因为它在实践中具有鲁棒性和良好的收敛速度。(n=1)

在 1 维情况下,我想到了与您所描述的类似的三种主要方法。

割线法使用导数近似

f(xn)f(xn)f(xn1)xnxn1

计算下一次迭代。正如André Nicolas指出的那样,割线方法因其快速收敛和快速评估而非常受欢迎,尤其是在评估更多函数(可能非常慢时)。f(xn)f(xn+ϵ)

Steffensen 方法是另一种使用导数近似的方法。它在每次迭代中为计算以逼近导数。由于是预期的(即根是接近的),这种导数近似的准确性随着接近根而提高,导致与牛顿方法相同的渐近速度(考虑或不考虑每个函数的多个函数评估)迭代)。f(xn+ϵ)ϵ=f(xn)f(xn)0

割线法的更强大的扩展是已知的。Sidi 的方法基于以下前提提供了割线法的推广:

的线的斜率来近似我们可以(或直到次多项式)的导数来扩展它.f(xn)xnxn1f(xn)kxnxn1xn2xnk

这些方法恢复了牛顿方法的更多渐近速度,同时仍然忠实于割线方法的优点,每次迭代不需要额外的函数评估。


总体而言,主要缺点是每次迭代的速度降低。这些方法是否比牛顿法更快完全取决于如何提供导数的性质。如果导数比本身更容易评估,则牛顿法可能更可取。否则,牛顿法可能比上述方法慢很多。f

例如,考虑使用牛顿法求解微分方程的根。在这种情况下,可以很容易地看出,这使得牛顿法非常适合这个问题。y˙=g(t)yy/y˙=1/g(t)

然而,在大多数问题中,我倾向于发现未提供导数。因为在最坏的情况下,导数近似类型的方法只是比牛顿法慢的一个常数因子,例如割线法比牛顿法慢大约 50%,我更喜欢这些方法。