《数值分析》报告运用Matlab求解非线性方程的根学院:专业:班级:姓名:学号:《数值分析》报告11.目的掌握非线性方程求根的方法,并选取实例运用MATLAB软件进行算法的实现,分别用牛顿法、弦截法和抛物线法求非线性方程的根。2.报告选题报告选取《数值分析(第四版)》290页习题7作为研究对象,即求3()310fxxx在02x附近的根。根的准确值*1.87938524...x,要求结果准确到四位有效数字。(1)用牛顿法;(2)用弦截法,取02x,11.9x;(3)用抛物线法,取01x,13x,22x。3.理论基础(1)牛顿迭代法牛顿迭代法是一种特殊的不动点迭代法,其计算公式为1(),0,1,2,...'()kkkkfxxxkfx其迭代函数为()()'()fxxxfx牛顿迭代法的收敛速度,当(*)0,'(*)0,''(*)0fxfxfx时,容易证明,'(*)0fx,''(*)''(*)0'(*)fxxfx,牛顿迭代法是平方收敛的,且12''(*)lim2'(*)kkkefxefx。(2)弦截法将牛顿迭代法中的'()kfx用()fx在1kx,kx处的一阶差商来代替,即可得弦截法111()()()()kkkkkkkfxxxxxfxfx。(3)抛物线法《数值分析》报告2弦截法可以理解为用过11(,()),(())kkkkxfxxfx两点的直线方程的根近似替()0fx的根。若已知()0fx的三个近似根kx,1kx,2kx用过1122(,()),(,()),(,())kkkkkkxfxxfxxfx的抛物线方程的根近似代替()0fx的根,所得的迭代法称为抛物线法,也称密勒(Muller)法。4.MATLAB实现根据牛顿法、弦截法和抛物线法求非线性方程根的理论基础,为实现计算在MATLAB中编写了以下M文件:(1)f.m,题目中的函数ffunctiony=f(x)y=x^3-3*x-1;(2)d.m,函数f的导数functiony=d(x)y=3*x^2-3;(3)newton.m,牛顿法functionnewton(f,d,x0,e,max)%f是要求根的方程(f(x)=0);%d是f(x)的导数;%x0是所给初值,位于x*附近;%e是给定允许误差;%max是迭代的最大次数;%x1是newton法求得的方程的近似解;%err是误差估计;%k是迭代次数;%y是f(x)值;k=0;y=feval('f',x0);fprintf('k=%.0fx%d=%.8fy%d=%.6e\n',k,k,x0,k,y)fork=1:maxx1=x0-feval('f',x0)/feval('d',x0);err=abs(x1-1.87938524);《数值分析》报告3x0=x1;y=feval('f',x0);fprintf('k=%.0fx%d=%.8fe%d=%.6ey%d=%.6e\n',k,k,x0,k,err,k,y)if(erre)|(y==0)|(k==max)break;endend(4)xjmethod.m弦截法functionxjmethod(f,x0,x1,e,max)%f是要求根的方程(f(x)=0);%x0,x1是所给初值,位于x*附近;%e是给定允许误差;%max是迭代的最大次数;%x1是弦截法求得的方程的近似解;%err是误差估计;%k是迭代次数;%y是f(x)值;fprintf('k=%.0fx%d=%.8fy%d=%.8e\n',0,0,x0,0,feval('f',x0))fprintf('k=%.0fx%d=%.8fy%d=%.8e\n',1,1,x1,1,feval('f',x1))fork=2:maxx2=x1-(feval('f',x1)*(x1-x0))/(feval('f',x1)-feval('f',x0));err=abs(x2-1.87938524);x0=x1;x1=x2;y=feval('f',x1);fprintf('k=%.0fx%d=%.8fe%d=%.6ey%d=%.8e\n',k,k,x1,k,err,k,y)if(erre)|(y==0)|(k==max)break;end《数值分析》报告4end(5)pwxmethod.m抛物线法functionpwxmethod(f,x0,x1,x2,e,max)%f是要求根的方程(f(x)=0);%x0,x1,x2是所给初值,位于x*附近;%e是给定允许误差;%max是迭代的最大次数;%x3是弦截法求得的方程的近似解;%err是误差估计;%k是迭代次数;%y是f(x)值fprintf('k=%.0fx%d=%.8fy%d=%.8e\n',0,0,x0,0,feval('f',x0))fprintf('k=%.0fx%d=%.8fy%d=%.8e\n',1,1,x1,1,feval('f',x1))fprintf('k=%.0fx%d=%.8fy%d=%.8e\n',2,2,x2,2,feval('f',x2))fork=3:maxf0=feval('f',x0);f1=feval('f',x1);f2=feval('f',x2);a=(f0-f2)/(x0-x2);b=(f1-f2)/(x1-x2);c=(a-b)/(x0-x1);w=b+c*(x2-x1);ifw0x3=x2-(2*f2/(w-sqrt(w^2-4*c*f2)));elseifw0x3=x2-(2*f2/(w+sqrt(w^2-4*c*f2)));enderr=abs(x3-1.87938524);《数值分析》报告5x0=x1;x1=x2;x2=x3;y=feval('f',x2);fprintf('k=%.0fx%d=%.8fe%d=%.6ey%d=%.8e\n',k,k,x2,k,err,k,y)if(erre)|(y==0)|(k==max)break;endend5.运行结果图1运行结果界面(1)牛顿法计算结果kkxkeky02.000000001.000000e+00011.888888899.503649e-0037.270233e-00221.879451576.632695e-0055.038501e-004《数值分析》报告6即*21.87945157xx,误差为6.632695e-005。(2)弦截法计算结果kkxkeky02.000000001.000000e+00011.900000001.59000000e-00121.881093941.708696e-0031.29961633e-00231.879411062.582017e-0051.96128714e-004即*31.87941106xx,误差为2.582017e-005。(3)抛物线法计算结果kkxkeky01.00000000-3.00000000e+00013.000000001.70000000e+00122.000000001.00000000e+00031.893149821.376458e-0021.05630272e-00141.879135262.499828e-004-1.89859581e-00351.879385305.621918e-0084.15115927e-007即*61.87938530xx,误差为5.621918e-008。6.小结迭代法是解非线性方程的主要方法,牛顿法就是最有效的迭代法之一,它在单根附近具有较高阶的收敛速度。而弦截法用差商代替导数,对于较复杂的函数运算变的方便。抛物线法也是超线性收敛的,适用于求多项式的实根和复根。通过本次报告加深了对牛顿法、弦截法和抛物线法求解非线性方程根的理解,同时掌握了MATLAB强大的计算功能,增强了对数值分析课程的学习兴趣。参考文献[1]李庆扬.数值分析(第四版)北京:清华大学出版社,施普林格出版社.2001.[2]胡学林.可编程控制器教程.北京:机械工业出版社,2003.