我正在尝试使用SciPy(scipy.optimize.newton)提供的Newton-Raphson查找方程的根。
目前,我没有文档建议使用的fprime
值,据我所知,这意味着正在使用Secant方法查找根。
由于Newton-Raphson方法的收敛速度比Secant方法快,因此我的直觉认为也许我应该在数值上近似fprime
,并提供它以便使用Newton方法。
一般情况下,哪个会导致我的根更快的收敛/更快的实际计算?
scipy.optimize.newton
而不提供fprime
(即割线方法,或fprime
(例如,使用numpy.diff)并将其提供给scipy.optimize.newton
,以便使用Newton-Raphson方法。答案 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。
(进行编辑以适合该站点的限制。)选择另一种方法来提高数值导数的准确性将增加函数求值的次数,从而进一步降低收敛的次数。因此,您应该选择第一种方法,最后使用割线方法找到根。