资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,用 Matlab 求解微分方程,借助 Matlab 软件,可以方便地求出微分方程(组)的解析解和数值解。,微分方程(组)的解析解,求微分方程(组)解析解的命令为,dsolve(eqn1,eqn2,.,x),其中“eqn,i,”,表示第,i,个方程,“,x”,表示微分方程(组)中的自变量,默认时自变量为,t,。此外,在“eqn,i,”,表示的方程式中,用,D,表示求微分,,D2,、,D3,等表示求高阶微分,任何,D,后所跟的字母表示因变量。,例 8.5.1 求解一阶微分方程 d,y,/d,x,=1+,y,2,。,求通解,输入:dsolve(Dy=1+y2,x),输出:ans=tan(x+C1),求特解,输入:dsolve(Dy=1+y2,y(0)=1,x),输出:ans=tan(x+1/4*pi),例 8.5.2 求解下列微分方程的通解及,y,(0)=0 和,y,(0)=15 条件下的特解,求通解,输入: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),例 8.5.3 求解下列微分方程组,求通解,方式一,输入:,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,方式二,输入: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,求特解,输入: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中求微分方程数值解的函数有五个:ode45,ode23,ode113,ode15s,ode23s。调用格式为,t,x=solver(f,ts,x0,options),需要特别注意的是:,solver 可以取以上五个函数之一,不同的函数代表不同的内部算法:ode23 运用组合的 2/3 阶龙格库塔费尔贝算法,ode45 运用组合的 4/5 阶龙格库塔费尔贝算法。,通常使用函数,ode45,;,f 是由待解方程写成的m文件的文件名;,ts=t,0,t,f,,t,0,、t,f,为自变量的初值和终值;,x0为函数的初值;,options 用于设定误差限(可以缺省,缺省时设定为相对误差 10,3,绝对误差 10,6),程序为,options=odeset(reltol,rt,abstol,at),其中rt和at分别为设定的相对误差和绝对误差;,在解,n,个未知函数的方程组时,x0、x 均为,n,维向量,m 文件中待解方程组应以 x 的分量形式写成;,使用 Matlab 软件求数值解时,高阶微分方程必须等价地变换成一阶微分方程组。,例 8.5.4 求解下列微分方程,解:令,y,1,=,x,,,y,2,=y,1,,则微分方程变为一阶微分方程组:,(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.5 求解下列微分方程组,(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),+),运行程序,得到如图的结果。图中,y,1,的图形为实线,y,2,的图形为“*”线,y,3,的图形为“+”线。,例 8.5.6,导弹追踪问题,设位于坐标原点的甲舰向位于,x,轴上点,A,(1,0)处的乙舰发射导弹,导弹头始终对准乙舰。如果乙舰以最大的速度,v,0,(是常数)沿平行于,y,轴的直线行驶,导弹的速度是 5v,0,,求导弹运行的曲线方程。又乙舰行驶多远时,导弹将它击中?,解:如图所示,假设导弹在,t,时刻的位置为,P,(,x,(,t,),y,(,t,),乙舰位于,Q,(1,v,0,t,)。由于导弹头始终对准乙舰,故此时直线,PQ,就是导弹的轨迹曲线弧,OP,在点,P,处的切线,,于是有,即,又根据题意,弧,OP,的长度为|,AQ,|的 5 倍,于是,消去,t,,得到导弹追踪模型如下:,下面求解这个初值问题。,解法一 解析解,利用微分方程初值问题的解析解法,得导弹的运行轨迹为:,参见下图。,根据题意,乙舰始终沿平行于,y,轴的直线,x,=1 行驶,且由上式知,当,x,=1,时,y,=5/24,故当乙舰航行到点(1,5/24)处时被导弹击中。同时可求得被击中时间为:,t,=,y,/,v,0,=5/24,v,0,;若,v,0,=1,则在,t,=0.21 处被击中。,解法二 数值解,令,y,1,=,y,,,y,2,=,y,1,,将先前给出的,导弹追踪模型,化为一阶微分方程组,(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*),运行程序,得到如图所示的结果。从而得出结论:导弹大致在(1,0.2)处击中乙舰。,
展开阅读全文