二分法及迭代法求解非线性方程根
班级: 姓名: 方 学号: 日期:
一、实验目的
1、熟悉二分法及迭代法求解非线性方程根的数值算法;
2、用matlab软件实现二分法及迭代法,掌握迭代法的收敛性和收敛速度问题及其加速方法;
二、基本理论及背景
1、牛顿迭代法具有平方收敛的速度,所以在迭代过程中只要迭代几次就会得到很精确的解。这是牛顿迭代法比简单迭代法优越的地方,但是选定的初值要接近方程的解,否则有可能得不到收敛的结果,再者,牛顿迭代法计算量比较大。因每次迭代除计算函数值外还要计算微商值。
2、牛顿迭代理论推导:设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y =
f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值;
3、参考《二分法求非线性方程根》,实现二分算法,完成下面的题目:
1 求方程○的根,精度至少达到10-6;
1中方程根的收敛性: 比较迭代下列迭代法求解○
2
○,;
1中方程的根(精度至少达到10-6)2中收敛用牛顿法设计迭代函数求解○,并与○
的迭代法比较收敛的速度。。
三、算法设计及实现
1function f=fun1(x) 1、设计:方程○
f=exp(x)-x-3;;
2 function y=Exp2(x) ○
y=exp(x)-3;
function y=Exp3(x)
y=log(x+3);
牛顿迭代:
function df=Exp4(x)
df=exp(x)-1。
四、实验步骤
1打开matlab软件,1、○新建ErFen_Root.m文件,在窗口中编辑二分法数值积分函数程序代码,并保存在指定的文件夹下,在Current Directory窗口右边点击《Browse For Folder》按钮指向ErFen_Root.m文件;
2在Command ○Window中编辑相应要计算的题目的数值函数及相应的题目的表达式。
2、输出结果和初步分析说明(见附件一)。
五、使用说明实验结果分析
1、在Command Window窗口中编辑要调用的函数名与指定的函数名字不同导致出现错误,通过改正与函数名相同即可;在调用函数时要用单引号引用。
六、算法的改进和实验总结
在用二分法迭代求解的过程中,被调用的函数需要清楚的描述所要执行的问题的求解过程,在matlab函数调用时,执行函数一定要与函数同名。
七、源程序(见附件二)
附件一:
>> [val,n]=ErFen_Root('fun1',[0 3],1e-6)
0 1.5000 3.0000 -2.0000 -0.0183 14.0855
1.5000 2.2500 3.0000 -0.0183 4.2377 14.0855
1.5000 1.8750 2.2500 -0.0183 1.6458 4.2377
1.5000 1.6875 1.8750 -0.0183 0.7184 1.6458
1.5000 1.5938 1.6875 -0.0183 0.3284 0.7184
1.5000 1.5469 1.5938 -0.0183 0.1499 0.3284
1.5000 1.5234 1.5469 -0.0183 0.0645 0.1499
1.5000 1.5117 1.5234 -0.0183 0.0228 0.0645
1.5000 1.5059 1.5117 -0.0183 0.0022 0.0228
1.5000 1.5029 1.5059 -0.0183 -0.0081 0.0022
1.5029 1.5044 1.5059 -0.0081 -0.0030 0.0022
1.5044 1.5051 1.5059 -0.0030 -0.0004 0.0022
1.5051 1.5055 1.5059 -0.0004 0.0009 0.0022
1.5051 1.5053 1.5055 -0.0004 0.0002 0.0009
1.5051 1.5052 1.5053 -0.0004 -0.0001 0.0002
1.5052 1.5053 1.5053 -0.0001 0.0001 0.0002
1.5052 1.5052 1.5053 -0.0001 -0.0000 0.0001
1.5052 1.5053 1.5053 -0.0000 0.0000 0.0001
1.5052 1.5052 1.5053 -0.0000 0.0000 0.0000
1.5052 1.5052 1.5052 -0.0000 0.0000 0.0000
1.5052 1.5052 1.5052 -0.0000 0.0000 0.0000
1.5052 1.5052 1.5052 -0.0000 0.0000 0.0000
1.5052 1.5052 1.5052 -0.0000 0.0000 0.0000
1.5052 1.5052 1.5052 -0.0000 0.0000 0.0000
val =
1.5052
n =
24
>> val=DieDai('Exp2',1,1e-6)
跌代次数8
val =
-2.9475
>> val=DieDai('Exp3',1,1e-6)
跌代次数10
val =
1.5052
>> val=DieDai('Exp4',1,1e-6)
跌代次数
6
val =
Inf
>> NewtonDieDai('fun1','Exp4',1,1e-6)
x1 =
1.5377
n =
2
x1 =
1.5059
n =
3
x1 =
1.5052
n =
4
x1 =
1.5052
n =
5
跌代次数
5
ans =
1.5052
>>
function [val,n]=ErFen_Root(f,x,dalt)
% [val,n]=ErFen_root(f,x,dalt)
% f 要求根函数名
% x 初试有根区间
% dalt 精度,默认为10-5
% val 返回所得根
% n 跌代次数
if nargin
dalt=1e-5;
end
ab=x;i=0;x0=sum(ab)/2;
fa=feval(f,ab(1));
fb=feval(f,ab(2));
fx0=feval(f,x0);
while abs(fa-fb)>=dalt
i=1+i;
disp([ab(1) x0 ab(2) fa fx0 fb ]);% 显示跌代过程 if fx0*fa
ab(2)=x0;
fb=fx0;
else
ab(1)=x0;
fa=fx0;
end
x0=sum(ab)/2;
fx0=feval(f,x0);
if (ab(2)-ab(1))
disp('May not be root!');
break;
end
end
val=x0;
if nargout==2
n=i;
end
function val=DieDai(f,x0,delta) %用
if nargin
delta=1e-7;
end
n=1;
x1=feval(f,x0);
while abs(x1-x0)>delta
x0=x1;
x1=feval(f,x0);
n=n+1;
if n>100
exit('跌代出问题'); end
end
val=x1;
disp(['跌代次数']);%显示跌代次数 disp(n);
二分法及迭代法求解非线性方程根
班级: 姓名: 方 学号: 日期:
一、实验目的
1、熟悉二分法及迭代法求解非线性方程根的数值算法;
2、用matlab软件实现二分法及迭代法,掌握迭代法的收敛性和收敛速度问题及其加速方法;
二、基本理论及背景
1、牛顿迭代法具有平方收敛的速度,所以在迭代过程中只要迭代几次就会得到很精确的解。这是牛顿迭代法比简单迭代法优越的地方,但是选定的初值要接近方程的解,否则有可能得不到收敛的结果,再者,牛顿迭代法计算量比较大。因每次迭代除计算函数值外还要计算微商值。
2、牛顿迭代理论推导:设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y =
f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值;
3、参考《二分法求非线性方程根》,实现二分算法,完成下面的题目:
1 求方程○的根,精度至少达到10-6;
1中方程根的收敛性: 比较迭代下列迭代法求解○
2
○,;
1中方程的根(精度至少达到10-6)2中收敛用牛顿法设计迭代函数求解○,并与○
的迭代法比较收敛的速度。。
三、算法设计及实现
1function f=fun1(x) 1、设计:方程○
f=exp(x)-x-3;;
2 function y=Exp2(x) ○
y=exp(x)-3;
function y=Exp3(x)
y=log(x+3);
牛顿迭代:
function df=Exp4(x)
df=exp(x)-1。
四、实验步骤
1打开matlab软件,1、○新建ErFen_Root.m文件,在窗口中编辑二分法数值积分函数程序代码,并保存在指定的文件夹下,在Current Directory窗口右边点击《Browse For Folder》按钮指向ErFen_Root.m文件;
2在Command ○Window中编辑相应要计算的题目的数值函数及相应的题目的表达式。
2、输出结果和初步分析说明(见附件一)。
五、使用说明实验结果分析
1、在Command Window窗口中编辑要调用的函数名与指定的函数名字不同导致出现错误,通过改正与函数名相同即可;在调用函数时要用单引号引用。
六、算法的改进和实验总结
在用二分法迭代求解的过程中,被调用的函数需要清楚的描述所要执行的问题的求解过程,在matlab函数调用时,执行函数一定要与函数同名。
七、源程序(见附件二)
附件一:
>> [val,n]=ErFen_Root('fun1',[0 3],1e-6)
0 1.5000 3.0000 -2.0000 -0.0183 14.0855
1.5000 2.2500 3.0000 -0.0183 4.2377 14.0855
1.5000 1.8750 2.2500 -0.0183 1.6458 4.2377
1.5000 1.6875 1.8750 -0.0183 0.7184 1.6458
1.5000 1.5938 1.6875 -0.0183 0.3284 0.7184
1.5000 1.5469 1.5938 -0.0183 0.1499 0.3284
1.5000 1.5234 1.5469 -0.0183 0.0645 0.1499
1.5000 1.5117 1.5234 -0.0183 0.0228 0.0645
1.5000 1.5059 1.5117 -0.0183 0.0022 0.0228
1.5000 1.5029 1.5059 -0.0183 -0.0081 0.0022
1.5029 1.5044 1.5059 -0.0081 -0.0030 0.0022
1.5044 1.5051 1.5059 -0.0030 -0.0004 0.0022
1.5051 1.5055 1.5059 -0.0004 0.0009 0.0022
1.5051 1.5053 1.5055 -0.0004 0.0002 0.0009
1.5051 1.5052 1.5053 -0.0004 -0.0001 0.0002
1.5052 1.5053 1.5053 -0.0001 0.0001 0.0002
1.5052 1.5052 1.5053 -0.0001 -0.0000 0.0001
1.5052 1.5053 1.5053 -0.0000 0.0000 0.0001
1.5052 1.5052 1.5053 -0.0000 0.0000 0.0000
1.5052 1.5052 1.5052 -0.0000 0.0000 0.0000
1.5052 1.5052 1.5052 -0.0000 0.0000 0.0000
1.5052 1.5052 1.5052 -0.0000 0.0000 0.0000
1.5052 1.5052 1.5052 -0.0000 0.0000 0.0000
1.5052 1.5052 1.5052 -0.0000 0.0000 0.0000
val =
1.5052
n =
24
>> val=DieDai('Exp2',1,1e-6)
跌代次数8
val =
-2.9475
>> val=DieDai('Exp3',1,1e-6)
跌代次数10
val =
1.5052
>> val=DieDai('Exp4',1,1e-6)
跌代次数
6
val =
Inf
>> NewtonDieDai('fun1','Exp4',1,1e-6)
x1 =
1.5377
n =
2
x1 =
1.5059
n =
3
x1 =
1.5052
n =
4
x1 =
1.5052
n =
5
跌代次数
5
ans =
1.5052
>>
function [val,n]=ErFen_Root(f,x,dalt)
% [val,n]=ErFen_root(f,x,dalt)
% f 要求根函数名
% x 初试有根区间
% dalt 精度,默认为10-5
% val 返回所得根
% n 跌代次数
if nargin
dalt=1e-5;
end
ab=x;i=0;x0=sum(ab)/2;
fa=feval(f,ab(1));
fb=feval(f,ab(2));
fx0=feval(f,x0);
while abs(fa-fb)>=dalt
i=1+i;
disp([ab(1) x0 ab(2) fa fx0 fb ]);% 显示跌代过程 if fx0*fa
ab(2)=x0;
fb=fx0;
else
ab(1)=x0;
fa=fx0;
end
x0=sum(ab)/2;
fx0=feval(f,x0);
if (ab(2)-ab(1))
disp('May not be root!');
break;
end
end
val=x0;
if nargout==2
n=i;
end
function val=DieDai(f,x0,delta) %用
if nargin
delta=1e-7;
end
n=1;
x1=feval(f,x0);
while abs(x1-x0)>delta
x0=x1;
x1=feval(f,x0);
n=n+1;
if n>100
exit('跌代出问题'); end
end
val=x1;
disp(['跌代次数']);%显示跌代次数 disp(n);