您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 用-Matlab-求解微分方程
用Matlab求解微分方程借助Matlab软件,可以方便地求出微分方程(组)的解析解和数值解。微分方程(组)的解析解求微分方程(组)解析解的命令为dsolve(‘eqn1’,‘eqn2’,...,‘x’)其中“eqni”表示第i个方程,“x”表示微分方程(组)中的自变量,默认时自变量为t。此外,在“eqni”表示的方程式中,用D表示求微分,D2、D3等表示求高阶微分,任何D后所跟的字母表示因变量。例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条件下的特解求通解输入: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)029422ydxdydxyd例8.5.3求解下列微分方程组zyxdtdzzyxdtdyzyxdtdx244354332求通解方式一输入:[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)*C1z=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)^2y=C2*exp(-t)+C3*exp(2*t)+exp(-2*t)*C1z=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=[t0,tf],t0、tf为自变量的初值和终值;④x0为函数的初值;⑤options用于设定误差限(可以缺省,缺省时设定为相对误差103,绝对误差106),程序为options=odeset(‘reltol’,rt,‘abstol’,at)其中rt和at分别为设定的相对误差和绝对误差;⑥在解n个未知函数的方程组时,x0、x均为n维向量,m文件中待解方程组应以x的分量形式写成;⑦使用Matlab软件求数值解时,高阶微分方程必须等价地变换成一阶微分方程组。例8.5.4求解下列微分方程0)0(';2)0(0)1(1000222xxxdtdxxdtxd解:令y1=x,y2=y1,则微分方程变为一阶微分方程组:0)0(,2)0()1(1000''211221221yyyyyyyy(1)建立m文件vdp1000.m如下:functiondy=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',[03000],[20]);plot(T,Y(:,1),'-')运行程序,得到如图的结果。050010001500200025003000-2.5-2-1.5-1-0.500.511.52例8.5.5求解下列微分方程组1)0(,1)0(,0)0(51.0'''321213312321yyyyyyyyyyyy(1)建立m文件rigid.m如下:functiondy=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',[012],[011]);plot(T,Y(:,1),'-',T,Y(:,2),'*',T,Y(:,3),'+')运行程序,得到如图的结果。图中,y1的图形为实线,y2的图形为“*”线,y3的图形为“+”线。024681012-1-0.8-0.6-0.4-0.200.20.40.60.81例8.5.6导弹追踪问题设位于坐标原点的甲舰向位于x轴上点A(1,0)处的乙舰发射导弹,导弹头始终对准乙舰。如果乙舰以最大的速度v0(是常数)沿平行于y轴的直线行驶,导弹的速度是5v0,求导弹运行的曲线方程。又乙舰行驶多远时,导弹将它击中?解:如图所示,假设导弹在t时刻的位置为P(x(t),y(t)),乙舰位于Q(1,v0t)。由于导弹头始终对准乙舰,故此时直线PQ就是导弹的轨迹曲线弧OP在点P处的切线,于是有xytvy1'0即yyxtv')1(0又根据题意,弧OP的长度为|AQ|的5倍,于是tvdxyx0025'1消去t,得到导弹追踪模型如下:下面求解这个初值问题。0)0(,0)0('151)1(2yyyyx解法一解析解利用微分方程初值问题的解析解法,得导弹的运行轨迹为:参见下图。245)1(125)1(855654xxy00.10.20.30.40.50.60.70.80.9100.050.10.150.20.25根据题意,乙舰始终沿平行于y轴的直线x=1行驶,且由上式知,当x=1时y=5/24,故当乙舰航行到点(1,5/24)处时被导弹击中。同时可求得被击中时间为:t=y/v0=5/24v0;若v0=1,则在t=0.21处被击中。解法二数值解令y1=y,y2=y1,将先前给出的导弹追踪模型化为一阶微分方程组0)0(,0)0()1/(151''2121221yyxyyyy(1)建立m文件eq1.mfunctiondy=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',[x0xf],[00]);plot(x,y(:,1),'b.')holdony=0:0.01:2;plot(1,y,'b*')运行程序,得到如图所示的结果。从而得出结论:导弹大致在(1,0.2)处击中乙舰。00.10.20.30.40.50.60.70.80.9100.20.40.60.811.21.41.61.82
本文标题:用-Matlab-求解微分方程
链接地址:https://www.777doc.com/doc-5031879 .html