《数值分析》实验报告班级信科1501学号150803114姓名梁恩昊日期2017.10.3学院数学科学学院专业信息与计算科学课程名称数值分析成绩实验一方程求根一、实验目的:掌握二分法、Newton法、不动点迭代法、弦截法求方程的根的各种计算方法、并实施程序调试和运行,学习应用这些算法于实际问题。二、实验内容:二分法、Newton法、不动点迭代法、弦截法求方程的根、程序的调试和运行,给出实例的计算结果。观察初值对收敛性的影响。三、实验步骤:①、二分法:定义:对于区间[a,b]上连续不断且f(a)·f(b)0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。实现方法:首先我们设一方程400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0,并求其在区间[0.1,1]上的根,误差限为e=10^-4。PS:本方法应用的软件为matlab。disp('二分法')a=0.1;b=1;tol=0.0001;n0=100;fa=400*(a.^4)-300*(a.^3)+200*(a.^2)-10*a-1;fori=1:n0p=(a+b)/2;fp=400*(p.^4)-300*(p.^3)+200*(p.^2)-10*p-1;iffp==0||(abs((b-a)/2)tol)disp('用二分法求得方程的根p=')disp(p)disp('二分迭代次数为:')disp(i)break;end;iffa*fp0a=p;elseb=p;end;end;ifi==n0&&~(fp==0||(abs((b-a)/2)tol))disp(n0)disp('次二分迭代后没有求出方程的根')end;程序调试:运行结果:用二分法求得方程的根p=0.1108二分迭代次数为:14②Newton法定义:取定初值x0,找到函数对应的点,然后通过该点作函数切线,交x轴,得到新的横坐标值,然后找函数对应的点,做切线,得到新的横坐标值,重复上述步骤,多次迭代,直到收敛到需要的精度。实现方法:我们与二分法一样,先设一方程400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0,并求其在区间[0.1,1]上的根。PS:本方法应用的软件为matlab。symsx;diff(400*(x.^4)-300*(x.^3)+200*(x.^2)-10*x-1)%求导方程函数文件:functionNewton=fun(a)Newton=400*(a.^4)-300*(a.^3)+200*(a.^2)-10*a-1;endfunctionNewton2=dfun(b)Newton2=1600*b^3-900*b^2+400*b-10;%fun函数的导数end主程序:x0=1;while1x1=x0-fun(x0)/dfun(x0);ifabs(x1-x0)1e-8||abs(fun(x1))1e-10break;endx0=x1;enddisp('用牛顿法求得的方程的根为:x=')disp(x1)程序调试:运行结果:用牛顿法求得的方程的根为:x=0.1108③、不动点迭代法:采用不动点迭代法计算非线性方程x3+4x2-10=0,在区间[1,2]上的一个根。PS:本方法应用的软件为matlab。不动点迭代法程序:函数文件:function[y,n]=BDD(x,eps)ifnargin==1eps=1.0e-6;elseifnargin1errorreturnendx1=gg(x);n=1;while(norm(x1-x)=1e-6)&&(n=10000)x=x1;x1=gg(x);n=n+1;endy=x;M函数:functionf=gg(x)f(1)=sqrt(2.5-(x^3)/4);结果如下:BDD(1)n=21ans=1.3652④、弦截法:定义:弦截法是求非线性方程近似根的一种线性近似方法。它是以与曲线弧AB对应的弦AB与x轴的交点横坐标作为曲线弧AB与x轴的交点横坐标的近似值μ来求出方程的近似解。该方法一般通过计算机编程来实现。弦截法的原理是以直代曲即用弦(直线)代替曲线求方程的近似解,也就是利用对应的弦与轴的交点横坐标来作为曲线弧与轴的交点横坐标的近似值。实现方法:我们与二分法一样,先设一方程400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0,并求其在区间[0.1,1]上的根。PS:本方法应用的软件为matlab。函数文件:function[p1,err,k,y]=secant(f,p0,p1,delta,max1)%f是非线性函数%p0,p1是初始值%delta是给定允许误差%max1是迭代次数的上限%p1是所求得的方程的近似解%err是p1-p0的误差估计%k是所需要的迭代次数%y=f(p1)K=0,p0,p1,feval('f',p0),feval('f',p1)fork=1:max1p2=p1-feval('f',p1)*(p1-p0)/(feval('f',p1)-feval('f',p0));err=abs(p2-p1);p0=p1;p1=p2;k,p1,err,y=feval('f',p1)if(errdelta)|(y==0),break,endendendM文件:secant('400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0',0,1,1.0e-4,100);disp('用弦截法求得的方程的根为:x=')disp(p1)运行结果:用弦截法求得的方程的根为:x=0.1108四、实验中遇到的问题及解决方法:MATLAB运用不熟练,于是翻开以前的课本与ppt,并结合网上查阅的资料,才又掌握了一些基础的运用方法。一开始忘了怎么创建函数文件,于是实现二分法的程序时变得十分麻烦。后来复习过后,运用在牛顿法上,就简单了许多。二分法与牛顿法是比较容易掌握并实现的,而后两个方法则是查阅了很多资料,却仍然似懂非懂,程序也是大部分参考了资料。我将在此之后继续钻研它们,直到能熟练运用为止。