用 Matlab 求解微分方程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方式二 输入:[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 = C2/exp(t)+C3*exp(t)^2 y = C2*exp(-t)+C3*exp(2*t)+exp(-2*t)*C1 z = C3*exp(2*t)+exp(-2*t)*C1
2
例 8.5.3 求解下列微分方程组
dx dt 2 x 3 y 3 z 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 = C2*exp(-t)+C3*exp(2*t) y = C2*exp(-t)+C3*exp(2*t)+exp(-2*t)*C1 z = C3*exp(2*t)+exp(-2*t)*C1
运行程序,得到如图的结果。图中,y1 的图 形为实线, y2 的图形为“ * ”线, y3 的图形为 1 “+”线。
0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 2 4 6 8 10 12
例 8.5.6 导弹追踪问题
设位于坐标原点的甲舰向位于 x 轴上点 A(1, 0) 处的乙舰发射导弹,导弹头始终对准乙 舰。如果乙舰以最大的速度 v0(是常数)沿平 行于 y 轴的直线行驶,导弹的速度是 5v0,求 导弹运行的曲线方程。又乙舰行驶多远时,导 弹将它击中?
解法二 数值解
令 y1 = y,y2 = y1,将先前给出的导弹追踪 模型化为一阶微分方程组
y1 ' y2 y ' 1 1 y 2 /(1 x) 1 2 5 y1 (0) 0, y2 (0) 0
(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]=ode45('eq1',[x0 xf],[0 0]); plot(x,y(:,1), 'b.') hold on y=0:0.01:2; plot(1,y, 'b*')
解:如图所示,假设导弹在 t 时刻的位置为 P(x(t), y(t)),乙舰位于 Q(1, v0t)。由于导弹头始终 对准乙舰,故此时直线 PQ 就是导弹的轨迹曲线 弧 OP 在点 P 处的切线,
于是有
v0 t y y' 1 x
即
v0t (1 x) y' y
又根据题意,弧 OP 的长度为 |AQ| 的 5 倍,于是
微分方程(组)的数值解 事实上,能够求得解析解的微分方程或微 分方程组少之又少,多数情况下需要求出微分 方程(组)的数值解。 Matlab 中求微分方程数值解的函数有五个: ode45,ode23,ode113,ode15s,ode23s。调用 格式为
[t, x] = solver (‘f’, ts, x0, options)
d y dy 4 29 y 0 2 dx dx
求通解 输入:y=dsolve('D2y+4*Dy+29*y=0', 'x') 输出:y = C1*exp(-2*x)*sin(5*x)+C2*exp(-2*x)*cos(5*x) 求特解 输入:y=dsolve('D2y+4*Dy+29*y=0', 'y(0)=0, Dy(0)=15', 'x') 输出:y = 3*exp(-2*x)*sin(5*x)
参见下图。
4 5
6 5
0.25
0.2
0.15
0.1
0.05
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
根据题意,乙舰始终沿平行于 y 轴的直线 x = 1 行驶,且由上式知,当 x = 1 时 y = 5/24,故 当乙舰航行到点 (1, 5/24) 处时被导弹击中。同时 可求得被击中时间为:t = y/v0 = 5/24v0;若 v0 = 1, 则在 t = 0.21 处被击中。
需要特别注意的是: ① solver 可以取以上五个函数之一,不同的 函数代表不同的内部算法: ode23 运用组合的 2/3 阶龙格—库塔—费尔贝算法,ode45 运用组 合的 4/5 阶龙格—库塔—费尔贝算法。通常使用 函数 ode45; ② f 是由待解方程写成的m文件的文件名; ③ ts=[t0, tf],t0、tf为自变量的初值和终值; ④ x0为函数的初值;
x
0
1 y' dx 5v0 t
2
消去 t,得到导弹追踪模型如下:
1 2 ( 1 x ) y " 1 y ' 5 y(0) 0, y(0) 0
下面求解这个初值问题。
解法一 解析解
利用微分方程初值问题的解析解法,得导弹 的运行轨迹为:
5 5 5 y (1 x) (1 x) 8 12 24
例 8.5.1 求解一阶微分方程 dy/dx = 1 + y2。 求通解 输入:dsolve(‘Dy=1+y^2’, ‘x’) 输出:ans = tan(x+C1) 求特解 输入:dsolve(‘Dy=1+y^2’, ‘y(0)=1’, ‘x’) 输出:ans = tan(x+1/4*pi)
例 8.5.2 求解下列微分方程的通解及 y(0) = 0 和 y (0) = 15 条件下的特解
⑤ options 用于设定误差限(可以缺省,缺 省时设定为相对误差 103,绝对误差 106), 程序为 options = odeset(‘reltol’, rt, ‘abstol’, at) 其中rt和at分别为设定的相对误差和绝对误差; ⑥ 在解 n 个未知函数的方程组时,x0、x 均 为 n 维向量,m 文件中待解方程组应以 x 的分量 形式写成; ⑦ 使用 Matlab 软件求数值解时,高阶微分 方程必须等价地变换成一阶微分方程组。
(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); (2) 取 t0=0,tf=3000,输入命令: [T,Y]=ode15s('vdp1000',[0 3000],[2 0]); plot(T,Y(:,1),'-') 运行程序,得到如图的结果。
例 8.5.4 求解下列微分方程 d 2x 2 dx 2 1000(1 x ) x 0 dt dt x(0) 2; x' (0) 0 解:令 y1 = x,y2 = y1,则微分方程变为一阶微 分方程组:
y1 ' y2 2 y ' 1000 ( 1 y 2 1 ) y 2 y1 y (0) 2, y (0) 0 2 1
求特解 输入:[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', 'x(0)=0', 'y(0)=1', 'z(0)=2', 't'); x=simple(x) % 将x化简 y=simple(y) z=simple(z) 输出:x = exp(2*t)-exp(-t) y = exp(2*t)-exp(-t)+exp(-2*t) z = exp(2*t)+exp(-2*t)
用 Matlab 求解微分方程
借助 Matlab 软件,可以方便地求出微分方 程(组)的解析解和数值解。
微分方程(组)的解析解 求微分方程(组)解析解的命令为
dsolve(‘eqn1’, ‘eqn2’, ..., ‘x’)
其中“eqni”表示第 i 个方程,“x”表示微分 方程(组)中的自变量,默认时自变量为 t。此 外,在“eqni”表示的方程式中,用 D 表示求 微分,D2、D3 等表示求高阶微分,任何 D 后 所跟的字母表示因变量。
(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); (2) 取 t0=0,tf=12,输入命令: [T,Y]=ode45('rigid',[0 12],[0 1 1]); plot(T,Y(:,1),'-',T,Y(:,2),'*',T,Y(:,3),'+')
运行程序,得到如图所示的结果。从而得出结 论:导弹大致在 (1, 0.2) 处击中乙舰。
2 1.8 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 0
0
0.1
00.7
0.8
0.9
1
2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2.5 0 500 1000 1500 2000 2500 3000
例 8.5.5 求解下列微分方程组 y1 ' y2 y3 y ' y y 2 1 3 y3 ' 0.51y1 y2 y1 (0) 0, y2 (0) 1, y3 (0) 1