假设我有一些功能我想找到这样. 我可能会使用 Newton-Raphson 方法。但这需要我知道导函数. 的解析表达式可能不可用。例如,可以通过查阅实验值数据库的一段复杂的计算机代码来定义。
但即使很复杂,我可以近似对于任何特定的通过选择一个小数字和计算.
我听说这种方法有明显的缺点,但我不知道它们是什么。维基百科暗示“使用这种近似会导致类似于割线法的结果,其收敛速度比牛顿法慢。”
有人可以详细说明这一点,并提供特别讨论该技术问题的参考吗?
假设我有一些功能我想找到这样. 我可能会使用 Newton-Raphson 方法。但这需要我知道导函数. 的解析表达式可能不可用。例如,可以通过查阅实验值数据库的一段复杂的计算机代码来定义。
但即使很复杂,我可以近似对于任何特定的通过选择一个小数字和计算.
我听说这种方法有明显的缺点,但我不知道它们是什么。维基百科暗示“使用这种近似会导致类似于割线法的结果,其收敛速度比牛顿法慢。”
有人可以详细说明这一点,并提供特别讨论该技术问题的参考吗?
为了记号,我们假设(即,它是一个向量值函数,将向量作为输入并输出相同大小的向量)。有两个问题:计算成本和数值精度。
计算导数(雅可比矩阵,, 或者, 或任何你喜欢的) 使用有限差分将需要功能评价。如果您可以直接从定义中使用浮点算术计算导数,则必须计算差商
对于每个,假设你不做任何类型的“智能有限差分”(如 Curtis-Powell-Reid),因为你知道(或可以检测到) . 如果很大,那可能是很多函数评估。如果您有的解析表达式,那么计算它可能会更便宜。在某些情况下,也可以使用自动(也称为算法)微分方法以大约 3 到 5 倍的函数评估成本
还有数字方面的问题。显然,在计算机上,当标量变为零时,我们不能取其极限,所以当我们逼近时,我们实际上选择为“小”并计算
其中表示它是一个近似值,我们希望它是一个非常好的近似值。在浮点算术中计算这个近似值是很困难的,因为如果你选择太大,你的近似值可能会很糟糕,但是如果你选择的太小,可能会有很大的舍入误差。这些影响在Wikipedia 关于数值微分的文章中有所介绍;可以在文章中找到更详细的参考资料。
如果雅可比矩阵中的误差不是太大,Newton-Raphson 迭代将收敛。有关详细的理论分析,请参阅Nick Higham的《数值算法的准确性和稳定性》第 25 章,或Françoise Tisseur 的论文,它是基于此的。
库通常会为您处理这些算法细节,通常,Newton-Raphson 算法(或其变体)的库实现会很好地收敛,但每隔一段时间,就会出现由于缺点而导致一些麻烦的问题多于。在标量情况下,我会使用Brent 方法,因为它在实践中具有鲁棒性和良好的收敛速度。
在 1 维情况下,我想到了与您所描述的类似的三种主要方法。
割线法使用导数近似
计算下一次迭代。正如André Nicolas指出的那样,割线方法因其快速收敛和快速评估而非常受欢迎,尤其是在评估更多函数(或可能非常慢时)。
Steffensen 方法是另一种使用导数近似的方法。它在每次迭代中为计算以逼近导数。由于是预期的(即根是接近的),这种导数近似的准确性随着接近根而提高,导致与牛顿方法相同的渐近速度(考虑或不考虑每个函数的多个函数评估)迭代)。
割线法的更强大的扩展是已知的。Sidi 的方法基于以下前提提供了割线法的推广:
和的线的斜率来近似。我们可以、和(或直到)次多项式)的导数来扩展它.
这些方法恢复了牛顿方法的更多渐近速度,同时仍然忠实于割线方法的优点,每次迭代不需要额外的函数评估。
总体而言,主要缺点是每次迭代的速度降低。这些方法是否比牛顿法更快完全取决于如何提供导数的性质。如果导数比本身更容易评估,则牛顿法可能更可取。否则,牛顿法可能比上述方法慢很多。
例如,考虑使用牛顿法求解微分方程的根。在这种情况下,可以很容易地看出,这使得牛顿法非常适合这个问题。
然而,在大多数问题中,我倾向于发现未提供导数。因为在最坏的情况下,导数近似类型的方法只是比牛顿法慢的一个常数因子,例如割线法比牛顿法慢大约 50%,我更喜欢这些方法。