我正在尝试使用SciPy(scipy.optimize.newton)提供的Newton-Raphson找到方程的根。
目前我没有文档建议使用的fprime
值,据我所知,这意味着正在使用Secant方法来查找根。
由于Newton-Raphson方法比Secant方法具有更快的收敛性,我的直觉认为我应该数字地近似fprime
并提供它以便使用牛顿方法。
哪一个通常会导致更快的收敛/更快的实际计算我的根?
scipy.optimize.newton
而不提供fprime
(即正割方法,或fprime
(例如使用numpy.diff)并将其提供给scipy.optimize.newton
,以便使用Newton-Raphson方法。第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节的割线方法支配。
(这是为了适应这个网站的限制而编辑的。)选择另一种方法来提高数字导数的准确性会增加函数评估的数量,从而进一步降低收敛的顺序。因此,您应该选择第一种方法,最后使用割线方法查找根。