Scipy:牛顿方法的数值导数比正割方法更快

问题描述 投票:0回答:1

我正在尝试使用SciPy(scipy.optimize.newton)提供的Newton-Raphson找到方程的根。

目前我没有文档建议使用的fprime值,据我所知,这意味着正在使用Secant方法来查找根。

由于Newton-Raphson方法比Secant方法具有更快的收敛性,我的直觉认为我应该数字地近似fprime并提供它以便使用牛顿方法。

哪一个通常会导致更快的收敛/更快的实际计算我的根?

  1. 只使用scipy.optimize.newton而不提供fprime(即正割方法,或
  2. 使用数值微分来计算fprime(例如使用numpy.diff)并将其提供给scipy.optimize.newton,以便使用Newton-Raphson方法。
python numpy scipy numerical-methods newtons-method
1个回答
3
投票

第365页的“数字配方”一书中的“使用微分的9.4 Newton-Raphson方法”一节中指出:

Newton-Raphson公式也可以使用数值差来逼近真实的局部导数,

f'(x)≈(f(x + dx) - f(x))/ dx。

但是,这不是推荐的过程,原因如下:(i)您每步执行两次函数求值,因此最好超线性收敛阶数仅为sqrt(2)。 (ii)如果你把dx太小,你将被舍入所消除,而如果你把它太大,你的收敛顺序将只是线性的,并不比使用初始评估f'(x_0)用于所有后续步骤更好。因此,具有数值导数的Newton-Raphson(在一个维度上)总是由9.2节的割线方法支配。

(这是为了适应这个网站的限制而编辑的。)选择另一种方法来提高数字导数的准确性会增加函数评估的数量,从而进一步降低收敛的顺序。因此,您应该选择第一种方法,最后使用割线方法查找根。

© www.soinside.com 2019 - 2024. All rights reserved.