MATLAB 程式設計/階微分方程
微分方程是一個包含函式及其一個或多個導數的方程。它通常用來描述變化。
注意:導數 = 。
微分方程的階數是指方程中涉及的因變數最高階導數的階數,即函式相對於自變數的普通導數。通常,目標是求解微分方程,即確定哪些函式滿足該方程。這意味著微分方程定義了變數及其導數之間的關係。
主要有兩種型別的 ODE
- 一階微分方程 (1st ODE)
- 二階微分方程 (2nd ODE)
所有形如導數的線性方程都是一階的。它只包含一階導數,例如 dy/dx,其中 x 和 y 是兩個變數,表示為
當最高階導數的階數為 2 時,它就是一個二階微分方程。
我們有以下微分方程:
,
為了在 MATLAB 中求解此微分方程,我們使用dsolve命令獲取如下答案
>>s=dsolve('D3y+2*D2y+5*Dy+4*y=5*x','y(0)=1','Dy(0)=3')
s =
(5*x)/4 - exp(-t)*(15^(1/2)*C1 - (5*x)/4 + 7) + exp(-t/2)*cos((15^(1/2)*t)/2)*(15^(1/2)*C1 - (5*x)/2 + 8) - C1*exp(-t/2)*sin((15^(1/2)*t)/2)
有幾種型別的 ODE 求解器,但我們將重點關注最常用的求解器
| ODE | 精度 | 用例建議 |
|---|---|---|
| ode45 | 中等 | 對於大多數用例,ode45 足以求解 ODE |
| ode23 | 低 | 在公差粗略的問題中,ode23 可能比 ode45 更有效率 |
| ode113 | 低到高 | 在誤差容差嚴格的問題中,或者當 ODE 函式的計算量很大時,ode113 可能比 ode45 更有效率。 |
有 10,000 美元存入銀行定期存款賬戶,年利率為 2%。
首先,我們需要做一個方程來模擬這筆錢。
方程 1: : 每年儲蓄利息是銀行餘額的 2%,隨著時間的推移,
方程 2: : 初始金額為 10,000 美元
從方程 1 中,我們取出(注意:需要諮詢其他維基專案如何推匯出線性方程)
,其中
,從方程 2 中得出
使用 dsolve 函式,我們可以類似地轉換微分方程
>> syms M(t) p
>> eqn = diff(M,t) == 0.02*M;
>> S= dsolve(eqn,M(0)==10000)
S =
10000*exp(t/50)
因此,我們有方程(顯示為 S)來進行建模。
在 MALAB 中,使用 ode45 計算微分方程的語法如下:
[t,y] = ode45(odefun,tspan,y0)
其中:
t = 評估點,返回為列向量
y = 解,返回為陣列
odefun = ode 函式。您可以使用匿名函式,而不是為函式編寫新檔案
tspan = 積分割槽間,指定為向量。至少,tspan 必須是指定初始時間和最終時間的兩位元素向量 [t0 tf]
y0 = 初始條件,指定為向量。y0 必須與 ode 函式的向量輸出長度相同,
使用 dsolve 轉換微分方程 ode45 函式來求解 ODE
function [T,M] = money_in_bank(R)
% Enter the initial values for the amount of money in the bank
M0 = 1000;
% Enter the interest rate
R = 2;
% Enter the time period
T0 = 1;
Tf = 30;
% using dsolve previously
S=10000*exp(T0/50)
% Solve the differential equation
[T, M] = ode45(@(T,M)S, [T0, Tf], M0);
% Plot the solution
plot(T,M,'-o')
% Add a legend and labels
legend('M(t)')
xlabel('Years')
ylabel('Money in Bank')