西 安 邮 电 大 学
(计算机学院)
课内实验报告
实验名称 用迭代法解方程
专业名称: 计算机科学与技术 班 级: 学生姓名: 学号(8位) 指导教师:
实验日期: 2013年11月
一. 实验目的及实验环境
实验目的:编写程序,比较两种迭代法的优劣。 在MATLAB数学软件下求解 二. 实验内容
求下列方程的实根
(1) x^2-3x+2-e^x=0; (2) x^3+2x^2+10x-20=0.
要求:(1)设计一种不动点迭代法,要使迭代序列收敛,然后再用斯特芬森加速迭代,计算到|x(k)-x(k-1)|<10^(-8)为止。(2)用牛顿迭代,同样计算到|x(k)-x(k-1)|<10^(-8)。输出迭代初值及各次迭代值和迭代次数k,比较方法的优劣。 三.方案设计
1.在Matlab中直接求解
2.采用不动点迭代法、斯特芬森加速迭代和牛顿迭代法实现并比较优劣。 四.测试数据及运行结果
(1)先用画图的方法估计根的范围 ezplot('x^2-3*x+2-exp(x)'); grid on;
x2-3 x+2-exp(x)500-50-100-150-200-6-4-20x246
可以估计到方程的根在区间(0,1);选取迭代初值为x0=0.5; 构造不动点迭代公式x(k+1)=( x(k)^2+2-e^x(k))/3; ψ(x)= ( x^2+2-e^x)/3;
当0 f = Inline function: f(x) = (x^2+2-exp(x))/3 x= 0.20042624309996 0.27274906509837 0.25360715658413 0.25855037626494 0.25726563633509 0.25759898516219 0.25751245451483 0.25753491361525 0.25752908416796 0.25753059723833 0.25753020451046 0.25753030644564 0.25753027998767 0.25753028685501 i = 14 x = 0.25753028685501 斯特芬森加速法: 运行结果为x= 0.25868442756579 0.25753031771981 0.25753028543986 0.25753028543986 i = 4 x = 0.25753028543986 牛顿法运行结果如下: x= 0.50000000000000 0.25368870241829 0.25752890079471 0.25753028543968 0.25753028543986 i = 4 x1 =0.25753028543986 (2)先用画图的方法估计根的范围 ezplot('x^3+2*x^2+10*x-20'); grid on; x3+2 x2+10 x-204003002001000-100-200-6-4-20x246 根大约在区间(1,2);选取初值x0=1.5; 构造不动点迭代公式x(k+1)=(-2x(k)^2-10x(k)+20)^1/3; ψ(x)=(-2x^2-10x+20)^1/3; 运行结果: f = Inline function: f(x) = (-2*x^2-10*x+20)^1/3 x= 0.16666666666667 6.09259259259259 -38.38843164151806 -8.478196837919431e+002 -4.763660785374071e+005 -1.512815059604763e+011 i = 6 x = -1.512815059604763e+011 迭代6次后x的值大得令人吃惊,表明构造的式子并不收敛. 也无法构造出收敛的不动点公式 牛顿迭代法运行结果: x= 1.50000000000000 1.37362637362637 1.36881481962396 1.36880810783441 1.36880810782137 i = 4 x1 = 1.36880810782137 五.总结 在实验中发现牛顿法的收敛性比较好,相比不动点迭代法要构造出收敛的公式比较难,牛顿法迭代次数也较少,收敛速度快,只是对初值的要求很高,几种方法各有利弊,所以在以后的使用时具体采用哪种需因题而异。通过这次实验体会到根据实际情况选择不同的方法。 六.源代码 format long; f=inline('(x^2+2-exp(x))/3') disp('x='); x=feval(f,0.5); disp(x); Eps=1E-8; i=1; while 1 x0=x; i=i+1; x=feval(f,x); disp(x); if abs(x-x0) format long; f=inline('x-((x^2+2-exp(x))/3-x)^2/((((x^2+2-exp(x))/3)^2+2-exp((x^2+2-exp(x))/3))/3-2*(x^2+2-exp(x))/3+x)'); disp('x='); x=feval(f,0.5); disp(x); Eps=1E-8; i=1; while 1 x0=x; i=i+1; x=feval(f,x); disp(x); if abs(x-x0) format long; x=sym('x'); f=sym('x^2-3*x+2-exp(x)'); df=diff(f,x); FX=x-f/df; Fx=inline(FX); disp('x='); x1=0.5; disp(x1); Eps=1E-8; i=0; while 1 x0=x1; i=i+1; x1=feval(Fx,x1); disp(x1); if abs(x1-x0)