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')