实验报告一:实验题目一、 实验目的掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。
二、 实验内容1、编写二分法、牛顿迭代法程序,并使用这两个程序计算02)(=-+=xe x xf 在[0, 1]区间的解,要求误差小于 410- ,比较两种方法收敛速度。
2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。
3、由中子迁移理论,燃料棒的临界长度为下面方程的根cot x =(x 2−1)/2x ,用牛顿迭代法求这个方程的最小正根。
4、用牛顿法求方程f (x )=x 3−11x 2+32x −28=0的根,精确至8位有效数字。
比较牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。
三、 实验程序第1题:02)(=-+=xe x xf 区间[0,1] 函数画图可得函数零点约为0.5。
画图函数: function Test1()% f(x) 示意图, f(x) = x + exp(x) - 2; f(x) = 0 r = 0:0.01:1; y = r + exp(r) - 2 plot(r, y); grid on二分法程序:计算调用函数:[c,num]=bisect(0,1,1e-4)function [c,num]=bisect(a,b,delta) %Input –a,b 是取值区间范围 % -delta 是允许误差%Output -c 牛顿迭代法最后计算所得零点值 % -num 是迭代次数ya = a + exp(a) - 2;yb = b + exp(b) - 2;if ya * yb>0return;endfor k=1:100c=(a+b)/2;yc= c + exp(c) - 2;if abs(yc)<=deltaa=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif abs(b-a)<deltanum=k; %num为迭代次数break;endendc=(a+b)/2;err=abs(b-a);yc = c + exp(c) - 2;牛顿迭代法程序:计算调用函数:[c,num]=newton(@func1,0.5,1e-4) 调用函数:function [y] = func1(x)y = x + exp(x) - 2;end迭代算法:function[c,num]=newton(func,p0,delta)%Input -func是运算公式% -p0是零点值% -delta是允许误差%Output -c牛顿迭代法最后计算所得零点值% -num是迭代次数num=-1;for k=1:1000y0=func(p0);dy0=diff(func([p0 p0+1e-8]))/1e-8;p1=p0-y0/dy0;err=abs(p1-p0);p0=p1;if(err<delta)num=k;%num为迭代次数break;endendc=p0;第2题:由题意得到算式:200000∗(1+x)10−2160∗12∗10=0计算调用函数:[c,num]=newton(@func2,0.02,1e-8)程序:先用画图法估计出大概零点位置在0.02附近。
画图程序:function Test2()% f(x) 示意图, f(x) = 200000*(1+x).^10-2160*12*10; f(x) = 0r = linspace(0,0.06, 100);y = 200000*(1+r).^10-2160*12*10;plot(r, y);grid on调用函数:function[y]=func2(r)y=200000*(1+r).^10-2160*12*10;end牛顿迭代法算法程序:function [c,num] =newton(func,p0,delta)%Input -func是运算公式% -p0是零点值% -delta是允许误差%Output -c牛顿迭代法最后计算所得零点值% -num是迭代次数num=-1;for k=1:1000y0=func(p0);dy0=diff(func([p0 p0+1e-8]))/1e-8;p1=p0-y0/dy0;err=abs(p1-p0);p0=p1;if(err<delta)num=k;break;endendc=p0;第3题:cot x=(x2−1)/2x求最小正数解计算调用函数:[c,num]=newton(@func3, 1 ,1e-8) 程序:先用画图法估计出最小正解位置在1到2之间画图程序:function Test3()% f(x) 示意图, f(x) = cot(x)-(x.^2-1)./(2.*x); f(x) = 0ezplot('cot(x)-(x.^2-1)./(2.*x)',[-6,6]);grid on调用函数:function[y]=func3(x)y=cot(x)-(x.^2-1)./(2.*x);end牛顿迭代法算法程序:function [c,num] =newton(func,p0,delta)%Input -func是运算公式% -p0是零点值% -delta是允许误差%Output -c牛顿迭代法最后计算所得零点值% -num是迭代次数num=-1;for k=1:1000y0=func(p0);dy0=diff(func([p0 p0+1e-8]))/1e-8;p1=p0-y0/dy0;err=abs(p1-p0);p0=p1;if(err<delta)num=k;break;endendc=p0;第4题:f(x)=x3−11x2+32x−28=0精确至8位有效数字根据画图图像可得函数有一个重根在区间[1,3]和另一个根在区间[6,8]。
计算调用函数:重根:[c,num]=newton(@func4, 1 ,1e-8)另外的单根:[c,num]=newton(@func4, 6 ,1e-8)画图程序:function Test4()% f(x) 示意图, f(x) = x.^3-11.*x.^2+32.*x-28; f(x) = 0r = 0:0.01:8;y = r.^3-11.*r.^2+32.*r-28;plot(r, y);grid on调用函数:function func4(x)y=x.^3-11.*x.^2+32.*x-28;end牛顿迭代法算法程序:function[c,num]=newton(func,p0,delta)%Input -func是运算公式% -p0是零点值% -delta是允许误差%Output -c牛顿迭代法最后计算所得零点值% -num是迭代次数num=-1;for k=1:100y0=func(p0);dy0=diff(func([p0 p0+1e-8]))/1e-8;if(dy0==0)c= vpa(p0,8);num=k;break;elsep1=p0-y0/dy0;err=abs(p1-p0);p0=p1;if(err<delta)num=k;break;endendendc= vpa(p0,8);改进的牛顿算法程序:function[c,num]=newton(func,p0,delta)%Input -func是运算公式% -p0是零点值% -delta是允许误差%Output -c牛顿迭代法最后计算所得零点值% -num是迭代次数num=-1;for k=1:100y0=func(p0);dy0=diff(func([p0 p0+1e-8]))/1e-8;if(dy0==0)c= vpa(p0,8);num=k;break;elsep1=p0-2*y0/dy0;%根据重根计算时,改进Newton法的收敛速度,可以采用在迭代函数中乘上重根数的方法进行改善。
err=abs(p1-p0);p0=p1;if(err<delta)num=k;break;endendendc=vpa(p0,8);四、实验结果分析第1题:根据图片可以看出函数零点的值在0.4与0.5之间,牛顿迭代法时取0.5作为迭代初值。
根据图片可以看出函数零点的值在0.02与0.03之间,可采用0.02作为迭代初值。
第3题:根据图片可以看出函数最小正数零点的值在1与2之间,在使用牛顿迭代法时可以采用1为迭代初值。
根据图片可以看出函数重根为2,另一单根为7。
在使用迭代法时刻采用1和6为初值进行计算。
五、实验结论通过实验结果可以看出,二分法,简单迭代法和牛顿迭代法三种算法中,牛顿迭代法在选取适合值进行代入的情况下能得到较好的收敛效果。
第1题:二分法实验结果:c =0.4429,num =11牛顿迭代法实验结果:c =0.4429,num =3根据结果可以看出两者计算结果相同,牛顿迭代法迭代次数为3,二分法的迭代次数为11,比较而言迭代次数牛顿迭代法比二分法小得多。
第2题实验结果:零点c = 0.0263,num = 4通过画图后能对计算结果有一个较好的估计,从而在最后获得结果,并且迭代次数也较少。
第3题实验结果:零点c = 1.3065,num = 5。
cot(x)函数在π/2处无限值,画图时注意使用符号函数ezplot。
以1为代入点,最后迭代次数为5。
第4题实验结果:利用牛顿迭代法计算得到:重根:c =2.00000000,num =25;另一单根:c =7.00000000,num = 7;改进后牛顿迭代法重根计算结果:c =2.00000000,num =5;从结果中可以看出牛顿迭代法在计算单根时比计算重根时的收敛速度快很多,针对重根的计算,改进后牛顿迭代法大大减小了迭代的次数,提高了收敛速度。