下载后可任意编辑合工大计算方法试验报告 《计算方法》试验报告 班级: 学号: 姓名: 实验一、牛顿下山法 1 实验目的(1)熟悉非线性方程求根简单迭代法,牛顿迭代及牛顿下山法(2)能编程实现简单迭代法,牛顿迭代及牛顿下山法(3)认识选择迭代格式的重要性(4)对迭代速度建立感性的认识;分析实验结果体会初值对迭代的影响 2 实验内容(1)用牛顿下山法解方程(初值为 0.6)输入:初值,误差限,迭代最大次数,下山最大次数输出:近似根各步下山因子 ( 2 ) 设 方 程 f(x)=x-3x–1=0 有 三 个 实 根 x=1.8793,x=-0.34727,x=-1.53209 现采纳下面六种不同计算格式,求 f(x)=0 的根 x 或 x x=;x=;x=;x=;x=;x=x- 输入:初值,误差限,迭代最大次数输出:近似根、实际迭代次数 3 算法基本原理求非线性方程组的解是科学计算常遇到的问题,有很多实际背景.各种算法层出不穷,其中迭代是主流算法。只有建立有效的迭代格式,迭代数列才可以收敛于所求的根。因此设计算法之前,对于一般迭代进行收敛性的推断是至关重要的。牛顿法也叫切线法,是迭代算法中典型方法,只要初值选取适当,在单根附近,牛顿法收敛速度很快,初值对于牛顿迭代至关重要。当初值选取不当可以采纳牛顿下山算法进行纠正。 一般迭代: 牛顿公式: 牛顿下山公式: 图 3.1 一般迭代算法流程图 下山因子 下山条件 4 1下载后可任意编辑 算法描述一般迭代算法见流程图图 3.2 牛顿下山算法流程图 牛顿下山算法见流程图: 5、代码: #include #include #include usingnamespacestd; class srrt { private: intn; double *a,*xr,*xi; public: srrt(intnn) { n=nn; a=newdouble[n+1]; //动态分配内存 xr=newdouble[n]; xi=newdouble[n]; } voidinput(); //由文件读入代数方程系数 voidsrrt_root(); //执行牛顿下山法 voidoutput(); //输出根到文件并显示 2下载后可任意编辑 ~srrt() { delete[]a,xr,xi; } }; voidsrrt::input() //由文件读入代数方程系数 { int i; charstr1[20]; coutstr1; ifstream fin(str1); if(!fin) {cout>a[i]; //读入代数方程系数 fin.close(); } voidsrrt::srrt_root() //执行牛顿下山法 { intm,i,jt,k,is,it; doublet,x,y,x1,y1,dx,dy,p,q,w,dd,dc,c; doubleg,u,v,pq,g1,u1,v1; m=n; while((m>0)&&(fabs(a[m])+1.0==1.0))m=m-1; if(m1.0)dd=1.0; dc=6.28/...