问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

牛顿迭代法原理及其应用

创作时间:
作者:
@小白创作中心

牛顿迭代法原理及其应用

引用
1
来源
1.
https://www.dotcpp.com/course/1084

牛顿迭代法是一种近似求解实数域与复数域方程的数学方法,由牛顿在17世纪提出。该方法通过迭代的方式,利用函数的切线来逼近方程的根,具有收敛速度快、精度高的特点。本文将详细介绍牛顿迭代法的原理、实现步骤以及在编程中的应用。

牛顿迭代法(Newton's method for finding roots)是一种近似求解实数域与复数域方程的数学方法。具体来说,对于在区间[a,b]上连续且单调的函数f(x),牛顿迭代法可以用来求解方程f(x)=0的近似解。

牛顿迭代法的原理

牛顿迭代法的基本思想是:从一个初始点(x0,f(x0))开始,在该点做切线,切线与X轴相交得出下一个迭代点x1的坐标,再在(x1,f(x1))处做切线,依次类推,直到求得满足精度的近似解为止。

为什么需要近似求解?

很多方程可能无法直接求取其解,因此需要使用近似求解方法。牛顿迭代法非常适合计算机编程实现,因此在实际应用中得到了广泛的应用。

数学描述

设函数f(x)在点x处的一阶导数为f'(x),则牛顿迭代法的迭代公式为:

$$
x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}
$$

迭代停止条件

  1. 计算出$x_{n+1}$;
  2. 给出一个初始假定根值$x_0$,利用上面迭代式子进行迭代$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$;
  3. 计算绝对相对迭代近似误差$\epsilon_n = \left|\frac{x_{n+1} - x_n}{x_{n+1}}\right|$;
  4. 将绝对相对近似误差与预定的相对误差容限$\epsilon$进行比较。如果$\epsilon_n > \epsilon$,则迭代步骤2,否则停止算法。另外,检查迭代次数是否已超过允许的最大迭代次数。如果是这样,则需要终止算法并退出。另一个终止条件是:$|f(x_{i+1})| < \epsilon$。

编码实现

由于牛顿迭代法主要目的是解方程,当然也有可能用于某一个数学函数求极值,所以无法写出通用的代码,这里仅仅给出一个编代码的思路。相信掌握了思路,对于各种实际应用应该能很快的写出符合实际应用的代码。

假定一函数为:

$$
f(x) = 2x^2 - 10\cos(x) + x - 80
$$

其波形图如下:

其一阶导数为:

$$
f'(x) = 4x + 10\sin(x) + 1
$$

下面是一个使用C语言实现的牛顿迭代法求解方程根的示例代码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

/*假定待求根函数如下*/
#define F(x) (2*(x)*(x)-10*cos(x)+(x)-80)
/*其一阶导数为*/
#define DF(x) (4*(x)+10*sin(x)+1)

float newton_rooting(float x0, float precision, float min_deltax, int max_iterations) {
    float xn, xn1, fn, fn1, dfn;
    float deltax;
    int step = 0;
    xn = x0;
    xn1 = x0;
    do {
        xn = xn1;
        fn = F(xn);
        dfn = DF(xn);
        /*判0*/
        if (fabs(dfn) < 1e-6) {
            if (fabs(fn) > precision)
                return NAN;
            else
                return fn;
        }
        xn1 = xn - fn / dfn;
        fn1 = F(xn1);
        deltax = fabs(xn1 - xn);
        step++;
        if (step > max_iterations) {
            if (fabs(fn1) < precision)
                return xn;
            else
                return NAN;
        }
    } while (fabs(fn1) > precision || deltax > min_deltax);
    return xn1;
}

void main() {
    float root_guess = 23.0f;
    float precision = 0.00001f;
    float min_deltax = 0.001f;
    float root;
    int step = 7;
    root = newton_rooting(root_guess, precision, min_deltax, step);
    printf("根为: %f, 函数值为:%f\n", root, F(root));
    root_guess = -23;
    root = newton_rooting(root_guess, precision, min_deltax, step);
    printf("根为: %f, 函数值为:%f\n", root, F(root));
}

运行结果:

根为: 6.457232, 函数值为:0.000004
根为: -6.894969, 函数值为:-0.000008

函数值已经很接近于0了,如果还需要更为精确的值,则可以选择在此基础上进一步求解,比如利用二分法逼近。

使用注意事项

  1. 求斜率可能为0,如为0时,则可能找到了函数的极值。
  2. 如果选择的初始猜测根的接近方程f(x)=0中函数f(x)的拐点,Newton-Raphson方法可能开始偏离根。然后,它可能会又收敛回到根。例如:

  1. 如果选择的初值不合适,可能会跳掉一些根,比如:

因此,在实际应用时,需要了解待求解模型的大致情况,并在合理范围内调整参数。

应用场景

牛顿迭代法在工程和科学计算中有着广泛的应用,例如:

  1. 知道某系统的传递函数,待求解其中的参数,可以将上述方法推而广之,求解多维变量方程组,求导就变成求偏导了。
  2. 设计一电路测量某物质的阻抗。
  3. 求一个趋势的极值。
  4. 传递函数参数辨识等。

总结来说,牛顿迭代法在解决实际问题时,利用迭代求方程近似根的数学原理,在工程中有着很好的实用价值。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号