数值分析求解非线性方程根的二分法、简单迭代法和牛顿迭代法
实验报告一:实验题目
一、 实验目的
掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。 二、 实验内容
1、编写二分法、牛顿迭代法程序,并使用这两个程序计算02)(=-+=x
e x x
f 在[0, 1]区间的解,要求误差小于 4
10- ,比较两种方法收敛速度。
2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。
3、由中子迁移理论,燃料棒的临界长度为下面方程的根,用牛顿迭
代法求这个方程的最小正根。
4、用牛顿法求方程
的根,精确至8位有效数字。比较
牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。
三、 实验程序
第1题:
02)(=-+=x
e x x
f 区间[0,1] 函数画图可得函数零点约为0.5。
画图函数:
f un cti on Te st1()
% f(x ) 示意图, f(x) = x + exp (x) - 2; f(x) = 0 r = 0:0.01:1; y = r + e xp(r) - 2 p lot(r, y); gri d on
二分法程序:
计算调用函数:[c,n um ]=bisec t(0,1,1e-4)
fu ncti on [c,num ]=bisect (a,b,de lt a) %Inp ut –a,b 是取值区间范围 % -de lta 是允许误差
%O utput -c牛顿迭代法最后计算所得零点值 % -num 是迭代次数 ya = a + exp(a) - 2; yb = b + e xp(b) - 2;
if ya* yb>0
return;
end
for k=1:100
c=(a+b)/2;
yc=c+exp(c)- 2;
if abs(yc)<=delta
a=c;
b=c;
elseif yb*yc>0
b=c;
yb=yc;
else
a=c;
ya=yc;
end
if abs(b-a)<delta
num=k; %num为迭代次数
break;
end
end
c=(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:1000
y0=func(p0);
dy0=diff(func([p0p0+1e-8]))/1e-8;
p1=p0-y0/dy0;
err=abs(p1-p0);
p0=p1;
if(err<delta)
num=k;%num为迭代次数
break;
end
end
c=p0;
第2题:
由题意得到算式:
计算调用函数:[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;
fork=1:1000
y0=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;
end
end
c=p0;
第3题:求最小正数解
计算调用函数:[c,num]=newton(@func3, 1 ,1e-8)
程序:先用画图法估计出最小正解位置在1到2之间
画图程序:
function Test3()
% f(x)示意图, f(x) = cot(x)-(x.^2-1)./(2.*x); f(x) = 0 ezplot('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:1000
y0=func(p0);
dy0=diff(func([p0p0+1e-8]))/1e-8;
p1=p0-y0/dy0;
err=abs(p1-p0);
p0=p1;
if(err<delta)
num=k;
break;
end
end
c=p0;
第4题:精确至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) = 0
r =0:0.01:8;
y = r.^3-11.*r.^2+32.*r-28;
plot(r,y);
gridon
调用函数:
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;
fork=1:100
y0=func(p0);
dy0=diff(func([p0 p0+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(err<delta)
num=k;
break;
end
end
end
c= vpa(p0,8);
改进的牛顿算法程序:
function[c,num]=newton(func,p0,delta)
%Input -func是运算公式
% -p0是零点值
% -delta是允许误差
%Output -c牛顿迭代法最后计算所得零点值
% -num是迭代次数
num=-1;
for k=1:100
y0=func(p0);
dy0=diff(func([p0 p0+1e-8]))/1e-8;
if(dy0==0)
c= vpa(p0,8);
num=k;
break;
else
p1=p0-2*y0/dy0;%根据重根计算时,改进Newton法的收敛速度,可以采用在迭代函数中乘上重根数的方法进行改善。
err=abs(p1-p0);
p0=p1;
if(err<delta)
num=k;
break;
end
end
end
c=vpa(p0,8);
四、实验结果分析
第1题:
根据图片可以看出函数零点的值在0.4与0.5之间,牛顿迭代法时取0.5作为迭代初值。
第2题:
根据图片可以看出函数零点的值在0.02与0.03之间,可采用0.02作为迭代初值。
第3题:
根据图片可以看出函数最小正数零点的值在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)函数在处无限值,画图时注意使用符号函数ezplot。以1为代入点,最后迭代
次数为5。
第4题实验结果:
利用牛顿迭代法计算得到:
重根:c =2.00000000,num =25;
另一单根:c =7.00000000,num=7;
改进后牛顿迭代法重根计算结果:c=2.00000000,num =5;
从结果中可以看出牛顿迭代法在计算单根时比计算重根时的收敛速度快很多,针对重根的计算,改进后牛顿迭代法大大减小了迭代的次数,提高了收敛速度。