1.微分方程的解析解求微分方程(组)的解析解命令:dsolve(‘方程1’,‘方程2’,…‘方程n’,‘初始条件’,‘自变量’)记号:在表达微分方程时,用字母D表示求微分,D2、D3等表示求高阶微分.任何D后所跟的字母为因变量,自变量可以指定或由系统规则选定为确省.例如,微分方程022dxyd应表达为:D2y=0.例1求21udtdu的通解.运行结果:u=tan(t-c)用MATLAB求解微分方程解输入命令:dsolve('Du=1+u^2','t')例2求微分方程的特解.15)0(',0)0(029422yyydxdydxyd解输入命令:y=dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x')运行结果为:y=3e-2xsin(5x)例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=simple(x)%将x化简y=simple(y)z=simple(z)运行结果为:x=(c1-c2+c3+c2e-3t-c3e-3t)e2ty=-c1e-4t+c2e-4t+c2e-3t-c3e-3t+c1-c2+c3)e2tz=(-c1e-4t+c2e-4t+c1-c2+c3)e2t2.用Matlab求常微分方程的数值解[t,x]=solver(’f’,ts,x0,options)ode45ode23ode113ode15sode23s由待解方程写成的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软件求数值解时,高阶微分方程必须等价地变换成一阶微分方程组.注意:例40)0(';2)0(0)1(1000222xxxdtdxxdtxd解:令y1=x,y2=y1’则微分方程变为一阶微分方程组:0)0(,2)0()1(1000''211221221yyyyyyyy1、建立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),'-')3、结果如图050010001500200025003000-2.5-2-1.5-1-0.500.511.52例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),'+')3、结果如图024681012-1-0.8-0.6-0.4-0.200.20.40.60.81图中,y1的图形为实线,y2的图形为“*”线,y3的图形为“+”线.导弹追踪问题设位于坐标原点的甲舰向位于x轴上点A(1,0)处的乙舰发射导弹,导弹头始终对准乙舰.如果乙舰以最大的速度v0(是常数)沿平行于y轴的直线行驶,导弹的速度是5v0,求导弹运行的曲线方程.又乙舰行驶多远时,导弹将它击中?解法一(解析法)假设导弹在t时刻的位置为P(x(t),y(t)),乙舰位于),1(0tvQ.由于导弹头始终对准乙舰,故此时直线PQ就是导弹的轨迹曲线弧OP在点P处的切线,即有xytvy1'0即yyxtv')1(0(1)又根据题意,弧OP的长度为AQ的5倍,即tvdxyx0025'1(2)由(1),(2)消去t整理得模型:(3)'151)1(2yyx初值条件为:0)0(y0)0('y解即为导弹的运行轨迹:245)1(125)1(855654xxy当1x时245y,即当乙舰航行到点)245,1(处时被导弹击中.被击中时间为:00245vvyt.若v0=1,则在t=0.21处被击中.解法二(数值解)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]=ode15s('eq1',[x0xf],[00]);plot(x,y(:,1),’b.')holdony=0:0.01:2;plot(1,y,’b*')结论:导弹大致在(1,0.2)处击中乙舰2151'')1(yyx)1/(151''21221xyyyy令y1=y,y2=y1’,将方程(3)化为一阶微分方程组。解法三(建立参数方程求数值解)设时刻t乙舰的坐标为(X(t),Y(t)),导弹的坐标为(x(t),y(t)).1.设导弹速度恒为w,则222)()(wdtdydtdx(1)2.由于弹头始终对准乙舰,故导弹的速度平行于乙舰与导弹头位置的差向量,即:yYxXdtdydtdx,0(2)消去λ得:)()()()()()(2222yYyYxXwdtdyxXyYxXwdtdx(3)3.因乙舰以速度v0沿直线x=1运动,设v0=1,则w=5,X=1,Y=t因此导弹运动轨迹的参数方程为:0)0(,0)0()()()1(5)1()()1(52222yxytytxdtdyxytxdtdx4.解导弹运动轨迹的参数方程建立m-文件eq2.m如下:functiondy=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',[02],[00]);Y=0:0.01:2;plot(1,Y,'-'),holdonplot(y(:,1),y(:,2),'*')当1x时245y,即当乙舰航行到点)245,1(处时被导弹击中.被击中时间为:00245vvyt.若v0=1,则在t=0.21处被击中.轨迹图如下例:饮酒模型模型1:快速饮酒后,胃中酒精含量的变化率Myykdtdy)0(1模型2:快速饮酒后,体液中酒精含量的变化率0)0(112xMekxkdtdxtk即tkMey1用Matlab求解模型2:symsxyk1k2Mtx=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)即:)(12211tktkeekkMkx用以下一组数据拟合上述模型中的参数k1、k2:时间(小时)0.250.50.7511.522.533.544.55酒精含量306875828277686858515041时间(小时)678910111213141516酒精含量3835282518151210774M=64000/490=130.6122(毫克/百毫升)建立函数文件:functionf=curvefun1(k,t)f=k(1)*64000/490*(exp(-k(2)*t)-exp(-k(1)*t))/(k(1)-k(2))输入拟合数据:t=[00.250.50.7511.522.533.544.55678910111213141516];c=[03068758282776868585150413835282518151210774];任取k1、k2的一组初始值:k0=[2,1];输入命令:k=lsqcurvefit('curvefun1',k0,t,c)运行结果为:k=[1.32400.2573]作图表示求解结果:t1=0:0.1:18;f=curvefun1(k,t1);plot(t,c,'ko',t1,f,'r-')0246810121416180102030405060708090模型2:慢速饮酒时,体液中酒精含量的变化率0)0(2xaxkdtdx则有;)1(22tkekax其中TMaM为饮酒的总量,T为饮酒的时间