一个常微分方程(ODE)包含一个或多个因变量的导数,y,对于单个自变量,t,通常称为时间。这里用来表示的导数的符号y关于t是 对于一阶导数, 对于二阶导数,等等。的订单的最高阶导数y它出现在方程中。
例如,这是一个二阶ODE:
在一个初值问题, ODE从初始状态开始求解。利用初始条件, ,以及需要一段时间才能得到答案, ,迭代求解。在每一步,求解器都对前一步的结果应用特定的算法。在这样的第一步,初始条件提供了必要的信息,允许进行集成。最后的结果是ODE求解器返回一个时间步长的向量 以及每一步对应的解决方案 .
MATLAB中的ODE求解器®解决这些类型的一阶ode:
显式ode的形式 .
这种形式的线性隐函数 ,在那里 是一个非奇异质量矩阵。质量矩阵可以是与时间或状态相关的,也可以是常数矩阵。线性隐式ode涉及的是的一阶导数的线性组合y,它们被编码在质量矩阵中。
线性隐式ode总是可以转化为显式形式, .然而,直接向ODE求解器指定质量矩阵可以避免这种转换,这是不方便的,可能是计算昂贵的。
如果某些成分
是缺失的,那么方程被调用了微分代数方程,或dae,并且dae系统包含一些代数变量.代数变量是方程中没有导数的因变量。通过对方程组求导,消去代数变量,可将一阶ode方程组改写为一阶ode的等价方程组。将DAE重写为ODE所需的导数数称为微分索引。的ode15s
和ode23t
求解器可以解决index-1 dae。
形式的完全隐式ode
.完全隐式ode不能以显式形式重写,可能还包含一些代数变量。的ode15i
solver是为完全隐式问题设计的,包括index-1 dae。
属性可以为某些类型的问题的求解器提供附加信息odeset
函数创建一个选项结构。
您可以指定任意数量的耦合ODE方程来求解,原则上,方程的数量只受可用计算机内存的限制。如果方程组有n方程,
然后对方程进行编码的函数返回一个带有的向量n元素,对应于 .例如,考虑二元方程组
编码这些方程的函数是
函数myODE(t,y) = myODE(t,y)dy (2) = y y (1) * (2) 2;
MATLAB ODE求解器只解决一阶方程。您必须使用泛型替换将高阶ode重写为一阶方程的等价系统
这些替换的结果是一个n一阶方程
例如,考虑三阶ODE
使用替换
结果是等价的一阶系统
这个方程组的代码如下
函数y(1) = y(2);dydt (2) = y (3);dydt (3) = y y (3) (1) * 1;
考虑复ODE方程
在哪里 .求解时,将实部和虚部分离成不同的解分量,最后将结果重新组合。概念上,这看起来像
例如,如果ODE是 ,则可以使用函数文件表示该方程。
定义接受并返回复数值f = y的函数。
然后,分离实部和虚部的代码是
函数阵线= imaginaryODE (t,青年志愿)%由实分量和虚分量构造yY = yv(1) + i*yv(2);%计算函数值yp = complexf (t、y);%分别返回实值和虚值阵线=[真实(yp);图像放大(yp)];
当你运行求解器来得到解,初始条件y0
也分为实部和虚部,为每个解分量提供一个初始条件。
y0 = 1 + i;yv0 =[真实(y0);图像放大(y0)];Tspan = [0 2];[t,yv] = ode45(@imaginaryODE, tspan, yv0);
一旦你得到了解,将实部和虚部结合起来得到最终结果。
Y = yv(:,1) + i*yv(:,2);
数值
在大多数ODE问题中表现良好,通常应该是您的首选解算器。然而,ode23
和ode113
可以比数值
对于精度要求较松或较紧的问题。
一些ODE问题刚度,或评价困难。刚度是一个无法精确定义的术语,但一般来说,当问题中某个地方的缩放存在差异时,刚度就会出现。例如,如果一个ODE有两个解组件,它们在完全不同的时间尺度上变化,那么这个方程可能是僵硬的。如果一个问题不是僵硬的解决者(例如数值
)无法解决问题或速度极慢。如果您观察到非刚性求解器非常慢,请尝试使用刚性求解器,例如ode15s
代替。当使用刚性求解器时,您可以通过提供雅可比矩阵或其稀疏模式来提高可靠性和效率。
该表提供了关于何时使用每个不同求解器的一般指南。
解算器 | 问题类型 | 精度 | 什么时候使用 |
---|---|---|---|
数值 |
该方法 | 媒介 | 大多数时候。 |
ode23 |
低 |
|
|
ode113 |
低到高 |
|
|
ode15s |
僵硬的 | 低到中等 | 试一试 |
ode23s |
低 |
如果有质量矩阵,它一定是常数。 |
|
ode23t |
低 | 使用
|
|
ode23tb |
低 | 就像 |
|
ode15i |
全隐式 | 低 | 使用 |
有关何时使用每个求解器的详细信息和进一步建议,请参见[5].
有几个示例文件可以作为大多数ODE问题的极佳起点。运行微分方程的例子应用程序,它可以让你轻松地探索和运行示例,输入
odeexamples
要打开单独的示例文件进行编辑,输入
编辑exampleFileName.m
要运行示例,输入
exampleFileName
该表包含可用的ODE和DAE示例文件的列表,以及它们使用的求解器和选项。文档中还包含了直接发布的示例子集的链接。
示例文件 | 解算器使用 | 选项指定 | 描述 | 文档链接 |
---|---|---|---|---|
amp1dae |
ode23t |
|
刚性DAE -具有常数奇异质量矩阵的电路 |
求解刚性微分代数方程 |
ballode |
ode23 |
|
简单的事件地点-弹跳球 |
歌唱活动的位置 |
batonode |
数值 |
|
带有与时间和状态相关的质量矩阵运动的棒的ODE |
- - - - - - |
brussode |
ode15s |
|
棘手的大问题——化学反应中的扩散(布鲁塞尔) |
解决刚性常微分方程 |
burgersode |
ode15s |
|
采用移动网格技术求解了具有强状态依赖质量矩阵的ODE - Burgers方程 |
- - - - - - |
fem1ode |
ode15s |
|
含时质量矩阵的刚性问题-有限元法 |
- - - - - - |
fem2ode |
ode23s |
|
用定质量矩阵-有限元法求解刚性问题 |
- - - - - - |
hb1ode |
ode15s |
- - - - - - | 刚性ODE问题是在很长时间间隔罗伯逊化学反应上解决的 |
- - - - - - |
hb1dae |
ode15s |
|
刚性,线性隐式DAE来自守恒定律-罗伯逊化学反应 |
用半显式微分代数方程(DAEs)求解Robertson问题 |
ihb1dae |
ode15i |
|
僵硬的,完全隐式的DAE - Robertson化学反应 |
用隐式微分代数方程(DAEs)求解Robertson问题 |
iburgersode |
ode15i |
|
隐式ODE系统- Burgers方程 |
- - - - - - |
kneeode |
ode15s |
|
非负性约束的“膝盖问题” |
非负的颂歌的解决方案 |
orbitode |
数值 |
|
高级事件地点-限制三体问题 |
歌唱活动的位置 |
rigidode |
数值 |
- - - - - - | 非刚性问题-无外力刚体的欧拉方程 |
解决该常微分方程 |
vdpode |
ode15s |
|
可参数化范德波尔方程(对于大的刚性μ) |
解决刚性常微分方程 |
L. F.和M. K.戈登,常微分方程的计算机解法:初值问题, w·h·弗里曼,旧金山,1975年。
Forsythe, G. M. Malcolm和C. Moler,数学计算的计算机方法1977年,新泽西州普伦蒂斯-霍尔。
卡哈纳,D. C. Moler和S. Nash,数值方法与软件,普伦蒂斯霍尔,新泽西州,1989年。
夏平,l.f.,常微分方程的数值解,查普曼和霍尔,纽约,1994。
[5] Shampine, L. F.和M. W. Reichelt,《MATLAB ODE Suite》SIAM科学计算杂志,第18卷,1997年,第1-22页。
L. F. Shampine, I. Gladwell和S. Thompson,用MATLAB求解ode,剑桥大学出版社,2003年。