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

牛顿迭代法求方程近似解

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

牛顿迭代法求方程近似解

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

牛顿迭代法是一种用于求解实数或复数函数零点(根)的数值分析方法。该方法通过不断迭代逼近方程的解,通常收敛非常迅速,特别是当初始猜测值接近真实解时。本文将详细介绍牛顿迭代法的基本原理及其在求解方程近似解中的应用,并通过具体的C语言代码示例展示其实际应用。

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

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

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

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

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\dfrac{f(x_n)}{f^{\prime}(x_n)}xn+1 =xn −f′(xn )f(xn )

其中,f ( x n ) f(x_n)f(xn )是 函数f ( x ) f(x)f(x)在x n x_nxn 处的值。

f ′ ( x n ) f^{\prime}(x_n)f′(xn )是 函数f ( x ) f(x)f(x)在x n x_nxn 处的导数值。

几何意义:( x n , f ( x n ) ) (x_n, f(x_n))(xn ,f(xn ))点做切线,与x xx轴的交点则为下一个近似值x n + 1 x_{n+1}xn+1 。

f ( x ) = − 1 4 x 2 + 2 x + 6 f(x) = -\frac{1}{4}x^{2}+2x+6f(x)=−41 x2+2x+6, 假设x n = 0 x_n=0xn =0,做切线:

与x xx轴交点( − 3 , 0 ) (-3, 0)(−3,0),x n + 1 = − 3 x_{n+1}=-3xn+1 =−3。

( x n + 1 , f ( x n + 1 ) ) (x_{n+1},f(x_{n+1}))(xn+1 ,f(xn+1 ))点做切线:

不断迭代,切线与x xx轴交点无线逼近零点。

切线斜率f ′ ( x n ) = f ( x n ) x n − x n + 1 f^{\prime}(x_n)=\dfrac{f(x_n)}{x_n-x_{n+1}}f′(xn )=xn −xn+1 f(xn ) .

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\dfrac{f(x_n)}{f^{\prime}(x_n)}xn+1 =xn −f′(xn )f(xn )

C语言计算立方根算法,不使用库函数,牛顿迭代法实现,保留小数点后一位。

f ( x ) = x 3 − a = 0 f(x)=x^3-a=0f(x)=x3−a=0的解。

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1} = x_n-\dfrac{f(x_n)}{f^{\prime}(x_n)}xn+1 =xn −f′(xn )f(xn )

x n + 1 = x n − x n 3 − a 3 x n 2 x_{n+1}=x_n-\dfrac{x_n^3 - a}{3x_n^2 }xn+1 =xn −3xn2 xn3 −a

x n + 1 = 2 x n 3 + a 3 x n 2 = 2 x n + a x n 2 3 x_{n+1}=\dfrac{2x_n^3+a}{3x_n^2}=\dfrac{2x_n+\frac{a}{x_n^2}}{3}xn+1 =3xn2 2xn3 +a =32xn +xn2 a

double x_next = (2 * x + a / (x * x)) / 3.0;

#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;
}

不使用库函数,计算 算术平方根:

#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号