matlab非线性方程求解解读Word格式.docx
- 文档编号:21829764
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:42.67KB
matlab非线性方程求解解读Word格式.docx
《matlab非线性方程求解解读Word格式.docx》由会员分享,可在线阅读,更多相关《matlab非线性方程求解解读Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
-
*
X
*X
k
m:
x
即,~为方程(2.1)的根。
由于方式(1.1)和方程(2.1)等价,所以,
式(2.2)称为迭代式,也称为迭代公式;
(x)可称为迭代函数。
称求得的序列{xk}k出为迭代序
列。
2.2程序和实例
下面是基于MATLAB的迭代法程序,用迭代格式png(xn),求解方程x=g(x),其中
初始值为po。
**************************************************************************
function[p,k,err,P]=fixpt(f1021,p0,tol,max1)
%f1021是给定的迭代函数。
%p0是给定的初始值。
%tol是给定的误差界。
%maxi是所允许的最大迭代次数。
%k是所进行的迭代次数加1。
%p是不动点的近似值。
%err是误差。
%P={p1,p2,…,pn}
P⑴=p0;
fork=2:
max1
P(k)=feval('
f1021'
P(k-1));
k,err=abs(P(k)-P(k-1))
p=P(k);
if(errvtol),
break;
end
ifk==max1
disp('
maximumnumberofiterationsexceeded'
);
end
P=P;
****************************************************************************
例2.1用上述程序求方程sinx-x—0的一个近似解,给定初始值x^0.5,误差界为
10^。
解:
先用m文件先定义一个名为f1021.m的函数文件。
functiony=f1021(x)
y=sin(x)/x;
建立一个主程序prog1021.m
clcclearfixpt(
all
'
0.5,10A(-5),20)
然后在MATLAB命令窗口运行上述主程序,即:
>
prog1021
计算结果如下。
k=3
err=0.1052
k=4
err=0.0292
k=5
err=0.0078
k=6
err=0.0021
k=7
err=5.7408e-004
k=8
err=1.5525e-004
k=9
err=4.1975e-005
k=10
err=1.1350e-005
k=11
err=3.0688e-006
P=Columns1through6
0.5000
0.9589
0.8537
0.8829
0.8751
0.8772
Columns7through11
0.8766
0.8768
0.8767
ans=0.8767
3二分法
3.1二分法原理
二分法是方程求解最直观、最简单的方法。
二分法以连续函数的介值定理为基础的。
由
介值定理知道,若函数f(x)区间[a,b]上连续,且f(a)*f(b):
:
0,即f(a)和f(b)负号相反,
则f(x)在[a,b]内一定有实根。
二分法的基本思想是:
用对分区间的方法根据分点处函数f(x)
的符号逐步将有限区间缩小,使在足够小的区间内,方程有且仅有一根。
下面简述其基本步骤。
首先记a^a.bo=b。
用中点x。
二也直将区间[a°
bo]等分成2个小区间:
⑻凶]和
2
[xo,bo]。
然后分析可能存在的三种情况:
如果f(a)*f(X。
)=0,则x。
是零点,也就是方程的根。
如果f(a)*f(xo):
0,则区间[ao,x。
]内存在零点。
如果f(xo)*f(b):
0,则区间[xo,bo]内存在零点。
对有根的新区间施行同样的操作,于是得到一系列有空的区间:
[a°
bo]二g’b』二a©
]二二[ak,bk]
(3.1)
其中每1个区间的长度都是前一区间长度的一半,最后1个区间的长度为:
b「akb「a
2k
如果取最后1个区间[ak,bk]的中点:
(3.2)
bk—ak
x“2
(3.3)
作为f(x)=0根的近似值,则有误差估计式:
...bk理...b-a
对于所给精度;
,若取k使得
b—a
则有,
(3.4)
(3.5)
(3.6)
3.2程序与实例
用二分法求解方程f(x)=0在有根区间[a,b]内的一个根,其中f(x)在[a,b]只有一个根的
情形
***************************************************************************
function[c,err,yc]=bisect(f1031,a,b,delta)
%f1031是所要求解的函数。
%a和b分别为有根区间的左右限。
%delta是允许的误差界。
%c为所求近似解。
%yc为函数f在c上的值。
%err是c的误差估计。
ya=feval('
f1031'
a);
yb=feval('
f'
b);
ifyb==0,c=b;
returnendifya*yb>
0,
(a,b)不是有根区间'
return
max1=1+round((log(b-a)-log(delta))/log
(2));
fork=1:
c=(a+b)/2;
yc=feval('
c);
ifyc==0a=c;
b=c;
returnelseifyb*yc>
0b=c;
yb=yc;
elsea=c;
ya=yc;
if(b-a)<
delta,return,end
k;
err=abs(b-a);
*****************************************************************************
例3.1用上述程序求方程x‘—x一1=0在区间[1.0,1.5]内的一个近似解,要求准确到小数
点后第2位。
先用m文件先定义一个名为f1031.m的函数文件。
functiony=f1031(x)y=xA3-x-1;
建立一个主程序prog1031.m
clc
clearall
bisect('
1.0,1.5,0.0005)
prog1031
ans=
1.3247
4牛顿法
4.1牛顿法原理
从前面迭代法,我们知道,迭代函数(x)构造的好坏,不仅影响收敛速度,而且迭代格
式有可能发散。
怎样选择一个迭代函数才能保证迭代序列一定收敛呢?
构代迭代函数的一条重要途径是用近似方程来代替原方程去求根。
因此,如果能将非线性方程(1.1)用线性方程去代替,那么,求近似根问题就很容易解决,而且十分方便。
牛顿(Newton)法就是一种将非线性方程线化的一种方法。
设Xk是方程(1.1)的一个近似根,把如果f(x)在Xk处作一阶Taylor展开,即:
f(x):
f(xk)f'
(Xk)(x-Xk)(4.1)
于是我们得到如下近似方程:
f(xjf'
(Xk)(x-Xk)=0(4.2)
设f'
(Xk)=0,则方程(10.2.1)的解为:
取~作为原方程(1.1)的新近似根X-,即令:
(Xk)
上式称为牛顿迭代格式。
用牛顿迭代格式求方程的根的方法就称为牛顿迭代法,简称牛顿法
牛顿法具有明显的几何意义。
方程:
(1045)
y=f(兀)f'
(Xk)(x-Xk)
是曲线y=f(X)上点(Xk,f(Xk))处的切线方程。
迭代格式(4.4)就是用切线式(4.5)的零点来代替曲线(1.1)的零点。
正因为如此,牛顿法也称为切线法。
牛顿迭代法对单根至少是二阶局部收敛的,而对于重根是一阶局部收敛的。
一般来说,牛顿法对初值Xo的要求较高,初值足够靠近X*时才能保证收敛。
若要保证初值在较大范围内收敛,则需对f(X)加一些条件。
如果所加的条件不满足,而导致牛顿法不收敛时,则需对牛顿法作一些改时,即可以采用下面的迭代格式:
Xk1=Xk,k=0,1,2,(4.6)
f(Xk)
式中,0:
'
:
1,称为下山因子。
因此,用这种方法求方程的根,也称为牛顿下山法。
牛顿法对单根收敛速度快,但每迭代一次,除需计算f(xj之外,还要计算f'
(Xk)的值。
如果f(X)比较复杂,计算f'
(Xk)的工作量就可能比较大。
为了避免计算导数值,我们可用差商来代替导数。
通常用如下几种方法:
(1)割线法。
如果用
f(Xk)-f(Xk4)
Xk_Xk4
代替f'
(Xk),贝U得到割线法的迭代格式为:
(4.7)
⑵拟牛顿法。
f(xk)-■f(xk—■f(Xk」))f(Xk)
(Xk),贝U得到拟牛顿法的迭代格式为:
xk1
f2(Xk)
f(Xk)-f做-f(Xk』)
(4.8)
⑶Steffenson法。
f(Xkf(Xk))-f(Xk)
f(Xk)
4.2程序与实例
1.牛顿法的程序
f(x)=0。
给定初值po,用牛顿法格式Pk-Pw」12山,k=1,2/,求解非线性方程f'
(P」
function[p1,err,k,y]=newton(f1041,df1041,p0,delta,max1)
%f1041是非线性函数。
%df1041是f1041的微商。
%p0是初始值。
%delta是给定允许误差。
%max1是迭代的最大次数。
%p1是牛顿法求得的方程的近似解。
%err是p0的误差估计。
%k是迭代次数。
%y=f(p1)
p0,feval('
f1041'
p0)
pl=p0-feval('
p0)/feval('
df1041'
pO);
err=abs(pl-pO);
pO=p1;
p1,err,k,y=feval('
p1)
if(err<
delta)|(y==0),
break,
例4.1用上述程序求方程x3-3x•2=0的一个近似解,给定初值为1.2,误差界为10$
先用m文件先定义二个名为f1041.m和df1041.m的函数文件。
functiony=f1041(x)y=xA3-3*x+2;
functiony=df1041(x)
y=3*xA2-3;
建立一个主程序prog1041.m
clear
newton('
'
1.2,10八(-6),18)
然后在MATLAB命令窗口运行上述主程序,即:
prog1041
p0=1.2000
ans=0.1280
p1=1.1030
err=0.0970
k=1
y=0.0329
y=
0.0329
p1=
1.0524
err=
0.0507
k=
0.0084
1.0264
0.0260
3
0.0021
1.0133
0.0131
4
5.2963e-004
1.0066
0.0066
5
1.3270e-004
1.0033
0.0033
6
3.3211e-005
1.0017
0.0017
7
8.3074e-006
1.0008
8.3157e-004
8
2.0774e-006
1.0004
4.1596e-004
9
5.1943e-007
1.0002
2.0802e-004
10
1.2987e-007
1.0001
1.0402e-004
11
3.2468e-008
5.2014e-005
12
8.1170e-009
1.0000
2.6008e-005
13
2.0293e-009
1.3004e-005
14
5.0732e-010
6.5020e-006
15
1.2683e-010
3.2510e-006
16
3.1708e-011
err=3.2510e-006
1.6255e-006
17
7.9270e-012
8.1277e-007
18
1.9817e-012
ans
这说明,经过18次迭代得到满足精度要求的值。
2.割线法的MATLAB实现
function[p1,err,k,y]=secant(f1042,p0,p1,delta,max1)%f1042是给定的非线性函数。
%p0,p1为初始值。
%delta为给定误差界。
%max1是迭代次数的上限。
%p1为所求得的方程的近似解。
%err为p1-p0的绝对值。
%k为所需的迭代次数。
%y=f(pi)
p0,p1,feval('
f1042'
p0),feval('
p1),k=0;
p2=pl-feval('
p1)*(p1-p0)/(feval('
p1)-feval('
p0));
err=abs(p2-p1);
p0=p1;
pl=p2;
p1);
******************************************************************************
例4.2用上述程序求方程x‘-x•2=0的一个近似解,给定初值为-1.5,-1.52,误差界为
10B
先用m文件先定义一个名为f1042.m的函数文件。
functiony=f1042(x)
y=xA3-x+2;
建立一个主程序prog1042.m
secant('
-1.5,-1.52,10八(-6),11)
prog1042
p0=
-1.5000
-1.5200
0.1250
0.0082
-1.5214
0.0014
1
err=2.2961e-005
k=2p1=-1.5214err=2.4318e-008
-1.5214。
ans=-1.5214
这就表明,经过3次迭代得到满足精度要求的的近似解
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab 非线性 方程 求解 解读
![提示](https://static.bdocx.com/images/bang_tan.gif)