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