2022年非线性方程迭代解法实验报告 .pdf
深 圳 大 学 实 验 报 告课程名称:计算方法实验项目名称:非线性方程迭代解法学院:计算机与软件学院专业、班级:09 计算机科学与技术05 班名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 10 页 -教务处制实验目的:通过本设计性实验,加深多种非线性方程求根基本原理的理解,掌握并实现弦截迭代法、Newton 迭代法、Newton 下山法等算法,培养学生上机操作和实际动手的能力,培养学生分析问题、应用理论知识解决实际问题的能力,使学生逐渐掌握数值算法的设计、分析和应用的综合能力。要求学生利用极值理论和对分搜索技术,对非线性方程进行分析,设计算法完成根区间隔离,然后实现单根区间上的迭代算法求解方程。实验内容:1 实验题目求非线性方程x5-3x3+x-1=0 在区间-8,8上的全部实根;(1).试分别用:Newton 法;弦截法(割线法);简化 Newton 法;Newton下山法;求方程在指定区间上的全部实根.准确到 8 位有效数字。(2).在(1).的基础上讨论迭代法的加速(选作)2实验内容(1)对以上非线性方程,分析、设计算法,确定有根区间,进行根的隔离;(2)在选取的单根区间内,编程实现用不同方法,分别求根;(编写通用过程或函数);(3)对所用算法的收敛阶、局部收敛性、优缺点和精度等作分析及比较.并附运算结果的截图(可用Excel 图表或其他绘图软件工具对实验结果分析);(4)以实验报告的形式提交总结;(5)学生在完成本实验后,提交实验报告、程序源代码、程序可执行文件以及程序使用说明等压缩文档。一、开发环境PC机一台 PC微机Windows 操作系统Microsoft Visual Studio 8.0 集成开发环境二、模型建立(或算法简述)1.首先是求函数的根区间:求根区间采用割分小区间的方法,然后求每个区间点的函数值,当fx(x1)*fx(x2)0 时,方程在名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 10 页 -此区间必定有一个函数。在求区间点的函数时,如果有fx(x)=0的情况,那么这个点就是方程的解,可以直接就求出方程的根了。当根的区间全部求出来后,(x1+x2)/2 作为初始值来求解方程。2.牛顿迭代解法:FXk+1=Xk-F(X)/F(x)。将初始值代入方程,看条件|FXk+1-FXk|e,如果成立,则停止运算,输出结果。3.牛顿简化迭代:用 F(X0)代替 F(Xk),运算时不必每次都求道数值。4.弦割法:5.下山法:求下山因子时,根据条件,。三、模型求解 3.1 程序设计(方案)说明根据上面模型,设计了四个函数:1.是求根区间函数,求得的根区间和根,用一个数组记录下来,设计两个记录变量来记录根和跟区间个数。2.是求方程数值函数,求根区间和求解都要用到。3.是求导数值函数,当用牛顿迭代时用到。4.是求下山因子函数,当用下山法时用到。3.2 源代码(关键代码要有注释))()(01xfxfxxkkk)()()()(111kkkkkkkxxxfxfxfxx)()(1kkkkxfxfxx1|()|()|kkf xf x的选取方式的顺序,按322121211成立为止直到|)(|)(|1kkxfxf名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 10 页 -非线性方程迭代解法的程序代码:#includestdio.h#includestdlib.h#includestdafx.h#includemath.h#define N 10 int rt=0;/设置根区间个数全局变量int egg=0;/设置求根区间时直接得到的根的个数全局变量int k=0;/根个数double axN;/求得结果double cN;/记录根区间和根double er=0.00000001;/精确度double aN=-1,1,0,-3,0,1;/方程为 x5-3x3+x-1=0;double getfx(double x)/求数值函数 double fx;fx=a5*x*x*x*x*x+a3*x*x*x+a1*x+a0;return fx;double getfxl(double bN,double x)/求导数值函数 double fxl;fxl=b4*x*x*x*x+b2*x*x+b0;return fxl;void root(double q1,double q2)/求根区间 double fx,fx0;fx0=0;double m0,m1;double x;double d;int i,j,l;d=(q2-q1)/160;for(i=0,j=9,l=0;i161;i+)m1=q1+d*i;x=m1;fx=getfx(x);if(fx=0)/直接求得根 cj=m1;/记录根名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 10 页 -j-;egg=egg+1;if(fx*fx00)/是否满足有根条件 cl=m0;cl+1=m1;/记录有根区间 rt+;/记录个数l=l+2;m0=m1;fx0=fx;/保留上一次的值 cN;double getyz(int i)/求下山因子函数 int j;double x1,x2;x2=1;x1=0.5;for(j=1;ji;j+)x2=x2*x1;return x2;void main()double bN;double dN;double x0,x1,x2,xj;int i,j,l,h;for(i=0,j=1;i0;i-,j-)axk=cj;printf(ax%d=%lfn,k+1,axk);/输出根k+;/记录根个数 if(rt)/是否求得所有根区间 printf(求得了%d 个根区间,分别为:n,rt);for(i=0;i0;i-,l+)x1=(d2*l+d2*l+1)/2;/求初始值/x0=x1;xj=getfxl(b,x0);/牛顿简化x0=x1;x1=x0+0.1;/弦割for(j=0;jfabs(getfx(x1);h+)x2=x1-getfx(x1)/getfxl(b,x1)*getyz(h);if(fabs(x2-x1)er)break;x0=x1;/弦割x1=x2;名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 10 页 -axk=x2;/printf(用%d 次牛顿迭代求得一个根,值为:n,j);/迭代次数/printf(用%d 次牛顿简化迭代求得一个根,值为:n,j);/牛顿简化/sprintf(用%d 次弦割迭代求得一个根,值为:n,j);/弦割printf(用%d 次下山迭代求得一个根,值为:n,j);/下山printf(ax%d=%.9lfn,k+1,axk);/输出根k+;/记录根个数 getchar();getchar();3.3 模型的解(含运行结果截图)图 1:牛顿迭代图 1:简化牛顿迭代名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 10 页 -图 3:弦割法图 4:下山法名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 10 页 -3.4 结果分析用牛顿迭代解法的收敛速度最快,求解的时候分别只用4 次和 3 指导教师批阅意见:成绩评定:名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 10 页 -指导教师签字:年月日备注:名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 10 页 -