选择 ode 求解器
常微分方程
常微分方程 (ode) 包含与一个自变量 t(通常称为时间)相关的因变量 y 的一个或多个导数。此处用于表示 y 关于 t 的导数的表示法对于一阶导数为 ,对于二阶导数为 ,依此类推。ode 的阶数等于 y 在方程中出现的最高阶导数。
例如,这是一个二阶 ode:
在初始值问题中,从初始状态开始解算 ode。利用初始条件 以及要在其中求得答案的时间段 ,以迭代方式获取解。在每一步,求解器都对之前各步的结果应用一个特定算法。在第一个这样的时间步,初始条件将提供继续积分所需的必要信息。最终结果是,ode 求解器返回一个时间步向量 以及在每一步对应的解 。
ode 的类型
matlab® 中的 ode 求解器可解算以下类型的一阶 ode:
形式的显式 ode。
形式的线性隐式 ode,其中 为非奇异质量矩阵。该质量矩阵可以是时间或状态依赖的矩阵,也可以是常量矩阵。线性隐式 ode 涉及在质量矩阵中编码的一阶 y 导数的线性组合。
线性隐式 ode 可随时变换为显式形式 。不过,将质量矩阵直接指定给 ode 求解器可避免这种既不方便还可能带来大量计算开销的变换操作。
如果 的某些分量缺失,则这些方程称为微分代数方程或 dae,并且 dae 方程组会包含一些代数变量。代数变量是导数未出现在方程中的因变量。可通过对方程求导来将 dae 方程组重写为等效的一阶 ode 方程组,以消除代数变量。将 dae 重写为 ode 所需的求导次数称为微分指数。
ode15s
和ode23t
求解器可解算微分指数为 1 的 dae。形式的完全隐式 ode。完全隐式 ode 不能重写为显式形式,还可能包含一些代数变量。
ode15i
求解器专为完全隐式问题(包括微分指数为 1 的 dae)而设计。
可通过使用 函数创建 options 结构体,来针对某些类型的问题为求解器提供附加信息。
ode 方程组
您可以指定需要解算的任意数量的 ode 耦合方程,原则上,方程的数量仅受计算机可用内存的限制。如果方程组包含 n 个方程,
则用于编写该方程组代码的函数将返回一个向量,其中包含 n 个元素,对应于 值。例如,考虑以下包含两个方程的方程组
用于编写该方程组代码的函数为
function dy = myode(t,y) dy(1) = y(2); dy(2) = y(1)*y(2)-2; end
高阶 ode
matlab ode 求解器仅可解算一阶方程。您必须使用常规代换法,将高阶 ode 重写为等效的一阶方程组
这些代换将生成一个包含 n 个一阶方程的方程组
例如,考虑三阶 ode
使用代换法
生成等效的一阶方程组
此方程组的代码则为
function dydt = f(t,y) dydt(1) = y(2); dydt(2) = y(3); dydt(3) = y(1)*y(3)-1; end
复数 ode
考虑复数 ode 方程
其中 。为解算该方程,需要将实部和虚部分解为不同的解分量,最后重新组合相应的结果。从概念上讲,这类似于
例如,如果 ode 为 ,则可以使用函数文件来表示该方程:
function f = complexf(t,y) f = y.*t 2*i; end
然后,分解实部和虚部的代码为
function fv = imaginaryode(t,yv) % construct y from the real and imaginary components y = yv(1) i*yv(2); % evaluate the function yp = complexf(t,y); % return real and imaginary in separate components fv = [real(yp); imag(yp)]; end
在运行求解器以获取解时,初始条件 y0
也会分解为实部和虚部,以提供每个解分量的初始条件。
y0 = 1 i; yv0 = [real(y0); imag(y0)]; tspan = [0 2]; [t,yv] = ode45(@imaginaryode, tspan, yv0);
获得解后,将实部和虚部分量组合到一起可获得最终结果。
y = yv(:,1) i*yv(:,2);
基本求解器选择
ode45
适用于大多数 ode 问题,一般情况下应作为您的首选求解器。但对于精度要求更宽松或更严格的问题而言,ode23
、ode78
、ode89
和 ode113
可能比 ode45
更加高效。
一些 ode 问题具有较高的计算刚度或难度。术语“刚度”无法精确定义,但一般而言,当问题的某个位置存在标度差异时,就会出现刚度。例如,如果 ode 包含的两个解分量在时间标度上差异极大,则该方程可能是刚性方程。如果非刚性求解器(例如 ode45
)无法解算某个问题或解算速度极慢,则可以将该问题视为刚性问题。如果您观察到非刚性求解器的速度很慢,请尝试改用 ode15s
等刚性求解器。在使用刚性求解器时,可以通过提供 jacobian 矩阵或其稀疏模式来提高可靠性和效率。
下表提供了关于何时使用每种不同求解器的一般指导原则。
求解器 | 问题类型 | 精度 | 何时使用 |
---|---|---|---|
非刚性 | 中 | 大多数情况下,您应当首先尝试求解器 | |
低 | 对于容差较宽松的问题或在刚度适中的情况下, | ||
低到高 | 对于具有严格误差容限的问题或在 ode 函数需要大量计算开销的情况下, | ||
高 | 对于具有高准确度要求的平滑解的问题, | ||
高 | 对于非常平滑的问题,当在较长的时间区间内进行积分时,或当容差特别严格时, | ||
刚性 | 低到中 | 若 | |
低 | 对于误差容限较宽松的问题,
如果存在质量矩阵,则它必须为常量矩阵。 | ||
低 | 对于仅仅是刚度适中的问题,并且您需要没有数值阻尼的解,请使用
| ||
低 | 与 | ||
完全隐式 | 低 | 对于完全隐式问题 f(t,y,y’) = 0 和微分指数为 1 的微分代数方程 (dae),请使用 |
有关何时使用每种求解器的详细信息和更多建议,请参阅 [5]。
ode 示例和文件摘要
有几个示例文件可用作大多数 ode 问题的有用起点。要运行微分方程示例应用,以便轻松浏览和运行示例,请键入
odeexamples
要打开单独的示例文件进行编辑,请键入
edit examplefilename.m
要运行示例,请键入
examplefilename
此表包含可用的 ode 和 dae 示例文件及其使用的求解器和选项的列表。其中包含示例子集的链接,这些示例也已直接发布在文档中。
示例文件 | 使用的求解器 | 指定的选项 | 说明 | 文档链接 |
---|---|---|---|---|
amp1dae |
| 刚性 dae - 包含常量奇异质量矩阵的电路 | ||
ballode |
| 简单事件位置 - 弹球 | ||
batonode |
| 时间依赖和状态依赖的质量矩阵的 ode - 短棒的移动 | ||
brussode |
| 刚性大问题 - 化学反应中的扩散 (brusselator) | ||
burgersode |
| 强烈依赖于状态的质量矩阵的 ode - 使用移动网格方法解算 burgers 方程 | ||
fem1ode |
| 时间依赖的质量矩阵的刚性问题 - 有限元方法 | - | |
fem2ode |
| 常量质量矩阵的刚性问题 - 有限元方法 | - | |
hb1ode | - | 在非常长的区间内解算的刚性 ode 问题 - robertson 化学反应 | - | |
hb1dae |
| 基于守恒定律的刚性线性隐式 dae - robertson 化学反应 | ||
ihb1dae |
| 刚性完全隐式 dae - robertson 化学反应 | ||
iburgersode |
| 隐式 ode 方程组 - burgers 方程 | - | |
kneeode |
| 具有非负约束的“膝盖问题” | ||
orbitode |
| 高级事件位置 - 限制性三体问题 | ||
rigidode | - | 非刚性问题 - 刚体在不受外力作用时的欧拉方程 | ||
vdpode |
| 可参数化的 van der pol 方程(对于较大 μ,为刚性问题) |
参考
[1] shampine, l. f. and m. k. gordon, computer solution of ordinary differential equations: the initial value problem, w. h. freeman, san francisco, 1975.
[2] forsythe, g., m. malcolm, and c. moler, computer methods for mathematical computations, prentice-hall, new jersey, 1977.
[3] kahaner, d., c. moler, and s. nash, numerical methods and software, prentice-hall, new jersey, 1989.
[4] shampine, l. f., numerical solution of ordinary differential equations, chapman & hall, new york, 1994.
[5] shampine, l. f. and m. w. reichelt, “the matlab ode suite,” siam journal on scientific computing, vol. 18, 1997, pp. 1–22.
[6] shampine, l. f., gladwell, i. and s. thompson, solving odes with matlab, cambridge university press, cambridge uk, 2003.
另请参阅
|