用MATLAB求解微分方程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任取k1、k2的一组初始值:k0=[2,1];
输入命令: k=lsqcurvefit('curvefun1',k0,t,c) 运行结果为: k =[ 1.3240 作图表示求解结果: t1=0:0.1:18; f=curvefun1(k,t1); plot(t,c,'ko',t1,f,'r-')
90 80 70 60 50 40 30 20 10 0
-1 -1.5 -2 -2.5 0
-0.5
500
1000
1500
2000
2500
3000
2、取t0=0,tf=3000,输入命令: [T,Y]=ode15s('vdp1000',[0 3000],[2 0]); plot(T,Y(:,1),'-')
例5
解微分方程组.
y1 ' = y2 y3 y2 ' = − y1 y3 y3 ' = −0.51 y1 y2 y1 (0) = 0, y2 (0) = 1, y3 (0) = 1
解: 令 y1=x,y2=y1’
则微分方程变为一阶微分方程组:
y1 ' = y2 y2 ' = 1000(1 − y12 ) y2 − y1 y (0) = 2, y (0) = 0 2 1
3、结果如图
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);
(1)
2. 由于弹头始终对准乙舰,故导弹的速度平行于乙舰与导弹头位置的差向量, (2)
(3)
3.因乙舰以速度v0沿直线x=1运动,设v0=1,则w=5,X=1,Y=t
因此导弹运动轨迹的参数方程为:
5 dx = (1 − x) dt 2 2 (1 − x) + (t − y ) 5 dy (t − y ) = 2 2 (1 − x) + (t − y ) dt x(0) = 0, y (0) = 0
解 输入命令 :
[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) 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
2. 用Matlab求常微分方程的数值解 求常微分方程的数值解
[t,x]=solver(’f’,ts,x0,options) , ( )
自变 量值 函数 值 ode45 ode23 ode113 ode15s ode23s 由待解 方程写 成的m文件名 ts=[t0,tf], 函数的 初值 t0、tf为自 变量的初 值和终值
4. 解导弹运动轨迹的参数方程 建立m-文件eq2.m如下: function dy=eq2(t,y) dy=zeros(2,1); dy(1)=5*(1-y(1))/sqrt((1-y(1))^2+(t-y(2))^2); dy(2)=5*(t-y(2))/sqrt((1-y(1))^2+(t-y(2))^2); 取t0=0,tf=2,建立主程序chase2.m如下: [t,y]=ode45('eq2',[0 2],[0 0]); Y=0:0.01:2; plot(1,Y,'-'), hold on plot(y(:,1),y(:,2),'*')
5 5 ) 处时被导弹击中. 当 x = 1时 y = ,即当乙舰航行到点 (1, 24 24 y 5 = 被击中时间为: t = . 若 v0=1, 则在 t=0.21 处被击中. v0 24v0
轨迹图如下
例: 饮酒模型 模型1:快速饮酒后,胃中酒精含量的变化率
dy = − k1 y dt y (0) = M
1 0.8
解
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.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 2 4 6 8 10 12
例1 求
d2y dx
2
= 0 应表达为:D2y=0.
du = 1 + u 2 的通解. dt
解 输入命令:dsolve('Du=1+u^2','t')
运行结果:u = tan(t-c)
例2
求微分方程的特解.
d 2 y dy 2 + 4 + 29 y = 0 dx dx y (0) = 0, y ' (0) = 15
∫
0
1 + y ' 2 dx = 5v0 t
(2)
由(1),(2)消去t整理得模型:
初值条件为: y (0) = 0
解即为导弹的运行轨迹:
1 (1 − x) y" = 1 + y '2 5
(3)
y ' ( 0) = 0
6
5 5 5 5 5 y = − (1 − x) + (1 − x) + 8 12 24
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的图形为“+”线.
导弹追踪问题 设位于坐标原点的甲舰向位于x轴上点A(1, 0)处的乙舰 发射导弹,导弹头始终对准乙舰.如果乙舰以最大的速度 v0(是常数)沿平行于y轴的直线行驶,导弹的速度是5v0,求 导弹运行的曲线方程.又乙舰行驶多远时,导弹将它击中? 解法一(解析法) 解法一
用MATLAB求解微分方程 求解微分方程
1. 微分方程的解析解
求微分方程(组)的解析解命令: dsolve(‘方程 ‘方程 方程1’, 方程 方程2’,…‘方程 ‘初始条件’, ‘自变量’) 方程n’, 初始条件 初始条件’ 自变量 自变量’ 方程 方程
记号: 在表达微分方程时,用字母 D 表示求微分,D2、D3 等 表示求高阶微分.任何 D 后所跟的字母为因变量,自变量可以指 定或由系统规则选定为确省. 例如,微分方程
假设导弹在 t 时刻的位置为 P(x(t), y(t)),乙舰位于 Q(1, v 0 t ) .
由于导弹头始终对准乙舰,故此时直线 PQ 就是导弹的轨迹曲线弧 OP 在点 P 处的切线,
v0 t − y y' = 即有 1− x v 0 t = (1 − x) y '+ y 即
x
(1)
又根据题意,弧 OP 的长度为 AQ 的 5 倍, 即
⇒
1.建立m-文件eq1.m function dy=eq1(x,y) dy=zeros(2,1); dy(1)=y(2); dy(2)=1/5*sqrt(1+y(1)^2)/(1-x); 2. 取x0=0,xf=0.9999,建立主程序ff6.m如下: x0=0,xf=0.9999 [x,y]=ode15s('eq1',[x0 xf],[0 0]); plot(x,y(:,1),’b.') hold on y=0:0.01:2; plot(1,y,’b*') 结论: 导弹大致在( , 结论 导弹大致在(1,0.2)处击中乙舰 )
解 输入命令: y=dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x') 运行结果为 : 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
4
5 5 ) 处时被导弹击中. 当 x = 1时 y = ,即当乙舰航行到点 (1, 24 24 y 5 = . 若 v0=1, 则在 t=0.21 处被击中. 被击中时间为: t = v0 24v0
解法二(数值解) 解法二 令y1=y,y2=y1’,将方程(3)化为一阶微分方程组。
1 (1 − x ) y ' ' = 1+ y2 5
注意: 注意
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
Mk1 x= (e − k2t − e − k1t ) k1 − k 2
用以下一组数据拟合上述模型中的参数k1、k2:
时间(小时) 酒精含量 时间(小时) 酒精含量 0.25 30 6 38 0.5 68 7 35 0.75 75 8 28 1 82 9 25 1.5 82 10 18 2 77 11 15 2.5 68 12 12 3 68 13 10 3.5 58 14 7 4 51 15 7 4.5 50 16 4 5 41
0.Leabharlann Baidu573]
0
2
4
6
8
10
12
14
16
18
模型2:慢速饮酒时,体液中酒精含量的变化率
dx + k2 x = a dt x(0) = 0
其中
M a= T
M为饮酒的总量,T为饮酒的时间
则有;
a x = (1 − e − k 2 t ) k2
y = Me − k1t 即
模型2:快速饮酒后,体液中酒精含量的变化率
dx + k 2 x = k1Me − k1t dt x(0) = 0
用Matlab求解模型2: syms x y k1 k2 M t x=dsolve('Dx+k2*x=k1*M*exp(-k1*t)','x(0)=0','t') 运行结果: M*k1/(-k1+k2)*exp(-k2*t+t*(-k1+k2))-exp(-k2*t)*M*k1/(-k1+k2) 即:
ode23:组合的2/3阶龙格-库塔-芬尔格算法 ode45:运用组合的4/5阶龙格-库塔-芬尔格算法 用于设定误差限(缺省时设定相对误差10-3, 绝对误差10-6), 命令为:options=odeset(’reltol’,rt,’abstol’,at), rt,at:分别为设定的相对误差和绝对误差.
M=64000/490 =130.6122 (毫克/百毫升) 建立函数文件: function f=curvefun1(k,t) f=k(1)*64000/490*(exp(-k(2)*t)-exp(-k(1)*t))/(k(1)-k(2)) 输入拟合数据:
t=[0 0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10 11 12 13 14 15 16]; c=[0 30 68 75 82 82 77 68 68 58 51 50 41 38 35 28 25 18 15 12 10 7 7 4];
y '1 = y2 y ' = 1 1 + y 2 /(1 − x) 1 2 5
解法三(建立参数方程求数值解) 解法三
设时刻t乙舰的坐标为(X(t),Y(t)),导弹的坐标为(x(t),y(t)).
dx 2 dy 2 2 1.设导弹速度恒为 w ,则 ( ) + ( ) = w dt dt
dx dt = λ X − x , λ > 0 即: Y − y dy dt w dx ( X − x) dt = 2 2 ( X − x) + (Y − y ) 消去λ得: dy w = (Y − y ) 2 2 dt ( X − x) + (Y − y )