24.3 与Matlab兼容的求解器

Octave还提供了一组具有MATLAB兼容接口的常微分方程(ODE)初值问题求解器。此类方法的选项通过以下函数设置:

当前已实现的求解器有:

关于求解器的详细信息,请参见 L. F. Shampine 和 M. W. Reichelt 的论文 "The MATLAB ODE Suite",SIAM Journal on Scientific Computing,Vol. 18,pp. 1–22,1997, DOI: https://doi.org/10.1137/S1064827594276424

 
[t, y] = ode45 (fcn, trange, init)
[t, y] = ode45 (fcn, trange, init, ode_opt)
[t, y, te, ye, ie] = ode45 (…)
solution = ode45 (…)
ode45 (…)

用众所周知的4阶显式 Dormand-Prince 方法求解一组非刚性常微分方程(非刚性 ODE)。

fcn 是函数句柄、内联函数或包含定义 ODE 函数名称的字符串:y' = f(t,y)。该函数必须接受两个输入,第一个是时间 t,第二个是未知数的列向量 y

trange 指定 ODE 求值的时间间隔。通常它是一个指定初始和最终时间的两元素向量([tinit, tfinal])。如果包含两个以上的元素,则也会在这些中间时间点处对解进行求值。

默认情况下,ode45 使用 integrate_adaptive 算法的自适应时间步长。可以通过使用 "RelTol""AbsTol" 选项来更改时间步长计算的容差。

init 包含未知数的初始值。如果它是一个行向量,则解 y 将是一个矩阵,其中每一列对应 init 中相应初始值的解。

可选的第四个参数 ode_opt 为 ODE 求解器指定非默认选项。它是由 odeset 生成的结构体。

该函数通常返回两个输出。变量 t 是一个列向量,包含找到解的时间点。输出 y 是一个矩阵,其中每一列对应问题的不同未知量,每一行对应 t 中的一个时间点。

输出也可以作为结构体 solution 返回,它有一个字段 x(包含求解时间点的行向量)和一个字段 y(包含解矩阵,每一列对应 x 中的一个时间点)。使用 fieldnames (solution) 查看返回的其他字段和附加信息。

如果未请求输出参数,且 ode_opt 中未指定 "OutputFcn",则 "OutputFcn" 被设置为 odeplot,求解器的结果会立即绘制出来。

如果使用 "Events" 选项,则可能返回三个额外输出。te 保存事件函数返回零的时间点。ye 保存时间 te 处解的值。ie 包含一个索引,指示在多个事件函数的情况下触发了哪个事件函数。

示例:求解范德波尔方程

fvdp = @(t,y) [y(2); (1 - y(1)^2) * y(2) - y(1)];
[t,y] = ode45 (fvdp, [0, 20], [2, 0]);

另请参阅: odesetodegetode23ode15s

 
[t, y] = ode23 (fcn, trange, init)
[t, y] = ode23 (fcn, trange, init, ode_opt)
[t, y, te, ye, ie] = ode23 (…)
solution = ode23 (…)
ode23 (…)

用众所周知的3阶显式 Bogacki-Shampine 方法求解一组非刚性常微分方程(非刚性 ODE)。

fcn 是函数句柄、内联函数或包含定义 ODE 函数名称的字符串:y' = f(t,y)。该函数必须接受两个输入,第一个是时间 t,第二个是未知数的列向量 y

trange 指定 ODE 求值的时间间隔。通常它是一个指定初始和最终时间的两元素向量([tinit, tfinal])。如果包含两个以上的元素,则也会在这些中间时间点处对解进行求值。

默认情况下,ode23 使用 integrate_adaptive 算法的自适应时间步长。可以通过使用 "RelTol""AbsTol" 选项来更改时间步长计算的容差。

init 包含未知数的初始值。如果它是一个行向量,则解 y 将是一个矩阵,其中每一列对应 init 中相应初始值的解。

可选的第四个参数 ode_opt 为 ODE 求解器指定非默认选项。它是由 odeset 生成的结构体。

该函数通常返回两个输出。变量 t 是一个列向量,包含找到解的时间点。输出 y 是一个矩阵,其中每一列对应问题的不同未知量,每一行对应 t 中的一个时间点。

输出也可以作为结构体 solution 返回,它有一个字段 x(包含求解时间点的行向量)和一个字段 y(包含解矩阵,每一列对应 x 中的一个时间点)。使用 fieldnames (solution) 查看返回的其他字段和附加信息。

如果未请求输出参数,且 ode_opt 中未指定 "OutputFcn",则 "OutputFcn" 被设置为 odeplot,求解器的结果会立即绘制出来。

如果使用 "Events" 选项,则可能返回三个额外输出。te 保存事件函数返回零的时间点。ye 保存时间 te 处解的值。ie 包含一个索引,指示在多个事件函数的情况下触发了哪个事件函数。

示例:求解范德波尔方程

fvdp = @(t,y) [y(2); (1 - y(1)^2) * y(2) - y(1)];
[t,y] = ode23 (fvdp, [0, 20], [2, 0]);

参考:关于该方法的定义,请参见 https://en.wikipedia.org/wiki/List_of_Runge%E2%80%93Kutta_methods

另请参阅: odesetodegetode45ode15s

 
[t, y] = ode23s (fcn, trange, init)
[t, y] = ode23s (fcn, trange, init, ode_opt)
[t, y] = ode23s (…, par1, par2, …)
[t, y, te, ye, ie] = ode23s (…)
solution = ode23s (…)

用 (2,3) 阶 Rosenbrock 方法求解一组刚性常微分方程(刚性 ODE)。

fcn 是函数句柄、内联函数或包含定义 ODE 函数名称的字符串:M y' = f(t,y)。该函数必须接受两个输入,第一个是时间 t,第二个是未知数的列向量 yM 是一个恒定的质量矩阵,非奇异且可能是稀疏的。使用 odesetodeopts 中设置 "Mass" 字段以指定质量矩阵。

trange 指定 ODE 求值的时间间隔。通常它是一个指定初始和最终时间的两元素向量([tinit, tfinal])。如果包含两个以上的元素,则也会在这些中间时间点处使用与求解器同阶的插值过程对解进行求值。

默认情况下,ode23s 使用 integrate_adaptive 算法的自适应时间步长。可以通过使用 "RelTol""AbsTol" 选项来更改时间步长计算的容差。

init 包含未知数的初始值。如果它是一个行向量,则解 y 将是一个矩阵,其中每一列对应 init 中相应初始值的解。

可选的第四个参数 ode_opt 为 ODE 求解器指定非默认选项。它是由 odeset 生成的结构体。ode23s 将忽略以下选项:"BDF""InitialSlope""MassSingular""MStateDependence""MvPattern""MaxOrder""Non-negative"

该函数通常返回两个输出。变量 t 是一个列向量,包含找到解的时间点。输出 y 是一个矩阵,其中每一列对应问题的不同未知量,每一行对应 t 中的一个时间点。如果 trange 指定了中间时间步长,则仅返回这些时间步长的结果。

输出也可以作为结构体 solution 返回,它有一个字段 x(包含求解时间点的行向量)和一个字段 y(包含解矩阵,每一列对应 x 中的一个时间点)。使用 fieldnames (solution) 查看返回的其他字段和附加信息。

如果使用 "Events" 选项,则可能返回三个额外输出。te 保存事件函数返回零的时间点。ye 保存时间 te 处解的值。ie 包含一个索引,指示在多个事件函数的情况下触发了哪个事件函数。

示例:求解刚性范德波尔方程

f = @(t,y) [y(2); 1000*(1 - y(1)^2) * y(2) - y(1)];
opt = odeset ('Mass', [1 0; 0 1], 'MaxStep', 1e-1);
[vt, vy] = ode23s (f, [0 2000], [2 0], opt);

另请参阅: odesetdaspkdassl

 
[t, y] = ode15s (fcn, trange, y0)
[t, y] = ode15s (fcn, trange, y0, ode_opt)
[t, y, te, ye, ie] = ode15s (…)
solution = ode15s (…)
ode15s (…)

求解一组刚性常微分方程(刚性 ODE)或刚性半显式指标-1 微分代数方程(DAE)。

ode15s 使用变步长、变阶方法(1到5阶)的 BDF(后向差分公式)。

fcn 是函数句柄、内联函数或包含定义 ODE 函数名称的字符串:y' = f(t,y)。该函数必须接受两个输入,第一个是时间 t,第二个是未知数的列向量 y

trange 指定 ODE 求值的时间间隔。通常它是一个指定初始和最终时间的两元素向量([tinit, tfinal])。如果包含两个以上的元素,则也会在这些中间时间点处对解进行求值。

默认情况下,ode15s 使用 integrate_adaptive 算法的自适应时间步长。可以通过使用 "RelTol""AbsTol" 选项来更改时间步长计算的容差。

y0 包含未知数的初始值。如果它是一个行向量,则解 y 将是一个矩阵,其中每一列对应 y0 中相应初始值的解。

可选的第四个参数 ode_opt 为 ODE 求解器指定非默认选项。它是由 odeset 生成的结构体。ode15s 将忽略以下选项:"Non-negative"

该函数通常返回两个输出。变量 t 是一个列向量,包含找到解的时间点。输出 y 是一个矩阵,其中每一列对应问题的不同未知量,每一行对应 t 中的一个时间点。如果 trange 指定了中间时间步长,则仅返回这些时间步长的结果。

输出也可以作为结构体 solution 返回,它有一个字段 x(包含求解时间点的行向量)和一个字段 y(包含解矩阵,每一列对应 x 中的一个时间点)。使用 fieldnames (solution) 查看返回的其他字段和附加信息。

如果未请求输出参数,且 ode_opt 中未指定 "OutputFcn",则 "OutputFcn" 被设置为 odeplot,求解器的结果会立即绘制出来。

如果使用 "Events" 选项,则可能返回三个额外输出。te 保存事件函数返回零的时间点。ye 保存时间 te 处解的值。ie 包含一个索引,指示在多个事件函数的情况下触发了哪个事件函数。

示例:求解 Robertson 方程:

function r = robertson_dae (t, y)
  r = [ -0.04*y(1) + 1e4*y(2)*y(3)
         0.04*y(1) - 1e4*y(2)*y(3) - 3e7*y(2)^2
 y(1) + y(2) + y(3) - 1 ];
endfunction
opt = odeset ("Mass", [1 0 0; 0 1 0; 0 0 0], "MStateDependence", "none");
[t,y] = ode15s (@robertson_dae, [0, 1e3], [1; 0; 0], opt);

另请参阅: decicodesetodegetode23ode45

 
[t, y] = ode15i (fcn, trange, y0, yp0)
[t, y] = ode15i (fcn, trange, y0, yp0, ode_opt)
[t, y, te, ye, ie] = ode15i (…)
solution = ode15i (…)
ode15i (…)

求解一组完全隐式的常微分方程(隐式 ODE)。

ode15i 使用与 ode15s 相同的变步长、变阶 BDF 方法。

fcn 是函数句柄、内联函数或包含定义 ODE 函数名称的字符串:f(t, y, y') = 0。该函数必须接受三个输入,第一个是时间 t,第二个是未知数的列向量 y,第三个是未知数导数的列向量 y'

trange 指定 ODE 求值的时间间隔。通常它是一个指定初始和最终时间的两元素向量([tinit, tfinal])。如果包含两个以上的元素,则也会在这些中间时间点处对解进行求值。

y0yp0 包含未知数及其导数的初始条件。y0yp0 中的值必须一致,即它们必须满足 f(t, y, y') = 0。使用 decic 计算一致初始条件。

可选的第五个参数 ode_opt 为 ODE 求解器指定非默认选项。它是由 odeset 生成的结构体。

该函数通常返回两个输出。变量 t 是一个列向量,包含找到解的时间点。输出 y 是一个矩阵,其中每一列对应问题的不同未知量,每一行对应 t 中的一个时间点。

输出也可以作为结构体 solution 返回,它有一个字段 x(包含求解时间点的行向量)和一个字段 y(包含解矩阵,每一列对应 x 中的一个时间点)。使用 fieldnames (solution) 查看返回的其他字段和附加信息。

如果未请求输出参数,且 ode_opt 中未指定 "OutputFcn",则 "OutputFcn" 被设置为 odeplot,求解器的结果会立即绘制出来。

如果使用 "Events" 选项,则可能返回三个额外输出。te 保存事件函数返回零的时间点。ye 保存时间 te 处解的值。ie 包含一个索引,指示在多个事件函数的情况下触发了哪个事件函数。

另请参阅: decicodesetodegetode15s

 
ode_opt = odeset ()
ode_opt = odeset ("field1", value1, "field2", value2, …)
ode_opt = odeset (oldstruct, "field1", value1, …)
ode_opt = odeset (oldstruct, newstruct)

为 ODE 求解器创建或修改选项结构体。

当使用零个输入参数调用时,odeset 返回一个包含所有选项字段及其默认值的结构体。如果未指定选项,ODE 求解器将使用默认值。

当使用名称-值输入参数对调用时,odeset"field1""field2"、… 的值设置为 value1value2、… 并返回更新后的结构体。

如果使用输入结构体 oldstruct 调用,则会覆盖 "field1""field2"、… 选项的值,并返回修改后的结构体。

当使用两个输入 ODE 选项结构体 oldstructnewstruct 调用时,将从结构体 newstruct 中的新值覆盖结构体 oldstruct 中的所有值。newstruct 中的空值不会覆盖 oldstruct 中的值。

odeset 始终赋值的、最常用的 ODE 选项如下:

AbsTol: positive scalar | vector, def. 1e-6

绝对误差容限。

BDF: {"off"} | "on"

在隐式多步方法中使用 BDF 公式。注意:此选项尚未实现。

Events: function_handle

事件函数。事件函数必须具有以下形式:[value, isterminal, direction] = my_events_f (t, y)

InitialSlope: vector

DAE 求解器的一致初始斜率向量。

InitialStep: positive scalar

初始时间步长。

Jacobian: matrix | function_handle

雅可比矩阵,指定为常数矩阵或时间和状态的函数。

JConstant: {"off"} | "on"

指定雅可比矩阵是常数矩阵还是取决于状态。

JPattern: sparse matrix

如果雅可比矩阵是稀疏且非恒定的,但保持恒定的稀疏性模式,则指定该稀疏性模式。

Mass: matrix | function_handle

质量矩阵,指定为常数矩阵或时间和状态的函数。

MassSingular: {"maybe"} | "yes" | "on"

指定质量矩阵是否为奇异矩阵。

MaxOrder: {5} | 4 | 3 | 2 | 1

公式的最大阶数。

MaxStep: positive scalar

最大时间步长值。

MStateDependence: {"weak"} | "none" | "strong"

指定质量矩阵是取决于状态还是仅取决于时间。

MvPattern: sparse matrix

如果质量矩阵是稀疏且非恒定的,但保持恒定的稀疏性模式,则指定该稀疏性模式。注意:此选项尚未实现。

NonNegative: scalar | vector

指定状态向量中预期在模拟过程中保持非负值的元素。

NormControl: {"off"} | "on"

控制相对于解向量2-范数的误差,而非其绝对值。

OutputFcn: function_handle

用于监视模拟过程中的状态的函数。关于要使用的函数形式,另请参见 odeplot

OutputSel: scalar | vector

要传递给输出监视函数的状态向量元素的索引。

Refine: positive scalar

指定是仅在每个时间步结束时返回输出,还是在中间时间点也返回输出。该值应为标量,指示在返回输出的每个时间步长内要使用的等距时间点的数量。

RelTol: positive scalar

相对误差容限。

Stats: {"off"} | "on"

模拟后打印求解器统计信息。

Vectorized: {"off"} | "on"

指定 odefcn 是否能够同时处理多个状态值。

不在上述列表中的字段名称也会被接受并添加到结果结构体中。

另请参阅: odeget

 
val = odeget (ode_opt, field)
val = odeget (ode_opt, field, default)

查询 ODE 选项结构体 ode_opt 中属性 field 的值。

如果使用两个输入参数调用,其中第一个输入 ode_opt 是 ODE 选项结构体,第二个输入 field 是指定选项名称的字符串,则返回 ode_optfield 对应的选项值 val。如果选项未在 ode_opt 中指定,则返回空矩阵。

如果使用三个输入参数调用,当 ode_opt 中未指定 field 时,则返回默认值 default

另请参阅: odeset

 
ret = odeplot (t, y, flag)

在求解过程中绘制 ODE 解的动态图。此函数是默认的 "OutputFcn",在没有指定其他输出函数时使用。

对于类型为字符串的参数 flag,有效的值为:

"init"

输入 t 必须是长度为2的列向量,包含第一个和最后一个时间步长([tfirst tlast])。输入 y 包含 ODE 问题的初始条件(y0)。在第一个时间步长之前调用以初始化绘图。

""

输入 t 必须是标量 double 或向量,指定输入解 y 被计算的时间点。在积分过程中每次 ODE 求解器计算出新的解时调用。根据解在 y 中的值更新绘图。

"done"

输入应为空,但如果存在则会被忽略。在积分完成时调用以执行清理。

odeplot 始终返回 false,即不停止 ODE 求解器。

示例:求解匿名的 "Van der Pol" 方程实现,并在求解时显示结果。

fvdp = @(t,y) [y(2); (1 - y(1)^2) * y(2) - y(1)];
opt = odeset ("OutputFcn", @odeplot);
[t, y] = ode45 (fvdp, [0, 20], [2, 0], opt);

背景信息:如果此函数通过 odeset 被指定为 ODE 选项结构体的 "OutputFcn" 属性,则 ODE 求解器会调用该函数。ODE 求解器最初会调用 odeplot ([tfirst, tlast], y0, "init") 进行初始化。每次积分步完成后,ODE 求解器调用 odeplot (t, y, []) 更新绘图。积分完成后,ODE 求解器调用 odeplot ([], [], "done") 进行清理。

另请参阅: odesetodeget


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4