微分方程MATLAB求解简介

Download Report

Transcript 微分方程MATLAB求解简介

实验目的
1、学会用Matlab求简单微分方程的解析解.
2、学会用Matlab求微分方程的数值解.
实验内容
1、求简单微分方程的解析解.
2、求微分方程的数值解.
实验软件
MATLAB
求微分方程的数值解
(一)常微分方程数值解的定义
(二)建立数值解法的一些途径
(三)用Matlab软件求常微分方程的数值解
返 回
微分方程的解析解
求微分方程(组)的解析解命令:
dsolve(‘方程1’, ‘方程2’,…‘方程n’, ‘初始条件’, ‘自变量’)
记号: 在表达微分方程时,用字母 D 表示求微分,D2、D3 等
表示求高阶微分.任何 D 后所跟的字母为因变量,自变量可以指
定或由系统规则选定为确省.
例如,微分方程
例1
求
解
d2y
2
dx
du
 1 u 2
dt
 0 应表达为:D2y=0.
的通解.
输入命令:dsolve('Du=1+u^2','t')
结
果:u = tg(t-c)
To Matlab(ff1)
例2
求微分方程的特解.
d 2 y
dy
 2  4  29y  0
 dx
dx

 y (0)  0, y ' (0)  15
解 输入命令: y=dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x')
To Matlab(ff2)
结 果 为 : y =3e-2xsin(5x)
例3
求微分方程组的通解.
 dx
 dt  2 x  3 y  3z
 dy
  4 x  5 y  3z
 dt
 dz  4 x  4 y  2 z
 dt
解 输入命令 :
[x,y,z]=dsolve('Dx=2*x-3*y+3*z','Dy=4*x-5*y+3*z','Dz=4*x-4*y+2*z', 't');
x=simple(x)
% 将x化简
y=simple(y)
To Matlab(ff3)
z=simple(z)
结 果 为:x = (c1-c2+c3+c2e -3t-c3e-3t)e2t
y = -c1e-4t+c2e-4t+c2e-3t-c3e-3t+(c1-c2+c3)e2t
z = (-c1e-4t+c2e-4t+c1-c2+c3)e2t
返 回
微分方程的数值解
(一)常微分方程数值解的定义
在生产和科研中所处理的微分方程往往很复杂且大多
得不出一般解。而在实际上对初值问题,一般是要求得
到解在若干个点上满足规定精确度的近似值,或者得到
一个满足精确度要求的便于计算的表达式。
因此,研究常微分方程的数值解法是十分必要的。
 y' f(x,y)
对常微分方程:
,其数值解是指由初始点x 0 开始
 y(x0 )  y 0
的若干离散的x值处,即对x0  x1  x 2    x n,
求出准确值y(x1 ),
y ( x 2 ),, y ( x n ) 的相应近似值y1 , y 2 ,, y n。
返 回
(二)建立数值解法的一些途径
设 x i 1  xi  h, i  0,1,2,  n  1, 可用以下离散化方法求解微分方程:
 y' f(x,y)

 y(x0 )  y 0
1、用差商代替导数
若步长h较小,则有
y ( x  h)  y ( x )
y ' ( x) 
h
故有公式:
 yi 1  yi  hf ( xi , yi )
i  0,1,2,, n - 1

 y 0  y ( x0 )
此即欧拉法。
2、使用数值积分
对方程y’=f(x,y), 两边由xi到xi+1积分,并利用梯形公式,有:
y ( xi 1 )  y ( xi )  
xi 1
xi
故有公式:
f (t , y (t ))dt 
xi 1  xi
[ f ( xi , y ( xi ))  f ( xi 1 , y ( xi 1 ))]
2
h

 y i 1  y i  [ f ( xi , y i )  f ( xi 1 , y i 1 )]

2
 y 0  y ( x0 )
实际应用时,与欧拉公式结合使用:
 y i(01)  y i  hf ( xi , y i )

h
 ( k 1)
(k )
y

y

[
f
(
x
,
y
)

f
(
x
,
y
i
i
i
i 1
i 1 )] k  0,1,2, 
 i 1
2
对于已给的精确度,当满足 yi(k11)  yi(k1)   时,
取 y i 1  y(i k11),
然后继续下一步y i  2 的计算。
此即改进的欧拉法。
3、使用泰勒公式
以此方法为基础,有龙格-库塔法、线性多步法等方
法。
4、数值公式的精度
当一个数值公式的截断误差可表示为O(hk+1)时
(k为正整数,h为步长),称它是一个k阶公式。
k越大,则数值公式的精度越高。
•欧拉法是一阶公式,改进的欧拉法是二阶公式。
•龙格-库塔法有二阶公式和四阶公式。
•线性多步法有四阶阿达姆斯外插公式和内插公式。
返 回
(三)用Matlab软件求常微分方程的数值解
[t,x]=solver(’f’,ts,x0,options)
自变
量值
函数
值
ode45
ode23
ode113
ode15s
ode23s
由待解
方程写
成的m文件名
ts=[t0,tf], 函数的
初值
t0、tf为自
变量的初
值和终值
ode23:组合的2/3阶龙格-库塔-芬尔格算法
ode45:运用组合的4/5阶龙格-库塔-芬尔格算法
用于设定误差限(缺省时设定相对误差10-3, 绝对误差10-6),
命令为:options=odeset(’reltol’,rt,’abstol’,at),
rt,at:分别为设定的相对误差和绝对误差.
注意:
1、在解n个未知函数的方程组时,x0和x均为n维向量,
m-文件中的待解方程组应以x的分量形式写成.
2、使用Matlab软件求数值解时,高阶微分方程必须
等价地变换成一阶微分方程组.
d 2x
dx
 2  1000(1  x 2 )  x  0
例 4  dt
dt

x(0)  2; x' (0)  0

解: 令 y1=x,y2=y1’
则微分方程变为一阶微分方程组:
y1 '  y2


2
y
'

1000
(
1

y
 2
1 ) y2  y1
 y (0)  2, y (0)  0
2
 1
2
1.5
1
0.5
0
1、建立m-文件vdp1000.m如下:
function dy=vdp1000(t,y)
dy=zeros(2,1);
dy(1)=y(2);
dy(2)=1000*(1-y(1)^2)*y(2)-y(1);
-0.5
-1
-1.5
-2
-2.5
2、取t0=0,tf=3000,输入命令:
[T,Y]=ode15s('vdp1000',[0 3000],[2 0]);
plot(T,Y(:,1),'-')
3、结果如图
0
500
1000
1500
2000
2500
3000
To Matlab(ff4)
例 5 解微分方程组.
y1 '  y2 y3


y2 '   y1 y3


y3 '  0.51 y1 y2


 y1 (0)  0, y2 (0)  1, y3 (0)  1
解
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
1、建立m-文件rigid.m如下:
function dy=rigid(t,y)
dy=zeros(3,1);
dy(1)=y(2)*y(3);
dy(2)=-y(1)*y(3);
dy(3)=-0.51*y(1)*y(2);
-0.8
-1
0
2
4
6
8
10
12
To Matlab(ff5)
2、取t0=0,tf=12,输入命令:
[T,Y]=ode45('rigid',[0 12],[0 1 1]);
plot(T,Y(:,1),'-',T,Y(:,2),'*',T,Y(:,3),'+')
3、结果如图
返 回
图中,y1的图形为实线,y2的图形为“*”线,y3的图形为“+”线.