C语言实现牛顿迭代法(附带源码)
创作时间:
作者:
@小白创作中心
C语言实现牛顿迭代法(附带源码)
引用
CSDN
1.
https://blog.csdn.net/m0_61840987/article/details/144852580
牛顿迭代法(Newton's Method),也叫牛顿-拉夫森法,是一种求解实数函数零点的迭代方法。牛顿迭代法常用于非线性方程的数值求解。它通过不断迭代来逼近函数的根,即使得 f(x)=0。给定一个初始猜测 x_0,牛顿迭代法通过以下公式进行迭代:
其中,f(x_n) 是目标函数,f'(x_n) 是目标函数的导数。
实现思路
- 目标函数:
- 我们需要定义目标函数 f(x),以及该函数的导数 f′(x),这两者是牛顿迭代法的核心。
- 迭代过程:
- 选择一个初始猜测值 x_0 。
- 通过牛顿迭代公式更新猜测值,直到猜测值的变化小于某个阈值(即满足精度要求)。
- 停止条件:
- 迭代次数达到设定的最大次数,或者当前估计值与上一次估计值的差值小于设定的精度阈值。
- 注意事项:
- 如果 f'(x_n) 接近零,可能会导致数值不稳定,因此在实现时需要检查此情况。
- 对于不同的方程,初始猜测值的选择可能会影响收敛速度和结果的准确性。
C语言代码实现
以下是牛顿迭代法的C语言实现:
#include <stdio.h>
#include <math.h>
// 定义目标函数 f(x) 和导数 f'(x)
double f(double x) {
return x * x - 2; // 例:f(x) = x^2 - 2
}
double f_prime(double x) {
return 2 * x; // f'(x) = 2x
}
// 牛顿迭代法函数
double newton_method(double initial_guess, double tolerance, int max_iterations) {
double x0 = initial_guess;
double x1;
int iteration = 0;
while (iteration < max_iterations) {
double fx = f(x0);
double fpx = f_prime(x0);
if (fpx == 0) {
printf("Error: Derivative is zero, cannot continue iteration.\n");
return x0; // 避免除以零
}
// 更新迭代值
x1 = x0 - fx / fpx;
// 检查是否收敛
if (fabs(x1 - x0) < tolerance) {
printf("Converged after %d iterations.\n", iteration + 1);
return x1;
}
// 更新x0并继续迭代
x0 = x1;
iteration++;
}
printf("Max iterations reached.\n");
return x1;
}
int main() {
double initial_guess, tolerance;
int max_iterations;
// 用户输入初始猜测值、精度和最大迭代次数
printf("Enter the initial guess: ");
scanf("%lf", &initial_guess);
printf("Enter the tolerance: ");
scanf("%lf", &tolerance);
printf("Enter the maximum number of iterations: ");
scanf("%d", &max_iterations);
// 调用牛顿迭代法函数
double root = newton_method(initial_guess, tolerance, max_iterations);
// 输出结果
printf("Approximate root: %lf\n", root);
return 0;
}
代码解释
- f 和 f_prime 函数:
- f:目标函数,这里我们假设 f(x) = x^2 - 2,即要求解 x^2 - 2 = 0 的根。
- f_prime:目标函数的导数,这里 f′(x)=2x。
- newton_method 函数:
- 该函数接受初始猜测值、精度(容忍度)和最大迭代次数作为参数,并返回通过牛顿迭代法求得的近似根。
- 在每次迭代中,我们计算目标函数和导数的值,然后根据牛顿迭代公式更新当前的根估计值。
- 如果导数 f′(x) 等于零,则输出错误提示,避免除零错误。
- 如果两次迭代的结果差值小于容忍度,则认为已经收敛,返回结果。
- main 函数:
- 获取用户输入的初始猜测、容忍度和最大迭代次数,调用 newton_method 函数计算根,并输出结果。
示例输入输出
示例输入 1
Enter the initial guess: 1.0
Enter the tolerance: 1e-6
Enter the maximum number of iterations: 100
示例输出 1
Converged after 5 iterations.
Approximate root: 1.414214
总结
本项目实现了一个基于牛顿迭代法的求根算法。通过设定初始猜测、容忍度和最大迭代次数,我们可以用牛顿法计算给定方程的近似根。我们选择了 f(x) = x^2 - 2 作为示例,这个方程的根是 根号二 ,牛顿法能够有效地逼近这个值。
在实际应用中,牛顿法由于其快速收敛的特点,广泛应用于数值分析、优化算法等领域。然而,它也有一些局限性,如可能收敛到局部极值点或不收敛,因此在使用时需要谨慎选择初始值,并确保导数不为零。
热门推荐
美国癌症治疗:美国癌症医院排名
《我的世界》红石电梯建造方法详解 一步步打造你的高空出入口
心灵疗愈是什麼?5个自我疗愈方法,重获身心灵平衡和宁静!
胃肠道的幽灵杀手——幽门螺杆菌(HP)
私人飞机安全管理:你真的了解吗?
元旦打卡福州“两金”步道:百福桥上的新年好运
深圳地铁带你穿越古今:南头古城&大鹏所城探秘
深圳地铁带你打卡香蜜公园和莲花山公园
企业决策流程:从问题识别到方案实施的系统化指南
公司变更名称麻烦吗?公司变更名称的流程是什么?有哪些注意事项?一文详解!
福州平潭岛四日游:小众打卡地大揭秘!
福州和平潭岛自驾游攻略:打卡三坊七巷和平潭岛
平潭岛:南岛语族起源地与闽南文化明珠
平潭岛最美环岛路打卡攻略:日落、风车与黑沙滩的浪漫邂逅
沈阳老年人福利政策全攻略:津贴申领、助餐服务、适老化改造一文详解
《雷霆特攻队》:漫威新篇章的反派英雄集结,从阴影中崛起的全新英雄故事
漫威《复联5》改名背后:如何实现从"征服者康"到"毁灭博士"的剧情反转?
考驾照的流程是什么
上班族考驾照攻略:如何平衡工作与学习?
《当代人生》游戏驾照考试攻略:理论+实操全解析
选择合适驾校的综合指南:提升驾驶技能与顺利拿证的关键因素
夏季吃苦瓜,降糖又减肥!
二手飞机市场迎来爆发期,年均千架飞机退役催生千亿市场
《中国谜语大会》开播,带你玩转元宵灯谜
元旦趣味谜语大集合,笑翻你的假期
冬至趣味谜语大挑战:猜谜赢好礼!
番茄酸菜鱼教学:步骤简单易懂
四川泡菜制作方法和营养价值
深度水解奶粉、氨基酸奶粉、无乳糖奶粉的区别是什么?
BJ40环塔冠军版&岚图FREE:雪地模式大比拼!