为了完成学校计算方法的作业,花了两个多星期将所有实验报告编写出来,看到同桌找代码的辛苦,CSDN也没有这类代码,我只是一时兴起,想分享我写的代码与大家共飨,有错误还请多多指正,代码都不难,也是为了让CSDN帮我保存下,我辛辛苦苦做出来的,倘若能给别人带来一丝一毫的帮助,我都万分荣幸。
限于CSDN插入数学字符非常麻烦,也为了让观看者更好的查看阅读,关于理论我直接插入学校PPT,并尽可能用我理解的语言说明,望理解。
从上述中可以看到就是构建一个方程,然后你放入一个数,产生的结果作为下一个要放入的数。直到你放入一个数,仍然得到这个数,那么这个就成为迭代法收敛。这个方法就成为Picard法
构造如下迭代,当然迭代函数可以任意修改,只需在对应函数代码进行修改
代码实现:
#include<stdio.h> #include<math.h> int main() { double x1,x2,x3;int n; //设置初始参数 printf("请输入迭代初始值:"); //要放入一个初始值,函数像一个机器才能开始运转 scanf("%lf",&x1); printf("请输入迭代次数:"); //设置函数迭代次数,就是设置机器运行次数 scanf("%d",&n); x2=1.0*(pow(x1,3)+4)/3; //在此处修改函数代码,将你的迭代函数在次更换 while(n) { x1=x2; //将你的函数输出结果变为输入数据,进而机器继续运转 x2=1.0*(pow(x1,3)+4)/3; //运转的函数计算 n--; //计数,每运行一次减1,当n变为0时,则函数不在运行 printf("%lf\n",x2); if(x2==x1) //当在规定运行的次数,已经迭代完毕,则终止机器运行。 break; } return 0; }
而关于此函数的种种学习,本篇不进行赘述,但是提醒:要构造符合一定条件的函数,才能收敛,不是所有函数都能迭代出一个值。
牛顿迭代法:
牛顿迭代法也是先构造一个函数,然后自己算出这个函数的导函数,然后放入一个数据,产生的结果作为下一次放入的数据,知道放入的数据和产生的数据一致,则迭代收敛,这个机器就是牛顿迭代法。
代码实现:
#include<stdio.h> #include<math.h> //与上面代码基本一致,只是函数构造不同 int main() { double x1,x2,x3; int n; printf("请输入初始运行值:"); scanf("%lf",&x1); printf("请输入函数运行次数:"); scanf("%d",&n); x2=x1-1.0*(pow(x1,3)-4*x1-3)/(3*x1*x1-4);//在这更换函数 while(n) { x1=x2; x2=x1-1.0*(pow(x1,3)-4*x1+1)/(3*x1*x1-4);//在这更换函数 printf("%lf\n",x2); n--; if(x2==x1) break; } return 0; }
这一篇代码比较简单,只用在函数代码替换处进行函数替换,即可实现代码运行。
这里放上一个问题,供大家思考:
•
构造函数找到牛顿迭代的缺陷(单根,重复根,导数为 0 ,导数趋向无穷)