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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程名称数学软件实验班级数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)()(

],[],[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; %用于记录迭代次数