当前位置:文档之家› 非线性方程的二分法 迭代法 内含matlab程序代码

非线性方程的二分法 迭代法 内含matlab程序代码

课程名称数学软件实验班级数0901学号0912020107姓名李亚强
实验课题
非线性方程的二分法,迭代法,松弛迭代法,Aitken
迭代法,Steffensen迭代法
实验目的
熟悉非线性方程的二分法,迭代法,松弛迭代法,
Aitken迭代法,Steffensen迭代法
实验要求
运用Matlab/C/C++/Java/Maple/Mathematica等其中
一种语言完成
实验内容非线性方程的二分法
非线性方程的迭代法
非线性方程的松弛迭代法
非线性方程的Aitken迭代法
非线性方程的Steffensen迭代法
成绩教师
实验报告1、实验名称:非线性方程的二分法,迭代法,松弛迭代法,Aitken 迭代法,Steffensen 迭代法。

2、实验目的:进一步熟悉理解掌握最速下降法与共轭梯度法解法
思路熟悉非线性方程的二分法,迭代法,松弛迭代法,Aitken 迭代法,Steffensen 迭代法,提高matlab 编程能力。

3、实验要求:非线性方程,应用二分法,迭代法,松弛迭代法,Aitken 迭代法,Steffensen 迭代法编程求解非线性方程的数值解。

4、实验原理:
1.二分法:
设函数在区间上连续,而且,则在区()f x [,]a b ()()0f a f b <()f x 间上至少有一个根。

[,]a b 首先确定有限区间:依据零点定理。

设 ,且],[)(b a C x f ∈,则方程 在区间上至少有一个根。

如果0)()(<b f a f 0)(=x f ),(b a 在上恒正或恒负,则此根唯一。

)('x f ),(b a 令若,则为有根111112,,()a a b b half a b ===+1()()0f a f half <1[,]a half 区间,否则为有根区间。

记新的有根区间为,1[,]half b ],[22b a 则且;对重复上述做法得:
],[],[2211b a b a ⊃)(112122a b a b -=-],[22b a
且......],[......],[],[2211⊃⊃⊃⊃n n b a b a b a )(211
a b a b n n n -=
--设所求的根为,则,即*x ......2,1],[=∈*n b a x n n ,由得......2,1=≤≤*n b x a n n 0)(21lim )(lim 1n =-=--∞→∞→a b a b n n n n *
lim lim x b a n n n n ==∞
→∞→取为的近似解。

1
()2
n n x half a b *==+*x 2.不动点迭代法
对于非线性方程:常常可以化成等价的方程()0f x =可以选取一个初始近似值,构造迭代序列()x x ϕ=0x 1(),1,2,k k x x k ϕ-== 如此产生序列。

这种迭代方法称为不动点迭代,或Picard
{}k x 迭代。

这个原理看似很容易直观理解,但是却有相当深刻的数学内涵,数学系的学生在泛函分析与微分方程理论等多门专业课程里都会遇到。

如果连续,而且,则是的一个不动点。

()k x ϕlim ()k k x p ϕ→∞
=p ϕ因此为方程的一个根。

p ()0f x =3.Steffensen 迭代法该迭代法解方程可以看成是另一种不动点迭代:()x x ϕ=其中迭代函数为1(),0,1,2,k k x x k ϕ+== 得到迭代公式为:2
(())()(())2()x x x x x x x ϕϕϕϕϕ-=--+
;(),()k k k k y x z y ϕϕ==21(),0,1,22k k k k k k k
y x x x k z y x +-=-=-+ 4.Aitken 加速迭代由初值出发,计算出后,便可在曲线0x )(),(1201x x x x ϕϕ==上找到两个点。

将这两点所在的直线与直线)(x y ϕ=),(),,(211100x x P x x P 的交点设为,则点满足:
解得:x y =3P 3P 01120111x x x x x x x x --=--1x ,将视为新的初值,重复上述步骤可得,由此产2102
12012x x x x x x x +--=1x 2x 生迭代公式,。

2121212++++++--=k k k k k k k x x x x x x x 5、实验内容:
%二分法解非线性方程
function er_fen(f,a,b,esp);f1=subs(f,a);f2=subs(f,b);if f1*f2>0 disp('该方程在【a,b】上无解!');elseif f1==0 root=a;
elseif f2==0
root=b;
else
a0=a;
b0=b;
A=[];
while abs((b0-a0)/2)>=esp half=(a0+b0)/2;
fa=subs(f,a0);
fb=subs(f,b0);
fhalf=subs(f,half);
if fhalf==0
root=half;
break;
elseif fa*fhalf<0
b0=half;
else
a0=half;
end
A=[A,half];
end
root=(b0+a0)/2;
end
root
A
%不动点迭代(Picard迭代)
function [x,time]=Picard(f,x0,tol) %结果给出迭代次数
%x0 为迭代初值
%tol 为误差容限
if(nargin==2)
tol=1.0e-5;
end
wucha=0.5; %设置误差初值
x1=x0; %x1 与x0 为前后两次计算结果time=0; %用于记录迭代次数
while(wucha>tol)
x1=subs(f,x0)+x0;
%迭代计算
wucha=abs(x1-x0);
x0=x1; % 更新x0的值在循环中这一句非常重要time=time+1;
%记下迭代次数
end
x=x1;
%Aitken加速收敛方法
function [gen,time]=Aitken(func,x0,tol)
if(nargin==2)
tol=1.0e-5;
end
gen=x0;
x(1:2)=[0,0];
t=0; %记录迭代次数
m=0;
x2=x0;
wucha=0.1; %设置误差初值
while(wucha>tol)
t=t+1; %记下累积一次迭代次数
x1=x2;
temp=gen;
gen=subs(func,temp)+temp;
x(t)=gen;
%迭代超过两次使用 Aitken加速
if(t>2)
m=m+1;
x2=x(m)-(x(m+1)-x(m))^2/(x(m+2)-2*x(m+1)+x(m));
%给出两次迭代误差
wucha=abs(x2-x1);
end
end
gen=x2;
%Steffensen加速方法计算非线性方程
function [gen,time]=Steffensen(fun,x0,tol) %如果缺省误差参数,默认为10 的-5次方
if(nargin==2)
tol=1.0e-5;
end
%设置误差初值
time=0; %记迭代次数
wucha=0.1; %设置前后两次迭代的误差
gen=x0;
while(wucha>tol)
x1=gen;
y=subs(fun,x1)+x1;
z=subs(fun,y)+y;
%加速公式
gen=x1-(y-x1)^2/(z-2*y+x1);
wucha=abs(gen-x1);
time=time+1; %迭代加一次的记录
end
gen; %计算结果
6、实验结果:
>> syms x;er_fen(sin(x),-2,1,1.0e-2)
root =
-0.0020
A =
-0.5000 0.2500 -0.1250 0.0625 -0.0313 0.0156
-0.0078 0.0039。

相关主题