非线性方程的二分法迭代法内含matlab程序代码.docx
《非线性方程的二分法迭代法内含matlab程序代码.docx》由会员分享,可在线阅读,更多相关《非线性方程的二分法迭代法内含matlab程序代码.docx(9页珍藏版)》请在冰豆网上搜索。
非线性方程的二分法迭代法内含matlab程序代码
课程名称
数学软件实验
班级
数0901
学号
0912020107
姓名
李亚强
实验课题
非线性方程的二分法,迭代法,松弛迭代法,Aitken迭代法,Steffensen迭代法
实验目的
熟悉非线性方程的二分法,迭代法,松弛迭代法,Aitken迭代法,Steffensen迭代法
实验要求
运用Matlab/C/C++/Java/Maple/Mathematica等其中一种语言完成
实验内容
非线性方程的二分法
非线性方程的迭代法
非线性方程的松弛迭代法
非线性方程的Aitken迭代法
非线性方程的Steffensen迭代法
成绩
教师
实验报告
一、实验名称:
非线性方程的二分法,迭代法,松弛迭代法,Aitken迭代法,Steffensen迭代法。
二、实验目的:
进一步熟悉理解掌握最速下降法与共轭梯度法解法思路熟悉非线性方程的二分法,迭代法,松弛迭代法,Aitken迭代法,Steffensen迭代法,提高matlab编程能力。
三、实验要求:
非线性方程,应用二分法,迭代法,松弛迭代法,Aitken迭代法,Steffensen迭代法编程求解非线性方程的数值解。
四、实验原理:
1.二分法:
设函数
在区间
上连续,而且
,则
在区间
上至少有一个根。
首先确定有限区间:
依据零点定理。
设
,且
,则方程
在区间
上至少有一个根。
如果
在
上恒正或恒负,则此根唯一。
令
若
,则
为有根区间,否则
为有根区间。
记新的有根区间为
,
则
且
;对
重复上述做法得:
且
设所求的根为
,则
,即
,由
得
取
为
的近似解。
2.不动点迭代法
对于非线性方程:
常常可以化成等价的方程
可以选取一个初始近似值
,构造迭代序列
如此产生序列
。
这种迭代方法称为不动点迭代,或Picard迭代。
这个原理看似很容易直观理解,但是却有相当深刻的数学内涵,数学系的学生在泛函分析与微分方程理论等多门专业课程里都会遇到。
如果
连续,而且
,则
是
的一个不动点。
因此
为方程
的一个根。
3.Steffensen迭代法
该迭代法解方程
可以看成是另一种不动点迭代:
其中迭代函数为
得到迭代公式为:
;
4.Aitken加速迭代
由初值
出发,计算出
后,便可在曲线
上找到两个点
。
将这两点所在的直线与直线
的交点设为
,则
点满足:
解
得:
,将
视为新的初值,重复上述步骤可得
,由此产生迭代公式,
。
五、实验内容:
%二分法解非线性方程
functioner_fen(f,a,b,esp);
f1=subs(f,a);
f2=subs(f,b);
iff1*f2>0
disp('该方程在【a,b】上无解!
');
elseiff1==0
root=a;
elseiff2==0
root=b;
else
a0=a;
b0=b;
A=[];
whileabs((b0-a0)/2)>=esp
half=(a0+b0)/2;
fa=subs(f,a0);
fb=subs(f,b0);
fhalf=subs(f,half);
iffhalf==0
root=half;
break;
elseiffa*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;%计算结果
六、实验结果:
>>symsx;er_fen(sin(x),-2,1,1.0e-2)
root=
-0.0020
A=
-0.50000.2500-0.12500.0625-0.03130.0156
-0.00780.0039