方程的近似根与迭代法
- 格式:doc
- 大小:114.50 KB
- 文档页数:15
第五讲 方程的近似根与迭代法
实验目的:
1.理解求方程近似解的二分法、切线法.
2.了解迭代法的思想.
3.用matlab编二分法、切线法的程序.
实验内容:
1.学习matlab命令.
matlab的while-end循环语句和C语言的while循环语句类似,while循环的一般形式是:
while表达式
循环体
end
只要表达式的结果非零,循环体语句就重复执行.
例1.利用while循环解答:使n!是100位数的第一个n是几?
解:n=1;
nj=1; while nj<1e100
nj=nj*n;
n=n+1;
end
n=n-1
2.二分法求方程的近似根
求方程的近似解,可分两步来做:
(1)确定根的大致范围,就是确定一个区间[a,b],使所求的根是位于这个区间内的唯一实根,这一步工作称为根的隔离,区间[a,b]称为所求实根的隔离区间.为了确定根的隔离区间,可以先画出y=f(x)的图形,然后从图上定出它与x轴交点的大概位置.
(2)以根的隔离区间的端点作为根的初始近似值,逐步改善根的近似值的精确度,直至求得满足精确度要求的根的近似解.完成这一步工作有多种方法,这里介绍二分法和切线法.
设f(x)在区间[a,b]上连续,f(a)f(b)<0,且方程f(x)=0在(a,b)内仅有一个实根,那么,[a,b]就是这个根的隔离区间. 取[a,b]的中点,计算,如果,则;如果与同号,那么,取,,由即知,,且;以为新的隔离区间,重复上述做法,当时,可求得,且如此重复n次,可得,且,由此可知,如果以或作为的近似值,那么,其误差小于.
例2.用二分法求方程的实根的近似值,使误差不超过.
解:(1)求根的初始隔离区间.
在matlab工作区输入命令:
ezplot('x^3+1.1*x^2+0.9*x-1.4');grid on;
画出曲线图形.
通过观察,根应在-2和2之间,进一步画出该部分的图形:
ezplot('x^3+1.1*x^2+0.9*x-1.4',[-2,2]);grid on;
更清楚看到根在0和1之间.
(2)编写程序如下:
f=input('输入函数f(x)=');
qujian=input('输入区间='); err=input('请输入误差=');
a=qujian(1);
b=qujian(2);
yc=1;
while((b-a)>err)&(yc~=0);
c=(a+b)/2;
x=a;
ya=eval(f);
x=b;
yb=eval(f);
x=c;
yc=eval(f);
if ya*yc<0
b=c;
else a=c;
end
x0=c
end
存为文件erfanfa.m
调用erfanfa的如下结果:
erfenfa
输入函数f(x)='x^3+1.1*x^2+0.9*x-1.4'
输入区间=[0,1]
请输入误差=0.001
x0=
0.5000
x0=
0.7500
x0= 0.6250
x0=
0.6875
x0=
0.6563
x0=
0.6719
x0=
0.6641
x0=
0.6680
x0=
0.6699
x0=
0.6709 三.迭代法
迭代是一种逐步逼近的方法,已知方程f(x)=0的一个近似根后,通常使用某个固定公式反复校正根的近似值,使之逐步精确化,一直到满足给定的精度要求为止.
具体做法是,把给定方程f(x)=0改写成等价形式
在根附近任取一点作为的近似值,把代入上式右端:
一般(时,).把作为根的新的近似值代入公式得.重复上述步骤,则有如下迭代公式:
()
其中称为迭代函数,并有如下迭代序列
如果迭代序列的极限存在,则称迭代过程收敛,显然
即
所以
如果迭代序列的极限不存在,则称迭代过程发散.
例3.求方程在x=1.5附近的根.
解:将方程改写成下列形式:
由此得迭代公式
()
迭代初值.matlab程序如下:
x0=1.5;
fori=1:20
x0=(x0+1)^(1/3)
end
运行如下:
x0= 1.35720880829745
x0=
1.33086095880143
x0=
1.32588377423235
x0=
1.32493936340188
x0=
1.32476001129270
x0=
1.32472594522689
x0=
1.32471947453436
x0=
1.32471824544894 x0=
1.32471801198820
x0=
1.32471796764309
x0=
1.32471795921988
x0=
1.32471795761992
x0=
1.32471795731601
x0=
1.32471795725828
x0=
1.32471795724732
x0= 1.32471795724523
x0=
1.32471795724484
x0=
1.32471795724476
x0=
1.32471795724475
x0=
1.32471795724475
看到最后两项一样,即,可以认为,满足方程,即为所求根的近似值.
=1.32471795724475
上述迭代过程是收敛的.
如果将方程改写成如下等价形式
则有迭代公式
迭代初值仍取,则
=2.375,=12.39,...
迭代过程发散.
本例说明,迭代过程收敛是有一定条件的,发散的迭代过程是没有意义的.
四.切线法
设f(x)在[a,b]上具有二阶导数.f(a)f(b)<0,且及在[a,b]上保持定号,此时,方程f(x)=0在(a,b)内有唯一实根.[a,b]为根的一个隔离区间.如果在纵坐标与二阶导数同号的那个端点作切线,这切线与x轴交点的横坐标就比该端点更接近于方程的根.
取该端点为,则点处的切线方程为
时,解出与x轴的交点的横坐标
它比更接近于方程的根.它可以作为根的近似值. 在点作切线,可得根的近似值.如此下去,一般,在点作切线,可得根的近似值
例4.用切线法求方程的实根的近似值,使误差不超过.
解:[0,1]是根的一个隔离区间,在[0,1]上
f(1)>0与同号,所以取=1为迭代初始值.用m语言编出一般的程序如下:
f=input('输入函数:f(x)=');
n=input('请输入迭代次数:n=');
x0=input('请输入迭代初始值:x0=');
f1=diff(f);
fori=1:n
x=x0;
fx0=eval(f);
f1x0=eval(f1);
x0=x0-fx0/f1x0
end 存为qiexianfa.m,运行结果如下:
qiexianfa
输入函数:f(x)='x^3+1.1*x^2+0.9*x-1.4'
请输入迭代次数:n=6
请输入迭代初始值:x0=1
x0=
0.73770491803279
x0=
0.67416881167393
x0=
0.67066757559451
x0=
0.67065731081384
x0=
0.67065731072581
x0=
0.67065731072581