num=k;
%num为迭代次数
end
break;
endc=(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)
%lnput-func是运算公式
-delta是允许误差
%Output-c牛顿迭代法最后计算所得零点值
-num是迭代次数
num=-1;
fork=1:
1000
yO=func(p0);
dy0=diff(func([p0p0+1e-8]))/1e-8;
p1=p0-y0/dy0;
err=abs(p1-p0);
p0=p1;
if(errvdelta)
num=k;%num为迭代次数break;
endendc=p0;
第2题:
由题意得到算式:
200000?
(1+?
?
10-2160?
12?
10=0
计算调用函数:
[c,num]=newton(@func2,0.02,1e-8)
画图程序:
functionTest2()%f(x)示意图,f(x)=200000*(1+x)A10-2160*12*10;f(x)=0r=linspace(0,0.06,100);
y=200000*(1+r)A10-2160*12T0;
plot(r,y);
gridon
调用函数:
function[y]=func2(r)y=200000*(1+r)A10-2160*12*10;
end
牛顿迭代法算法程序:
function[c,num]=newton(func,p0,delta)
%lnput-func是运算公式
-delta是允许误差
%Output-c牛顿迭代法最后计算所得零点值
-num是迭代次数
num=-1;
fork=1:
1000
yO=func(p0);
dy0=diff(func([p0p0+1e-8]))/1e-8;
p1=p0-y0/dy0;
err=abs(p1-p0);
p0=p1;
if(errvdelta)
num=k;
break;
endendc=p0;
第3题:
cot?
?
=(?
八1)/2?
?
求最小正数解
计算调用函数:
[c,num]=newton(@func3,1,1e-8)
程序:
先用画图法估计出最小正解位置在1到2之间
画图程序:
functionTest3()%f(x)示意图,f(x)=cot(x)-(xA2-1)./(2.*x);f(x)=0
,[-6,6]);
ezplot('cot(x)-(xA2-1)./(2.*x)'gridon
调用函数:
function[y]=func3(x)y=cot(x)-(x.^2-1)./(2.*x);
end
牛顿迭代法算法程序:
function[c,num]=newton(func,p0,delta)
%lnput-func是运算公式
-p0是零点值-delta是允许误差
%Output-c牛顿迭代法最后计算所得零点值
num=-1;
fork=1:
1000
yO=func(p0);
dy0=diff(func([p0p0+1e-8]))/1e-8;
p1=p0-y0/dy0;
err=abs(p1-p0);
p0=p1;
if(errvdelta)
num=k;
break;
endendc=p0;
精确至8位有效数字
第4题:
f(x)=x3-11x2+32x-28=0
根据画图图像可得函数有一个重根在区间[1,3]和另一个根在区间[6,8]。
计算调用函数:
重根:
[c,num]=newton(@func4,1,1e-8)
另外的单根:
[c,num]=newton(@func4,6,1e-8)
画图程序:
functionTest4()%f(x)示意图,f(x)=xA3-11.*xA2+32.*x-28;f(x)=0r=0:
0.01:
8;
y=匚人3-11.*匚人2+32.*卜28;
Plot(r,y);
gridon
调用函数:
functionfunc4(x)y=x.^3-11.*x.^2+32.*x-28;
end
牛顿迭代法算法程序:
function[c,num]=newton(func,p0,delta)
%lnput-func是运算公式
-p0是零点值
%Output-c牛顿迭代法最后计算所得零点值
-num是迭代次数
num=-1;
fork=1:
100
yO=func(p0);
dy0=diff(func([p0p0+1e-8]))/1e-8;
if(dy0==0)
c=vpa(p0,8);
num=k;
break;
else
p1=p0-y0/dy0;
err=abs(p1-p0);
p0=p1;
if(errvdelta)
num=k;
break;
end
endendc=vpa(p0,8);
改进的牛顿算法程序:
function[c,num]=newton(func,p0,delta)
%lnput-func是运算公式
-p0是零点值-delta是允许误差
%Output-c牛顿迭代法最后计算所得零点值
-num是迭代次数
num=-1;
fork=1:
100
y0=func(p0);
dy0=diff(func([p0p0+1e-8]))/1e-8;
if(dy0==0)
c=vpa(p0,8);
num=k;
break;
else
根数的方法进行改善。
err=abs(p1-pO);
p0=p1;
if(errvdelta)
num=k;
break;
end
end
end
c=vpa(p0,8);
四、
实验结果分析
第1题:
根据图片可以看出函数零点的值在
0.4与0.5之间,牛顿迭代法时取0.5作为迭代初值。
第2题:
根据图片可以看出函数零点的值在0.02与0.03之间,可采用0.02作为迭代初值。
根据图片可以看出函数最小正数零点的值在1与2之间,在使用牛顿迭代法时可以采用1
为迭代初值。
第4题:
根据图片可以看出函数重根为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)函数在n/2处无限值,画图时注意使用符号函数ezplot。
以1为代入点,最后迭代
次数为5。
第4题实验结果:
利用牛顿迭代法计算得到:
重根:
c=2.00000000,num=25;
另一单根:
c=7.00000000,num=7;
改进后牛顿迭代法重根计算结果:
c=2.00000000,num=5;
针对重
从结果中可以看出牛顿迭代法在计算单根时比计算重根时的收敛速度快很多,根的计算,改进后牛顿迭代法大大减小了迭代的次数,提高了收敛速度。