当前位置:首页|资讯

牛顿迭代法(Newton-Raphson method)及其代码实现

作者:星野みや发布时间:2024-09-15

引入

我们在数学必修1学过求一个方程式解的近似值的方法,先来回顾一下。

首先我们使用介值定理(Intermediate value theorem)确定解所在的大致区间,然后使用二分法逼近。这个方法与算法中的二分查找(Binary search)是一样的思路,但在对精度要求较高时所用的步数比较多,逼近的速度比较慢。

那么问题的关键就在于我们如何取值来缩小区间,从而逼近解。

牛顿迭代法(Newton-Raphson method)

牛顿迭代法是一种数值分析方法,用于寻找函数的零点。核心在于通过取函数图像上一点处的切线的横截距,再于此处进行同样的操作,不断迭代从而逼近零点,所以也叫牛顿切线法。

f(x)的零点所在的区间,并且保证此区间内其导函数f'(x)%5Cneq0,也就是没有驻点。

x_0作为初始猜测值(Initial guess),我们可以求出此处的切线方程式:

y-f%5Cleft%20(%20x_0%20%5Cright%20)%20%3Df'%5Cleft%20(%20x_0%20%5Cright%20)%20%5Cleft%20(%20x-x_0%20%5Cright%20)%20

x_1就是切线的横截距,带入y%3D0可以得到

x_1%3Dx_0-%5Cfrac%7Bf%5Cleft(x_%7B0%7D%5Cright)%7D%7Bf'%5Cleft(x_%7B0%7D%5Cright)%7D

x%3Dx_1处的切线,得到下一个值。按照这样的规则不断进行迭代。

%5C%7Bx_n%5C%7D,并且能够知道:

  1. x_n%3Dx_%7Bn-1%7D-%5Cfrac%7Bf%5Cleft(x_%7Bn-1%7D%5Cright)%7D%7Bf'%5Cleft(x_%7Bn-1%7D%5Cright)%7D

  2. %5Clim_%7Bn%5Cto%5Cinfty%7Dx_n%3Dxx为零点的精确值

第一条就是这种方法的核心,称为牛顿迭代公式(Newton's Raphson Iterative Formula)。与其他方法相比,其逼近速度会更快,尤其是在近似的精度较高时尤为明显。

例题(Example)

Find the root of the function f(x)%3Dx%5E3%2Bx-1 obtained after the first iteration on application of Newton-Raphson scheme using an initial guess of x_0%3D1.

%5Cbegin%7Balign%7D%0Af'(x)%20%26%20%3D%203x%5E2%2B1%5C%5C%0Ax_1%20%26%20%3D%20x_0-%5Cfrac%7Bf%5Cleft(x_%7B0%7D%5Cright)%7D%7Bf'%5Cleft(x_%7B0%7D%5Cright)%7D%5C%5C%20%0A%26%20%3D%201-%5Cfrac%7Bf%5Cleft(1%5Cright)%7D%7Bf'%5Cleft(1%5Cright)%7D%5C%5C%20%0A%26%20%3D%201-%5Cfrac%7B1%7D%7B4%7D%5C%5C%20%0A%26%20%3D%200.75%0A%5Cend%7Balign%7D

Given that x%5E3%2B2x-2%3D0 has a root in (0%2C1),  Find  the root rounded to 2 decimal places using Newton-Raphson method.

%5Cbegin%7Balign%7D%0Af'(x)%20%26%20%3D%203x%5E2%2B2%5C%5C%0Ax_1%20%26%20%3D%20x_0-%5Cfrac%7Bf%5Cleft(x_%7B0%7D%5Cright)%7D%7Bf'%5Cleft(x_%7B0%7D%5Cright)%7D%5C%5C%20%26%20%3D%201-%5Cfrac%7Bf%5Cleft(1%5Cright)%7D%7Bf'%5Cleft(1%5Cright)%7D%5C%5C%20%26%20%3D%201-%5Cfrac%7B1%7D%7B5%7D%5C%5C%20%26%20%3D%200.8%5C%5C%0Ax_2%20%26%20%3D%20x_1-%5Cfrac%7Bf%5Cleft(x_%7B1%7D%5Cright)%7D%7Bf'%5Cleft(x_%7B1%7D%5Cright)%7D%5C%5C%20%26%20%3D%200.8-%5Cfrac%7Bf%5Cleft(0.8%5Cright)%7D%7Bf'%5Cleft(0.8%5Cright)%7D%5C%5C%20%26%20%3D%200.8-%5Cfrac%7B0.112%7D%7B3.92%7D%5C%5C%20%26%20%3D%200.8-%5Cfrac%7B1%7D%7B35%7D%5C%5C%20%26%20%3D%20%5Cfrac%7B27%7D%7B35%7D%5C%5C%0A%26%5Capprox0.7714%5C%5C%0Ax_3%20%26%20%3D%20x_2-%5Cfrac%7Bf%5Cleft(x_%7B2%7D%5Cright)%7D%7Bf'%5Cleft(x_%7B2%7D%5Cright)%7D%5C%5C%20%26%20%3D%20%5Cfrac%7B27%7D%7B35%7D-%5Cfrac%7Bf%5Cleft(%5Cfrac%7B27%7D%7B35%7D%5Cright)%7D%7Bf'%5Cleft(%5Cfrac%7B27%7D%7B35%7D%5Cright)%7D%5C%5C%0A%26%5Capprox0.7709%5C%5C%0A%26%5Cbecause%5Cleft%7Cx_3-x_2%5Cright%7C%3C0.01%5C%5C%0A%26%5Ctherefore%20x%5Capprox0.77%0A%5Cend%7Balign%7D

代码实现(code implementation)

既然这个过程是迭代,那么就很容易通过编程来实现。实际上,许多能够求解方程式的计算器用的就是这个方法。

我们可以看到,麻烦的部分在于带入求出数值,那么我们完全可以把这一过程交给计算器,让进行这样过程。

下面是使用Python代码的实现效果,不同在于我们要自己先求出导函数。我们当然也可以直接使用第三方库来求解。

第一题:

Output:

第二题:

Output:

x_0%3D0.5作为初始猜测值,只是所需要的步数不同而已。这里我们考虑到了异常的情况,也通过限制迭代次数来让我们能够看出我们最初的猜测是否合适。

总结(Summary)

虽说这是大学里数值分析的内容,实际上所用到的知识都是高中的,也经常出现在一些模考题中。

实际上,我们在解决物理问题时通常只需要得到方程式的一个近似的数值解,并且可以根据需要的精度容易地调整求解过程。而牛顿迭代法的核心就只有一个简单的公式,只涉及函数本身以及其导函数,并且能够通过较少的步数得到精度更高的值。这个算法最常用的就是快速求平方根了。

更多(More)

x%3DF(x)的形式,得到迭代公式x_n%3DF%5Cleft%20(%20x_%7Bn-1%7D%20%5Cright%20)%20。比如第二题我们可以得到

x%5E3%2B2x-2%3D0%5CRightarrow%20x%3D1-%5Cfrac%7Bx%5E3%7D%7B2%7D

从而得到迭代公式

x_n%3D1-%5Cfrac%7Bx_%7Bn-1%7D%5E3%7D%7B2%7D

虽然这看起来更加简单,但是其逼近速度比较慢,也并非所有方程式都容易化成这种形式。

那么,大家可以试着解决下面的问题,利用计算器或编程比较一下切线迭代与其他方法的逼近速度。

Given that f(x)%3D%5Cmathrm%7Be%7D%5Ex-x%5E3%2B2

  1. Show that the equation f(x)%3D0  has a root near to x%3D4.5.

  2. Find the root to 3 significant figures.



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1