微分方程:一般的,凡表示未知函数、未知函数的导数与自变量之间的关系的方程,叫做微分方程,有时也简称方程。
微分方程的阶:微分方程中所出现的未知函数的最高阶导数的阶数,叫做微分方程的阶。
微分方程的解:使得微分方程成立的函数称为微分方程的解。不含任意常数的解称为微分方程的特解。若微分方程的解中所含的相互独立的任意常数的个数与微分方程的阶数相等,称这个解为微分方程的通解。
微分方程的通解:如果微分方程的解中含有任意常数,且任意常数的个数与微分方程的阶数相同,这样的解叫做微分方程的通解。
一般只有比较简单的微分方程才能求出解析解,后面做建模一般都是求数值解。 这里我们讲的基本都是直接用MATLAB程序算的 MATLAB求解命令为
dsolve(‘方程1’, ‘方程2’,…‘方程n’, ‘初始条件’, ‘自变量’)记号:在表达微分方程时,用字母D表示求微分,D2、D3等表示求高阶微分.任何D后所跟的字母为因变量,自变量可以指定或由系统规则选定为确省. 解下列常微分方程 x 2 + y + ( x − 2 y ) y ′ = 0 x^2+y+(x-2y)y'=0 x2+y+(x−2y)y′=0
>> syms y(x) >> dsolve(x^2+y+(x-2*y)*diff(y)==0) ans = x/2 + ((4*x^3)/3 + x^2 + C3)^(1/2)/2 x/2 - ((4*x^3)/3 + x^2 + C3)^(1/2)/2解下列常微分方程 { y ′ ′ ′ − y ′ ′ = x y ( 1 ) = 8 y ′ ( 1 ) = 7 y ′ ′ ( 1 ) = 4 \begin{cases} y'''-y''=x \\y(1)=8\\y'(1)=7 \\y''(1)=4 \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧y′′′−y′′=xy(1)=8y′(1)=7y′′(1)=4
syms y(x) d1=diff(y); d2=diff(y,2); ans=dsolve(diff(y,3)-diff(y,2)==0,y(1)==8,d1(1)==7,d2(2)==4); simplify(ans)例一:求 d u d t = 1 + u 2 \frac{du}{dt}=1+u^2 dtdu=1+u2通解
dsolve('Du=1+u^2','t') tan(C1 + t) %通解 1i %虚数+i、-i数值解 -1i例二: { d 2 y d x 2 + 4 d y d x + 29 y = 0 y ( 0 ) = 0 y ′ ( 0 ) = 15 \begin{cases} \frac{d^2y}{dx^2}+4\frac{dy}{dx}+29y=0 \\ y(0)=0\\ y'(0)=15 \end{cases} ⎩⎪⎨⎪⎧dx2d2y+4dxdy+29y=0y(0)=0y′(0)=15
y=dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x') y = 3*sin(5*x)*exp(-2*x) [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=simplify(x) % 将x化简 y=simplify(y) z=simplify(z) x = C1*exp(-t) + C3*exp(2*t) y = exp(-2*t)*(C2 + C1*exp(t) + C3*exp(4*t)) z = C2*exp(-2*t) + C3*exp(2*t)求常微分方程组的解: { f ′ ′ + 3 g = s i n ( x ) g ′ + f ′ = c o s ( x ) \begin{cases}f''+3g=sin(x)\\g'+f'=cos(x)\end{cases} {f′′+3g=sin(x)g′+f′=cos(x)
clc,clear syms f(x) g(x) %定义符号变量 df=diff(f); %定义f的一阶导数,用于初值或边值条件的赋值 [f1,g1]=dsolve(diff(f,2)+3*g==sin(x),diff(g)+df==cos(x)) %求通解 f1=simplify(f1), g1=simplify(g1) %对符号解进行化简 [f2,g2]=dsolve(diff(f,2)+3*g==sin(x),diff(g)+df==cos(x),df(2)==0,f(3)==3,g(5)==1) f2=simplify(f2), g2=simplify(g2) %对符号解进行化简 f1 = C7 + sin(x) + (3^(1/2)*exp(3^(1/2)*x)*(C8 + (exp(-3^(1/2)*x)*(cos(x) - 3^(1/2)*sin(x)))/4))/3 - (3^(1/2)*exp(-3^(1/2)*x)*(C9 + (exp(3^(1/2)*x)*(cos(x) + 3^(1/2)*sin(x)))/4))/3 g1 = (3^(1/2)*exp(-3^(1/2)*x)*(C9 + (exp(3^(1/2)*x)*(cos(x) + 3^(1/2)*sin(x)))/4))/3 - (3^(1/2)*exp(3^(1/2)*x)*(C8 + (exp(-3^(1/2)*x)*(cos(x) - 3^(1/2)*sin(x)))/4))/3 f1 = C7 + sin(x)/2 + (3^(1/2)*C8*exp(3^(1/2)*x))/3 - (3^(1/2)*C9*exp(-3^(1/2)*x))/3 g1 = sin(x)/2 - (3^(1/2)*C8*exp(3^(1/2)*x))/3 + (3^(1/2)*C9*exp(-3^(1/2)*x))/3 f2 = sin(x)/2 - sin(3)/(2*(exp(4*3^(1/2)) - exp(2*3^(1/2)) + 1)) + 3/(exp(4*3^(1/2)) - exp(2*3^(1/2)) + 1) - (2*exp(2*3^(1/2)))/(exp(4*3^(1/2)) - exp(2*3^(1/2)) + 1) + (3*exp(4*3^(1/2)))/(exp(4*3^(1/2)) - exp(2*3^(1/2)) + 1) - (exp(5*3^(1/2))*exp(-3^(1/2)*x))/(exp(6*3^(1/2)) + 1) + (exp(2*3^(1/2))*sin(3))/(2*(exp(4*3^(1/2)) - exp(2*3^(1/2)) + 1)) - (exp(2*3^(1/2))*sin(5))/(2*(exp(4*3^(1/2)) - exp(2*3^(1/2)) + 1)) - (exp(4*3^(1/2))*sin(3))/(2*(exp(4*3^(1/2)) - exp(2*3^(1/2)) + 1)) - (exp(3^(1/2)*x)*exp(3^(1/2)))/(exp(6*3^(1/2)) + 1) + (exp(3^(1/2)*x)*exp(3^(1/2))*sin(5))/(2*(exp(6*3^(1/2)) + 1)) + (3^(1/2)*cos(2)*exp(3^(1/2)))/(6*(exp(4*3^(1/2)) - exp(2*3^(1/2)) + 1)) + (exp(5*3^(1/2))*exp(-3^(1/2)*x)*sin(5))/(2*(exp(6*3^(1/2)) + 1)) - (3^(1/2)*cos(2)*exp(3*3^(1/2)))/(6*(exp(4*3^(1/2)) - exp(2*3^(1/2)) + 1)) - (3^(1/2)*cos(2)*exp(-2*3^(1/2))*exp(3^(1/2)*x))/(6*(exp(6*3^(1/2)) + 1)) + (3^(1/2)*cos(2)*exp(8*3^(1/2))*exp(-3^(1/2)*x))/(6*(exp(6*3^(1/2)) + 1)) g2 = sin(x)/2 + (exp(5*3^(1/2))*exp(-3^(1/2)*x))/(exp(6*3^(1/2)) + 1) + (exp(3^(1/2)*x)*exp(3^(1/2)))/(exp(6*3^(1/2)) + 1) - (exp(3^(1/2)*x)*exp(3^(1/2))*sin(5))/(2*(exp(6*3^(1/2)) + 1)) - (exp(5*3^(1/2))*exp(-3^(1/2)*x)*sin(5))/(2*(exp(6*3^(1/2)) + 1)) + (3^(1/2)*cos(2)*exp(-2*3^(1/2))*exp(3^(1/2)*x))/(6*(exp(6*3^(1/2)) + 1)) - (3^(1/2)*cos(2)*exp(8*3^(1/2))*exp(-3^(1/2)*x))/(6*(exp(6*3^(1/2)) + 1)) f2 = (18*exp(3^(1/2)*(x + 2)) - 6*exp(3^(1/2)*(2*x + 3)) - 6*exp(7*3^(1/2)) + 6*exp(3^(1/2)*(x + 4)) + 6*exp(3^(1/2)*(x + 6)) + 18*exp(3^(1/2)*(x + 8)) + 3*exp(3^(1/2)*(2*x + 3))*sin(5) + 3*exp(3^(1/2)*(x + 2))*sin(x) + 3*exp(3^(1/2)*(x + 8))*sin(x) - 3*exp(3^(1/2)*(x + 2))*sin(3) - 3*exp(3^(1/2)*(x + 4))*sin(5) - 3*exp(3^(1/2)*(x + 6))*sin(5) - 3*exp(3^(1/2)*(x + 8))*sin(3) + 3*exp(7*3^(1/2))*sin(5) + 3^(1/2)*cos(2)*exp(3^(1/2)*(x + 3)) - 3^(1/2)*cos(2)*exp(3^(1/2)*(x + 7)) + 3^(1/2)*cos(2)*exp(10*3^(1/2)) - 3^(1/2)*cos(2)*exp(2*3^(1/2)*x))/(6*(exp(3^(1/2)*(x + 2)) + exp(3^(1/2)*(x + 8)))) g2 = (6*exp(7*3^(1/2)) + 6*exp(3^(1/2)*(2*x + 3)) - 3*exp(3^(1/2)*(2*x + 3))*sin(5) + 3*exp(3^(1/2)*(x + 2))*sin(x) + 3*exp(3^(1/2)*(x + 8))*sin(x) - 3*exp(7*3^(1/2))*sin(5) - 3^(1/2)*cos(2)*exp(10*3^(1/2)) + 3^(1/2)*cos(2)*exp(2*3^(1/2)*x))/(6*(exp(3^(1/2)*(x + 2)) + exp(3^(1/2)*(x + 8)))) >>在生产和科研中所处理的微分方程往往很复杂且大多得不出一般解。而在实际上对初值问题,一般是要求得到解在若干个点上满足规定精确度的近似值,或者得到一个满足精确度要求的便于计算的表达式。因此,研究常微分方程的数值解法是十分必要的。
用差商代替导数
若步长h较小,则有
故有公式:
使用数值积分
对方程 y’=f(x, y), 两边由xi到xi+1积分,并利用梯形公式,有: 实际应用时,与欧拉公式结合使用:
以此方法为基础,有龙格-库塔法、线性多步法等方法。具体的太麻烦了,用的时候直接用MATLAB调函数就行。k越大,则数值公式的精度越高。
具体详细的可以help一下看看,我也不是多明白,嘿嘿,就不说了。 注意:
在解n个未知函数的方程组时,x0和x均为n维向量,m-文件中的待解方程组应以x的分量形式写成.使用Matlab软件求数值解时,高阶微分方程必须等价地变换成一阶微分方程组.没看懂?不要紧,看个例子就会了 例题: 求解 y ′ = − 2 ∗ y + 2 ∗ x 2 + 2 ∗ x , 0 < x < 0.5 , y ( 0 ) = 1 y'=-2*y+2*x^2+2*x, 0<x<0.5,y(0)=1 y′=−2∗y+2∗x2+2∗x,0<x<0.5,y(0)=1
clc, clear yx=@(x,y)-2*y+2*x^2+2*x; %定义微分方程右端项的匿名函数 [x,y]=ode45(yx,[0,0.5],1) %第一种返回格式 sol=ode45(yx,[0,0.5],1) %第二种返回格式 y2=deval(sol,x) %计算自变量x对应的函数值 check=[y,y2'] %比较两种计算结果是一样的,但一个是行向量,一个是列向量例题 { d 2 x d t 2 − 1000 ( 1 − x 2 ) d x d t + x = 0 x ( 0 ) = 2 x ′ ( 0 ) = 0 \begin{cases} \frac{d^2x}{dt^2}-1000(1-x^2)\frac{dx}{dt}+x=0 \\ x(0)=2\\ x'(0)=0 \end{cases} ⎩⎪⎨⎪⎧dt2d2x−1000(1−x2)dtdx+x=0x(0)=2x′(0)=0 由上面第一个式子可以知道,这是一个二阶微分方程,我们先对其降阶。 令 y 1 = x , y 2 = x ′ y_1=x,y_2=x' y1=x,y2=x′ 然后带入上面的方程可以得到
MATLAB求解过程: 建立 .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]); %[2 0]表示初值 plot(T,Y(:,1),'-')结果如图所示,具体T Y的值看工作区
设位于坐标原点的甲舰向位于x轴上点A(1, 0)处的乙舰发射导弹,导弹头始终对准乙舰.如果乙舰以最大的速度v0(是常数)沿平行于y轴的直线行驶,导弹的速度是5v0,求导弹运行的曲线方程.又乙舰行驶多远时,导弹将它击中?
设t时刻,导弹的坐标为 P : ( x ( t ) , y ( t ) ) , P:(x(t),y(t)), P:(x(t),y(t)),乙舰坐标为 Q : ( 1 , v 0 t ) Q:(1,v_0t) Q:(1,v0t)示意图如下 可以得到 y ′ y' y′的导数即 t a n ( θ ) tan(\theta) tan(θ)为:
y ′ = t a n ( θ ) = v 0 t − y 1 − x y'=tan(\theta)=\frac{v_0t-y}{1-x} y′=tan(θ)=1−xv0t−y (1)
化简为
v 0 t = ( 1 − x ) y ′ + y v_0t=(1-x)y'+y v0t=(1−x)y′+y
根据题意,导弹的速度是战舰的5倍,所以导弹的弧长,为战舰路程的5倍(时间一样都为t),由弧长公式可以得到: 联立公式1,2,对x求导(注意这里不是求偏导,y是x的函数,所以 ( ( 1 − x ) y ′ ) ′ = − y ′ + ( 1 − x ) y ′ ′ ((1-x)y')'=-y'+(1-x)y'' ((1−x)y′)′=−y′+(1−x)y′′,)可以化简为 初始条件为 y ( 0 ) = 0 , y ′ ( 0 ) = 0 y(0)=0,y'(0)=0 y(0)=0,y′(0)=0 这里就可以求y的解析式了,也就是这个微分方程的通解
MATLAB代码和结果为
y=dsolve('(1-x)*D2y-sqrt(1+Dy^2)/5=0','y(0)=0','Dy(0)=0','x') y=simplify(y) (5*(-1)^(1/5)*(x - 1)^(4/5))/8 + (5*(-1)^(4/5)*(x - 1)^(6/5))/12 + 5/24 - (5*(-1)^(1/5)*(x - 1)^(4/5))/8 - (5*(-1)^(4/5)*(x - 1)^(6/5))/12 - 5/24可以看到,有两个结果,上面那个是沿着y轴正向行驶,下面是负向行驶 当两者的坐标相等时,两者相遇,所以x=1时
syms x f(x)= (5*(-1)^(1/5)*(x - 1)^(4/5))/8 + (5*(-1)^(4/5)*(x - 1)^(6/5))/12 + 5/24; f(1) ans = 5/24所以击中时的坐标为(1,5/24),也就是行驶5/24时被击中
令y1=y,y2=y1’,将方程(3)化为一阶微分方程组。 然后MATLAB求数值解,先建立.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);再求解画图
[x,y]=ode15s('eq1',[0 1],[0 0]); plot(x,y(:,1),'b') hold on y=0:0.1:2; plot(1,y,'b^') y 2.0000最后一个y值为0.2000与5/24=0.2083相差不大
结果 1.9891 三种算法结果都差不多