1本科生实验报告实验课程数值计算方法学院名称信息科学与技术学院专业名称计算机科学与技术学生姓名学生学号指导教师实验地点实验成绩二〇一六年五月二〇一六年五月2实验一非线性方程求根1.1问题描述实验目的:掌握非线性方程求根的基本步骤及方法,。实验内容:试分别用二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法),求x5-3x3+x-1=0在区间[-8,8]上的全部实根,误差限为10-6。要求:讨论求解的全过程,对所用算法的局部收敛性,优缺点等作分析及比较,第2章算法思想2.1二分法思想:在函数的单调有根区间内,将有根区间不断的二分,寻找方程的解。步骤:1.取中点mid=(x0+x1)/22.若f(mid)=0,则mid为方程的根,否则比较与两端的符号,若与f(x0)异号,则根在[x0,mid]之间,否则在[mid,x1]之间。3并重复上述步骤,直达达到精度要求,则mid为方程的近似解。开始读入a,b,emid=(a+b)/2F(a)*f(b)0|a-b|e?a=midb=mid结束是输出midyesno32.2简单迭代法思想:迭代法是一种逐次逼近的方法,它是固定公式反复校正跟的近似值,使之逐步精确,最后得到精度要求的结果。步骤:1.构造迭代公式f(x),迭代公式必须是收敛的。2.计算x1,x1=f(x0).3.判断|x1-x0|是否满足精度要求,如不满足则重复上述步骤。4.输出x1,即为方程的近似解。开始输入x0,eX1=f(x0)|x1-x0|eX1=x0;输出x1结束Noyesf为迭代函数42.3Newton迭代法思想:设r是的根,选取作为r的初始近似值,过点做曲线的切线L,L的方程为,求出L与x轴交点的横坐标,称x1为r的一次近似值。过点做曲线的切线,并求该切线与x轴交点的横坐标,称为r的二次近似值。重复以上过程,得r的近似值序列,其中,称为r的次近似值步骤:1.计算原函数的导数f’(x);构造牛顿迭代公式2.计算,若f’(x0)=0,退出计算,否则继续向下迭代。3.若|x1-x0|满足精度要求,x1即为方程的近似解。开始输入x0,eX1=x0-f(x0)/f(x1)|x1-x0|eX1=x0;输出x1结束Noyesf’(x0)=052.4弦截法思想:为加速收敛,改用两个端点都在变动的弦,用差商替代牛顿迭代公式的导数f’(x)。步骤:1.构造双点弦法的公式2.计算x2=x1-f(x1)(x1-x0)/f(x1)-f(x0);3.判断f(x2)是否满足精度要求,若没有则按照上述步骤继续迭代,否则输出x2.x2即为方程的近似解。开始输入x0,x1,ex2=x1-x0-f(x1)(x1-x0)/f(x1)-f(x0)|f(x2)|e?X1=x0;X2=x1;f(x1)=f(x0);f(x2)=f(x1);结束No计算f(x2)输出x2=6第3章测试结果及分析测试结果函数图像函数Y=x5-3x3+x-1二分法(表1-1,1-2,1-3)[-1.6,-1.3]kxkkxkkxk0-1.455-1.5015610-1.504931-1.5256-1.5039111-1.5052-1.48757-1.5050812-1.505043-1.506258-1.5044913-1.505064-1.496889-1.5047914-1.50507表1-1区间[-1.2,-0.9]kxkkxkkxk0-1.055-0.99843710-1.000051-0.9756-1.0007811-0.9999762-1.01257-0.99960912-1.0000173-0.993758-1.000213-0.9999944-1.003129-0.99990214-1表1-2区间[1.5,1.8]kxkkxkkxk01.6571.69102141.6902911.72581.69043151.6902921.687591.69014161.6902931.70625101.69028171.6902841.69687111.69036181.6902851.69219121.6903261.68984131.6903表1-3简单迭代法(表2-1.2-2.2-3)初值-1.5kxkkxkkxk1-1.57-1.5043513-1.504932-1.502178-1.5045314-1.504973-1.502879-1.50466151.504994-1.5034110-1.5047616-1.505015-1.5038111-1.5048317-1.505046-1.5041212-1.5048918-1.50505表2-1初值-1kx1-12-1表2-28初值1.6结果x=1.69028kxkkxkkxk11.681.68862151.6902321.6566991.68927161.6902531.66987101.68967171.6902741.6779111.68991181.6902751.68278121.69006191.6902861.68573131.69015201.6902871.68753141.6902表2-3牛顿迭代法(表3-1.3-2,3-3)初值-1.5结果x=-1.50507kxkkxk1-1.54-1.505042-1.504715-1.505063-1.504976-1.50507表3-1初值-1结果x=-1.50507kx1-12-1表3-2初值1.6结果x=1.69028kxkkxk11.651.6902421.6860261.6902731.6889371.6902841.6898581.69028表3-39双点弦法(表4-1.4-2,4-3)区间[-1.6,-1.3]结果x=-1.50507kxkf(xk)kxkf(xk)1-1.50.031255-1.506670.07845662-1.661490.3765026-1.505-0.0100793-1.47175-1.563227-1.505070.0004409884-1.4920.1868018-1.505072.30387e-006表4-1区间[-1.2,-0.9]结果x=-1kxkf(xk)1-1.013930.04156782-1.00020.0006077773-0.999999-3.11969e-0064-12.11001e-010表4-2区间[1.5,1.8]结果x=1.69028kxkf(xk)11.64403-0.67645521.68071-0.15110631.691260.015798841.69027-0.00031351551.69028-6.3006e-007表4-3从测试结果可以看出二分法和简单迭代法的收敛速度远大于牛顿迭代和弦截法的收敛速度。二分法和简单迭代法的公式易于构造和计算,牛顿迭代法虽然收敛高,但要求导数,计算的复杂度高!双点弦法随稍慢于牛顿跌代法,可以用差商代替牛顿迭代法中的导数,降低了计算的复杂度!10附录:源程序清单#includeiostream#includemath.husingnamespacestd;doublefoot=0.3;//定义寻根步长inta=-8,b=8;double*rn=newdouble[5];//解的区间double*r=newdouble[5];//方程近似解intm=0;//根的个数intx_count;doubleprecision=0.000001;//精度要求//函数的表达式(x^5-3x^3+x-1)doublef(doublex){return(pow(x,5)-3*pow(x,3)+x-1);}voidinit(){//根据函数图像确定根的区间和迭代初值r[0]=-1.5;r[1]=-1;r[2]=1.6;rn[0]=-1.6;rn[1]=-1.2;rn[2]=1.5;}//寻找根的区间voidsearch(){//若没有给出区间和初值,进行逐步搜索有根区间for(inti=0;i*foot-88;i++){if(f(i*foot-8)*f((i+1)*foot-8)0){rn[m]=i*foot-8;m++;}}}//=====================二分法==========================doubleDichotomy(doublea,doubleb){11doublemid=0;inti=0;while(fabs(b-a)precision){mid=(a+b)/2;if(f(a)*f(mid)=0)b=mid;//判断与端点函数值得符号elsea=mid;coutmidendl;}r[x_count++]=mid;returnmid;//返回最终结果}//================简单迭代法=========================//构造迭代公式doublefitera(doublex){doubleresult=0;doublexx=3*pow(x,3)-x+1;if(xx=0){xx=-xx;returnpow(xx,1.0/5.0)*(-1);}elsereturnpow(xx,1.0/5.0);}//简单迭代doubleitera(doublex0){coutx0endl;doublex1=fitera(x0);while(fabs(x1-x0)precision){x0=x1;x1=fitera(x0);//没有到达精度要求继续迭代coutx1endl;}returnx1;//返回最终结果}//===============牛顿迭代法==================//计算函数的一阶导数fderivatives(doublex)doublefderivatives(doublex){return5*pow(x,4)-9*(x,2)+1;}12//构造牛顿迭代公式newtonitera(doublex)doublenewtonitera(doublex){if(fderivatives(x)==0)return-1;//若导数为0则停止迭代elsereturnx-(f(x)/fderivatives(x));}//牛顿迭代doublenewton(doublex0){doublex1=newtonitera(x0);while(fabs(x1-x0)precision){x0=x1;if(newtonitera(x0)==-1)break;x1=newtonitera(x0);//继续迭代coutx1endl;}returnx1;//返回最终结果}//==================双点弦法迭代======================//构造弦截法的迭代公式doubletwopointchord_f(doublex0,doublex1){returnx1-(f(x1)/(f(x1)-f(x0)))*(x1-x0);}//双点弦法迭代doubletwopointchord(doublex0,doublex1){doublex3=twopointchord_f(x0,x1);coutx3endl;while(fabs(f(x3))precision){coutf(x3)f(x3)endl;//输出x3的函数值x0=x1;x1=x3;x3=twopointchord_f(x0,x1);//没有到达精度要求继续迭代//coutx3endl;}coutf(x3)endl;returnx3;//返回最终结果}//测试voidmain(){13init();//初始化区间和迭代初值/*测试代码输出每次的迭代结果和最终结果cout------------------------二分法----------------------endl;for(inti=0;i3