數學建模之微分方程(符實現例題和MATLAB源碼)

微分方程的基本概念

微分方程:一般的,凡表示未知函數、未知函數的導數與自變量之間的關係的方程,叫做微分方程,有時也簡稱方程。

微分方程的階:微分方程中所出現的未知函數的最高階導數的階數,叫做微分方程的階。

微分方程的解:使得微分方程成立的函數稱爲微分方程的解。不含任意常數的解稱爲微分方程的特解。若微分方程的解中所含的相互獨立的任意常數的個數與微分方程的階數相等,稱這個解爲微分方程的通解。

微分方程的通解:如果微分方程的解中含有任意常數,且任意常數的個數與微分方程的階數相同,這樣的解叫做微分方程的通解。

微分方程的解析解

一般只有比較簡單的微分方程才能求出解析解,後面做建模一般都是求數值解。
這裏我們講的基本都是直接用MATLAB程序算的
MATLAB求解命令爲

dsolve(‘方程1, ‘方程2,…‘方程n’, ‘初始條件’, ‘自變量’)

記號:在表達微分方程時,用字母D表示求微分,D2、D3等表示求高階微分.任何D後所跟的字母爲因變量,自變量可以指定或由系統規則選定爲確省.
在這裏插入圖片描述
例一:求 dudt=1+u2\frac{du}{dt}=1+u^2通解

dsolve('Du=1+u^2','t')

tan(C1 + t)	%通解
          1i	%虛數+i、-i數值解
         -1i

例二:
{d2ydx2+4dydx+29y=0y(0)=0y(0)=15 \begin{cases} \frac{d^2y}{dx^2}+4\frac{dy}{dx}+29y=0 \\ y(0)=0\\ y'(0)=15 \end{cases}

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)                                                

微分方程的數值解

定義

在生產和科研中所處理的微分方程往往很複雜且大多得不出一般解。而在實際上對初值問題,一般是要求得到解在若干個點上滿足規定精確度的近似值,或者得到一個滿足精確度要求的便於計算的表達式。因此,研究常微分方程的數值解法是十分必要的。

在這裏插入圖片描述

建立數值解法的一些途徑

在這裏插入圖片描述

1、歐拉法。

用差商代替導數

若步長h較小,則有
在這裏插入圖片描述

在這裏插入圖片描述
故有公式:
在這裏插入圖片描述

改進的歐拉法

使用數值積分

對方程 y’=f(x, y), 兩邊由xi到xi+1積分,並利用梯形公式,有:
在這裏插入圖片描述
在這裏插入圖片描述
實際應用時,與歐拉公式結合使用:
在這裏插入圖片描述
在這裏插入圖片描述

使用泰勒公式

以此方法爲基礎,有龍格-庫塔法、線性多步法等方法。具體的太麻煩了,用的時候直接用MATLAB調函數就行。k越大,則數值公式的精度越高。

數值公式的精度

    當一個數值公式的截斷誤差可表示爲$O(h^{k+1})時(k爲正整數,h爲步長),稱它是一個k階公式。
  • 歐拉法是一階公式,改進的歐拉法是二階公式。
  • 龍格-庫塔法有二階公式和四階公式。
  • 線性多步法有四階阿達姆斯外插公式和內插公式。

用Matlab軟件求常微分方程的數值解

在這裏插入圖片描述
具體詳細的可以help一下看看,我也不是多明白,嘿嘿,就不說了。
在這裏插入圖片描述
注意:

  1. 在解n個未知函數的方程組時,x0和x均爲n維向量,m-文件中的待解方程組應以x的分量形式寫成.
  2. 使用Matlab軟件求數值解時,高階微分方程必須等價地變換成一階微分方程組.

沒看懂?不要緊,看個例子就會了
{d2xdt21000(1x2)dxdt+x=0x(0)=2x(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}
由上面第一個式子可以知道,這是一個二階微分方程,我們先對其降階。
y1=x,y2=xy_1=x,y_2=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)),乙艦座標爲Q:(1,v0t)Q:(1,v_0t)示意圖如下
在這裏插入圖片描述
可以得到yy'的導數即tan(θ)tan(\theta)爲:

y=tan(θ)=v0ty1xy'=tan(\theta)=\frac{v_0t-y}{1-x} (1)

化簡爲

v0t=(1x)y+yv_0t=(1-x)y'+y

根據題意,導彈的速度是戰艦的5倍,所以導彈的弧長,爲戰艦路程的5倍(時間一樣都爲t),由弧長公式可以得到:
在這裏插入圖片描述
聯立公式1,2,對x求導(注意這裏不是求偏導,y是x的函數,所以((1x)y)=y+(1x)y((1-x)y')'=-y'+(1-x)y'',)可以化簡爲
在這裏插入圖片描述
初始條件爲y(0)=0,y(0)=0y(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相差不大
在這裏插入圖片描述

解法三、建立參數方程求數值解

  • 設時刻t乙艦的座標爲(X(t),Y(t)),導彈的座標爲(x(t),y(t)).設導彈速度恆爲w,則 (dxdt)2+(dydt)2=w2(\frac{dx}{dt})^2+(\frac{dy}{dt})^2=w^2
  • 由於彈頭始終對準乙艦,故導彈的速度平行於乙艦與導彈頭位置的差向量,二者成比例
    在這裏插入圖片描述
    將(2)分開算帶入(1),消去參數得
    在這裏插入圖片描述
    因乙艦以速度v0沿直線x=1運動,設v0=1,則w=5,X=1,Y=t
    因此導彈運動軌跡的參數方程爲:
    在這裏插入圖片描述
    x=yx,y=y2x=y_x,y=y_2
%.m函數文件來
function dy=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)

%主程序
[t,y]=ode45('eq2',[0 2],[0 0]);
          Y=0:0.01:2;
          plot(1,Y,'-'), hold on          
          plot(y(:,1),y(:,2),'*')

 1.9891

結果 1.9891 三種算法結果都差不多
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章