Scipy:带有数值导数的牛顿法是否比割线法更快

时间:2019-03-09 15:45:15

标签: python numpy scipy numerical-methods newtons-method

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

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

由于Newton-Raphson方法的收敛速度比Secant方法快,因此我的直觉认为也许我应该在数值上近似fprime,并提供它以便使用Newton方法。

一般情况下,哪个会导致我的根更快的收敛/更快的实际计算?

  1. 仅使用scipy.optimize.newton而不提供fprime(即割线方法,或
  2. 使用数值微分来计算fprime(例如,使用numpy.diff)并将其提供给scipy.optimize.newton,以便使用Newton-Raphson方法。

1 个答案:

答案 0 :(得分:3)

第365页的“ 数字食谱C ”第二版中的“ 9.4使用导数的牛顿-拉夫森方法”一节指出:

  

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

     

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

     

但是,对于以下情况,不建议这样做   原因:(i)您正在每步执行两次功能评估,因此   最好,收敛的超线性阶仅为 sqrt(2)。 (ii)   如果您将 dx 设置得太小,则会被四舍五入所淘汰,而如果   太大了,收敛的阶数只会是线性的,   没有比对所有对象都使用初始评估 f'(x_0)好   后续步骤。因此,牛顿-拉夫森具有数值导数   (在一维中)始终由section的割线方法主导   9.2。

(进行编辑以适合该站点的限制。)选择另一种方法来提高数值导数的准确性将增加函数求值的次数,从而进一步降低收敛的次数。因此,您应该选择第一种方法,最后使用割线方法找到根。