题为c程序设计(第五版) 谭浩强 第5章第14题
牛顿迭代法分析:
牛顿迭代法是一种求解方程的方法,它的基本思想是:如果一个函数在某一点的切线是直线,那么迭代下一次产生的值就是切线与x轴的交点的x坐标(简单来说就是用第一次取的点x做切线,再取切线与x轴的交点x1作为下一个点的横坐标,继续以x1做切线,如此反复,直到最后能够接近所求方程的根。),按照这个思想,我们可以不断迭代,直到收敛到方程的根 ¹。
牛顿迭代法的具体做法如下:
牛顿迭代法可以用于求解非线性方程、多项式方程、三角函数方程等等。它具有收敛速度快、精度高等优点。但是,它也有一些缺点,比如可能会出现发散现象、初值选取不当会导致无法收敛等等。
具体代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
// 定义需要求解的方程
double f(double x) {
return 2 * pow(x, 3) - 4 * pow(x, 2) + 3 * x - 6;
}
// 定义方程的导数
double f_prime(double x) {
return 6 * pow(x, 2) - 8 * x + 3;
}
int main() {
double x0 = 1.5; // 初始值
double x1; // 迭代后的值
double eps = 1e-6; // 精度要求
do {
x1 = x0 - f(x0) / f_prime(x0); // 计算迭代后的值
printf("x = %lf\n", x1); // 输出迭代后的值
if (fabs(x1 - x0) < eps) { // 判断是否满足精度要求
break;
}
x0 = x1; // 更新初始值
} while (1);
return 0;
}
代码分析:
1.通过2个函数存放了原始方程所对应的函数,和原始方程所对应的导数,提高了代码的可读性。
2.后续代码是对牛顿迭代法数学思想和公式的编程表示。
需要注意的是:break虽然放在if中,但是break就是用来跳出最近的一个循环的,千万不要误认为只是跳出了if语句。
运行结果: