1.实验目的
1、掌握计算机上常用的一些求非线性方程的近似根的数值方法(对分区间法、迭代法、牛顿法、弦位法),并能比较各种方法的异同点;
2、掌握迭代的收敛性定理;
3、正确应用所学方法求出给定的非线性方程满足一定精度要求的数值解。
2.实验环境
win11、DEV-C++
3.实验内容
编写程序,用牛顿法求方程在1.5附近的根,
方案1:使用牛顿法并取x0=1.5,迭代十次。
方案2:取x0=0,使用同样的公式,迭代十次,观察比较并分析原因。
4.基本思想
牛顿迭代法是用数值的方法来求解非线性方程组的根或其极大极小值,基本思想是:对于非线性函数f(x),根据泰勒公式得到x附近某个点展开的多项式可用来近似函数f(x)的值,该多项式对应的函数为F(x),求得F(x)的极小值作为新的迭代点,然后继续在新的迭代点泰勒公式展开,直到求得的极小值满足一定的精度。
5.流程图
6.代码
#include<iostream> #include<cmath> using namespace std; double f(double x); //f(x)为需要求解方程的对应函数 double f1(double x); //f1(x)为f(x)的一阶导数 int main(void) { double N; //N为最大迭代次数; double x0, x1; //x0为运用牛顿法时选取的初值;x1为迭代初值的下一次迭代值 int count; //count为当前迭代次数 cout << "请输入迭代初值:"; cin >> x0; cout << "请输入最大迭代次数:"; cin >> N; count = 0; do { count++; //迭代次数自增1 if (count > N) { break; } else { x1 = x0 - f(x0) / f1(x0); cout << "第" << count << "次迭代,方程的近似根为:" << x1 << endl; //交换x0与1的值,便于进行下一次迭代 double temp; temp = x1; x1 = x0; x0 = temp; } } while (1); cout << "达到计算精度使f(x)=0的解为: " << x0 << endl; return 0; } double f(double x) //原函数 { double result = x*x*x-x-1; return result; } double f1(double x) //导函数 { double result = 3*x*x-1; return result;
7.结果及分析
当初值为0时,大约要迭代22次后,才能把最终值确定选来,而初值为1.5的时候在五六次的时候就可以确定结果了;此次实验要求迭代次数为10次,所以初值为零时并没有得到最后的结果。
2.参考资料
参考并修改部分代码。
版权声明:本文为CSDN博主「Spring-_-Bear」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51008866/article/details/115869059
计算方法引论(第四版)