Octave还为具有MATLAB-兼容接口。此类方法的参数是使用函数设置的。
当前实现的解算器有:
关于解算器的详细信息见L.F.Shampine和M。W.Reichelt,The MATLAB ODE Suite,SIAM科学计算杂志,1997年第18卷,第1-22页,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 (…)
¶(…)
¶用众所周知的4阶显式Dormand-Prince方法求解一组非刚性常微分方程。
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)
以查看返回的其他字段和其他信息。
如果没有指定输出参数,并且没有"OutputFcn"
在中指定ode_opt,然后"OutputFcn"
设置为odeplot
并且立即绘制解算器的结果。
如果使用"Events"
参数,则可以恢复三个附加输出。te保存Event函数返回零的时间。ye保持解决方案的值te. ie包含一个索引,指示在多个事件函数的情况下触发了哪个事件函数。
示例:求解范德波尔方程
fvdp = @(t,y) [y(2); (1 - y(1)^2) * y(2) - y(1)]; [t,y] = ode45 (fvdp, [0, 20], [2, 0]);
[t, y] =
ode23 (fcn, trange, init)
¶[t, y] =
ode23 (fcn, trange, init, ode_opt)
¶[t, y, te, ye, ie] =
ode23 (…)
¶solution =
ode23 (…)
¶(…)
¶用众所周知的3阶显式Bogacki-Shampine方法求解一组非刚性常微分方程(非刚性常方程)。
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)
以查看返回的其他字段和其他信息。
如果没有指定输出参数,并且没有"OutputFcn"
在中指定ode_opt,然后"OutputFcn"
设置为odeplot
并且立即绘制解算器的结果。
如果使用"Events"
参数,则可以恢复三个附加输出。te保存Event函数返回零的时间。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.
[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方法求解一组刚性常微分方程。
fcn是包含定义ODE的函数名称的函数句柄、内联函数或字符串:M y' = f(t,y)
。函数必须接受两个输入,其中第一个是时间t第二个是未知数的列向量y. M是一个常质量矩阵,非奇异且可能是稀疏的。设置字段"Mass"
在里面odeopts使用odeset以指定质量矩阵。
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保存Event函数返回零的时间。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);
[t, y] =
ode15s (fcn, trange, y0)
¶[t, y] =
ode15s (fcn, trange, y0, ode_opt)
¶[t, y, te, ye, ie] =
ode15s (…)
¶solution =
ode15s (…)
¶(…)
¶求解一组刚性常微分方程(ODE)或刚性半显式指数1微分代数方程(DAE)。
ode15s
使用从1阶到5阶的可变步长、可变阶BDF(BackwardDifferentiation Formula)方法。
fcn是包含定义ODE的函数名称的函数句柄、内联函数或字符串:y' = f(t,y)
。函数必须接受两个输入,其中第一个是时间t第二个是未知数的列向量y.
trange指定对ODE求值的时间间隔。通常,它是一个指定初始和最终时间的双元素向量([tinit, tfinal]
). 如果有两个以上的元素,那么也将在这些中间时间实例中评估解决方案。
init包含未知数的初始值。如果它是一个行向量,那么解y将是一个矩阵,其中每列都是中相应初始值的解init.
可选的第四个参数ode_opt为ODE解算器指定非默认参数。它是从生成的结构体odeset
.
该函数通常返回两个输出。变量t是列向量,包含找到解决方案的时间。输出y是一个矩阵,其中每列指的是问题的差分,每行对应的是t.
输出也可以作为结构体返回solution它已经离开了x包含求解时间的行向量和字段y包含溶液矩阵,使得每列对应于x使用fieldnames (solution)
以查看返回的其他字段和其他信息。
如果没有指定输出参数,并且没有"OutputFcn"
在中指定ode_opt,然后"OutputFcn"
设置为odeplot
并且立即绘制解算器的结果。
如果使用"Events"
参数,则可以恢复三个附加输出。te保存Event函数返回零的时间。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);
[t, y] =
ode15i (fcn, trange, y0, yp0)
¶[t, y] =
ode15i (fcn, trange, y0, yp0, ode_opt)
¶[t, y, te, ye, ie] =
ode15i (…)
¶solution =
ode15i (…)
¶(…)
¶求解一组完全隐式常微分方程(ODEs)或指数1微分代数方程(DAE)。
ode15i
使用从1阶到5阶的可变步长、可变阶BDF(BackwardDifferentiation Formula)方法。
fcn是包含定义ODE的函数名称的函数句柄、内联函数或字符串:0 = f(t,y,yp)
。函数必须接受三个输入,其中第一个是时间t,第二个是函数值y(列向量),第三个是导数值yp(列向量)。
trange指定对ODE求值的时间间隔。通常,它是一个指定初始和最终时间的双元素向量([tinit, tfinal]
). 如果有两个以上的元素,那么也将在这些中间时间实例中评估解决方案。
y0和yp0包含未知数的初始值y和yp.如果它们是行向量,则解y将是amatrix,其中每列都是中相应初始值的解y0和yp0.
y0和yp0必须是一致的初始条件,这意味着f(t,y0,yp0) = 0
满足。函数decic
可以用于在给定初始猜测的情况下计算一致的初始条件。
可选的第五个参数ode_opt为ODE解算器指定非默认参数。它是从生成的结构体odeset
.
该函数通常返回两个输出。变量t是列向量,包含找到解决方案的时间。输出y是一个矩阵,其中每列指的是问题的差分,每行对应的是t.
输出也可以作为结构体返回solution它已经离开了x包含求解时间的行向量和字段y包含溶液矩阵,使得每列对应于x使用fieldnames (solution)
以查看返回的其他字段和其他信息。
如果没有指定输出参数,并且没有"OutputFcn"
在中指定ode_opt,然后"OutputFcn"
设置为odeplot
并且立即绘制解算器的结果。
如果使用"Events"
参数,则可以恢复三个附加输出。te保存Event函数返回零的时间。ye保持解决方案的值te. ie包含一个索引,指示在多个事件函数的情况下触发了哪个事件函数。
示例:求解Robertson方程:
function r = robertson_dae (t, y, yp) r = [ -(yp(1) + 0.04*y(1) - 1e4*y(2)*y(3)) -(yp(2) - 0.04*y(1) + 1e4*y(2)*y(3) + 3e7*y(2)^2) y(1) + y(2) + y(3) - 1 ]; endfunction [t,y] = ode15i (@robertson_dae, [0, 1e3], [1; 0; 0], [-1e-4; 1e-4; 0]);
[y0_new, yp0_new] =
decic (fcn, t0, y0, fixed_y0, yp0, fixed_yp0)
¶[y0_new, yp0_new] =
decic (fcn, t0, y0, fixed_y0, yp0, fixed_yp0, options)
¶[y0_new, yp0_new, resnorm] =
decic (…)
¶计算一致隐式ODE初始条件y0_new和yp0_new给出初步猜测y0和yp0.
最大值为length (y0)
之间的组件fixed_y0和fixed_yp0可以被选择为固定值。
fcn是一个函数句柄。函数必须接受三个输入,其中第一个是时间t,第二个是未知数的列向量y,第三个是未知数的列向量yp.
t0初始时间是这样的吗fcn(t0, y0_new, yp0_new) = 0
,指定为向量。
y0是用作的初始猜测的向量y.
fixed_y0是一个向量,它指定的分量y0已修复。最多选择个length (y0)
之间的组件fixed_y0和fixed_yp0作为固定值。设置fixed_y0(i) 如果要修复的值,则将组件设置为1y0(i) 。设置fixed_y0(i) 组件设置为0,如果您希望允许的值y0(i) 改变。
yp0是用作的初始猜测的向量yp.
fixed_yp0是一个向量,它指定的分量yp0已修复。最多选择个length (yp0)
组件之间fixed_y0和fixed_yp0作为固定值。设置fixed_yp0(i) 如果要修复的值,则将组件设置为1yp0(i) 。设置fixed_yp0(i) 组件设置为0,如果您希望允许的值yp0(i) 改变。
可选的第七个参数options是一个结构体数组。使用odeset
以生成该结构体。相关参数包括RelTol
和AbsTol
其指定用于计算初始条件的误差阈值。
该函数通常返回两个输出。变量y0_new是列向量,包含的一致初始值y.输出yp0_new是列向量,包含的一致初始值yp.
可选的第三个输出resnorm是残差向量的范数。如果resnorm是小的,decic
已成功计算出初始条件。如果的值resnorm很大,使用RelTol
和AbsTol
以进行调整。
示例:计算Robertson方程的初始条件:
function r = robertson_dae (t, y, yp) r = [ -(yp(1) + 0.04*y(1) - 1e4*y(2)*y(3)) -(yp(2) - 0.04*y(1) + 1e4*y(2)*y(3) + 3e7*y(2)^2) y(1) + y(2) + y(3) - 1 ]; endfunction
[y0_new,yp0_new]=decic(@robertson_date,0,[1;0;0],[1;1;0],[-1e-4;1;0],[0;0;0]);
odestruct =
odeset ()
¶odestruct =
odeset ("field1", value1, "field2", value2, …)
¶odestruct =
odeset (oldstruct, "field1", value1, "field2", value2, …)
¶odestruct =
odeset (oldstruct, newstruct)
¶()
¶创建或修改ODE参数结构体。
当在没有输入参数和一个输出参数的情况下调用时,返回一个新的ODEoptions结构体,该结构体包含初始化为默认值的所有可能字段。如果未指定输出参数,则显示常用ODE解算器参数及其默认值的列表。
如果使用名称值输入参数对调用"field1","value1", "field2", "value2",…返回一个新的ODE参数结构体,其中所有最常用的参数字段都已初始化,和设置字段的值"field1","field2",…到值value1, value2,….
如果使用输入结构体调用oldstruct然后覆盖参数的值"field1", "field2",…具有新值value1, value2,…并返回修改后的结构体。
当使用两个输入ODE参数结构体调用时oldstruct和newstruct覆盖结构体中的所有值oldstruct使用结构体中的新值newstruct。中的值为空newstruct不会覆盖中的值oldstruct.
最常用的ODE参数,总是从指定值odeset
,如下所示:
AbsTol
: positive scalar | vector, def. 1e-6
绝对误差容限。
BDF
: {"off"
} | "on"
在隐式多步骤方法中使用BDF公式。注意:此参数尚未支持。
Events
: function_handle事件函数。事件函数必须具有以下形式[value, isterminal, direction] = my_events_f (t, y)
InitialSlope
: vectorDAE解算器的一致初始斜率向量。
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要传递给outputmonitoring函数的状态向量元素的索引。
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)
¶查询属性的值field在ODE参数结构体中ode_opt.
如果使用两个输入参数和第一个输入参数调用ode_opt是ODE参数结构体和第二个输入参数field是一个指定参数名称的字符串,然后返回optionvalueval对应于field从…起ode_opt.
如果使用可选的第三个输入参数调用,以及field没有设置在结构体中ode_opt,然后返回默认值default相反
详见: odeset.
stop_solve =
odeplot (t, y, flag)
¶打开一个新的图形窗口,绘制集成过程中每个时间步骤的ode问题的解决方案。
输入参数的类型和值t和y取决于输入flag类型为字符串。的有效值flag是
"init"
输入t必须是长度为2、具有第一个和最后一个时间步长的列向量([tfirst tlast]
.输入y包含ode问题的初始条件(y0).
""
输入t必须是标量双精度或向量,指定输入解决方案的时间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, "RelTol", 1e-6); sol = ode45 (fvdp, [0 20], [2 0], opt);
背景信息:如果在中指定了此函数,则该函数从ode解算器函数调用"OutputFcn"
使用创建的参数结构体的属性odeset
。ode解算器最初将调用带有syntax的函数odeplot ([tfirst, tlast], y0, "init")
该函数初始化内部变量,创建一个新的图形窗口,并设置绘图的x极限。随后,在集成过程中的每个时间步长,ode解算器调用odeplot (t, y, [])
。在解决方案结束时,ode解算器调用odeplot ([], [], "done")
以便odeplot可以执行所需的任何清理操作。
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2