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

牛顿迭代法求方程近似解

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

牛顿迭代法求方程近似解

引用
CSDN
1.
https://blog.csdn.net/m0_46190471/article/details/145198666

牛顿迭代法(Newton's Method),又称牛顿-拉夫森方法(Newton-Raphson Method),是一种用于求解实数或复数函数零点(根)的数值分析方法。该方法通过不断迭代逼近方程的解,通常收敛非常迅速,特别是当初始猜测值接近真实解时。

牛顿迭代法的基本思想是利用函数的泰勒展开式的线性近似来不断逼近零点。

假设有一个函数f(x),要找到f(x) = 0的x值。

如果x_n是当前的近似值,那么牛顿迭代法给出的下一步近似值x_{n+1}则可以通过以下公式计算:

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

其中,f(x_n)是函数f(x)在x_n处的值,f'(x_n)是函数f(x)在x_n处的导数值。

从几何意义上讲,就是在点(x_n, f(x_n))处做切线,该切线与x轴的交点就是下一个近似值x_{n+1}。

以函数f(x) = -\frac{1}{4}x^2 + 2x + 6为例,假设初始猜测值x_n = 0:

与x轴的交点为(-3, 0),因此x_{n+1} = -3。

接下来在点(x_{n+1}, f(x_{n+1}))处继续做切线:

不断迭代,切线与x轴的交点会无限逼近函数的零点。

切线的斜率f'(x_n)可以通过以下公式计算:

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

将这个表达式代入牛顿迭代公式中,可以得到:

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

接下来,我们通过两个具体的编程示例来展示牛顿迭代法的应用。

使用牛顿迭代法计算立方根

下面是一个使用C语言实现的牛顿迭代法计算立方根的算法,保留小数点后一位:

#include <stdio.h>

// 牛顿迭代法计算立方根
double cube_root(double a) {
    if (a == 0) {
        return 0;  // 如果 a 为 0,立方根是 0
    }
    double x = a / 3.0;  // 初始猜测
    double epsilon = 0.0001;  // 精度阈值
    double difference;
    // 不断迭代直到结果足够精确
    do {
        double x_next = (2 * x + a / (x * x)) / 3.0;
        difference = (x_next > x) ? (x_next - x) : (x - x_next);  // 计算误差
        x = x_next;
    } while (difference > epsilon);
    return x;
}

int main() {
    double a;
    scanf("%lf", &a);
    printf("%.1f", cube_root(a));
    return 0;
}

使用牛顿迭代法计算平方根

下面是一个使用C语言实现的牛顿迭代法计算平方根的算法,同样保留小数点后一位:

#include <stdio.h>

// 牛顿迭代法计算平方根
double square_root(double a) {
    if (a < 0) {
        printf("负数没有实数平方根\n");
        return -1;  // 返回 -1 表示错误,负数没有实数平方根
    }
    if (a == 0) {
        return 0;
    }
    double x = a / 2.0;  // 初始猜测值
    double epsilon = 0.000001;  // 精度阈值
    double difference;
    // 不断迭代直到结果足够精确
    do {
        double x_next = (x + a / x) / 2.0;  // 牛顿迭代公式
        difference = (x_next > x) ? (x_next - x) : (x - x_next);  // 计算误差
        x = x_next;  // 更新 x 为新的估计值
    } while (difference > epsilon);  // 如果误差大于 epsilon,继续迭代
    return x;  // 返回最终的平方根估计值
}

int main() {
    double number;
    scanf("%lf", &number);
    double result = square_root(number);
    
    if (result != -1) {
        // 输出结果,保留一位小数
        printf("平方根是:%.1f\n", result);
    }
    return 0;
}

通过这两个示例,我们可以看到牛顿迭代法在实际编程中的应用,以及如何通过不断迭代来逼近函数的零点或特定函数的根。

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