odeset
为 ODE 和 PDE 求解器创建或修改 options 结构体
语法
说明
创建 options 结构体,您可以将其作为参量传递给 ODE 和 PDE 求解器。在结构体 options
= odeset(Name,Value
,...)options
中,指定选项具有指定的值。任何未指定的选项都使用默认值。例如,options = odeset('RelTol',1e-3)
返回 RelTol
设置为 1e-3
的 options 结构体。
使用新指定的名称-值参量修改现有的 options 结构体 options
= odeset(oldopts
,Name,Value
,...)oldopts
。这样将覆盖指定选项的任何旧值,并将新选项的值添加到结构体中。
不带输入参量的 odeset
将显示所有可能的选项名称及其可能的值。默认值通过 {}
指出(如果适用)。
示例
设置和更新 ODE 选项
创建一个 options 结构体,其中包含 RelTol
和 AbsTol
的值。
options = odeset('RelTol',1e-8,'AbsTol',1e-10);
更新现有 options 结构体中的 AbsTol
值。
options = odeset(options,'AbsTol',1e-9)
options = struct with fields:
AbsTol: 1.0000e-09
BDF: []
Events: []
InitialStep: []
Jacobian: []
JConstant: []
JPattern: []
Mass: []
MassSingular: []
MaxOrder: []
MaxStep: []
NonNegative: []
NormControl: []
OutputFcn: []
OutputSel: []
Refine: []
RelTol: 1.0000e-08
Stats: []
Vectorized: []
MStateDependence: []
MvPattern: []
InitialSlope: []
合并 options 结构体
创建两个 options 结构体。
opts_1 = odeset('RelTol',1e-8,'AbsTol',1e-9,'OutputFcn',@odeplot,'Stats','on');
opts_2 = odeset('Mass',@(t) [t 0; 0 -t],'MStateDependence','none',... 'MassSingular','no','OutputFcn',@odephas2);
合并 options 结构体,为 opts_2
提供优先权。由于两个结构体包含不同的 OutputFcn
值,opts_2
中的值将覆盖 opts_1
中的值。
opts = odeset(opts_1,opts_2)
opts = struct with fields:
AbsTol: 1.0000e-09
BDF: []
Events: []
InitialStep: []
Jacobian: []
JConstant: []
JPattern: []
Mass: @(t)[t,0;0,-t]
MassSingular: 'no'
MaxOrder: []
MaxStep: []
NonNegative: []
NormControl: []
OutputFcn: @odephas2
OutputSel: []
Refine: []
RelTol: 1.0000e-08
Stats: 'on'
Vectorized: []
MStateDependence: 'none'
MvPattern: []
InitialSlope: []
输入参数
oldopts
— 旧的 options 结构体
结构体
旧的 options 结构体,指定为以前使用 odeset
创建的结构体。
数据类型: struct
newopts
— 新的 options 结构体
结构体
新的 options 结构体,指定为以前使用 odeset
创建的结构体。
数据类型: struct
名称-值参数
将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参量名称,Value
是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: options = odeset('AbsTol',1e-3,'Reltol',1e-2,'Jacobian',@J,'Mass',M)
指定绝对和相对误差容限的阈值、返回雅可比矩阵的函数和一个数值质量矩阵。
RelTol
— 相对误差容限
1e-3
(默认) | 正标量
相对误差容限,以逗号分隔的对组形式指定,其中包含 'RelTol'
和一个正标量。此容差测量相对于每个解分量的量级的误差。大致说来,它控制所有解分量中的正确数字的个数,但小于绝对容差 AbsTol
的解分量除外。
在每一步中,ODE 求解器计算解的第 i
个分量的局部误差 e
。要取得成功,步长必须具有可接受的误差,误差由相对和绝对误差容限确定:
|e(i)| <= max(RelTol*abs(y(i)),AbsTol(i))
示例: opts = odeset('RelTol',1e-5,'AbsTol',1e-7)
数据类型: single
| double
AbsTol
— 绝对误差容限
1e-6
(默认) | 正标量 | 向量
绝对误差容限,以逗号分隔的对组形式指定,其中包含 'AbsTol'
和一个正的标量或向量。此容差是一个阈值,低于此阈值的解值将不重要。如果解 |y|
小于 AbsTol
,则求解器不需要获取 |y|
中的任何正确数字。因此,AbsTol
的值应考虑解分量的范围。
如果 AbsTol
为向量,则它必须与解具有相同的长度。如果 AbsTol
为标量,则值适用于所有解分量。
在每一步中,ODE 求解器计算解的第 i
个分量的局部误差 e
。要取得成功,步长必须具有可接受的误差,误差由相对和绝对误差容限确定:
|e(i)| <= max(RelTol*abs(y(i)),AbsTol(i))
示例: opts = odeset('RelTol',1e-5,'AbsTol',1e-7)
数据类型: single
| double
NormControl
— 根据范数控制误差
'off'
(默认) | 'on'
控制相对于解范数的误差,以逗号分隔的对组形式指定,其中包含 'NormControl'
以及 'on'
或 'off'
。当 NormControl
为 'on'
时,求解器使用解的范数(而不是其绝对值)控制每一步的误差 e
:
norm(e(i)) <= max(RelTol*norm(y(i)),AbsTol(i))
示例: opts = odeset('NormControl','on')
数据类型: char
| string
NonNegative
— 非负解分量
[]
(默认) | 标量 | 向量
非负解分量,以逗号分隔的对组形式指定,其中包含 'NonNegative'
和一个标量或向量。标量或向量选择哪些解分量必须为非负数。
注意
NonNegative
不适用于 ode23s
或 ode15i
。此外,对于 ode15s
、ode23t
和 ode23tb
,它不适用于涉及质量矩阵的问题。
示例: opts = odeset('NonNegative',1)
指定第一个解分量必须为非负数。
数据类型: single
| double
OutputFcn
— 输出函数
[]
或 @odeplot
(默认) | 函数句柄
输出函数,以逗号分隔的对组形式指定,其中包含 'OutputFcn'
和一个函数句柄。ODE 求解器会在每个成功的时间步后调用输出函数。如果您调用没有任何输出的 ODE 求解器,则输出函数默认为 @odeplot
,即在计算时绘制所有解分量。否则,默认值为 []
。
以下是可以与 OutputFcn
一起使用的内置输出函数:
函数名称 | 描述 |
---|---|
odeplot | 绘制所有解分量与时间 |
odephas2 | 前两个解分量的二维相平面图 |
odephas3 | 前三个解分量的三维相平面图 |
odeprint | 打印解和时间步 |
如果您编写自定义输出函数,必须采用以下形式:
status = myOutputFcn(t,y,flag)
输出函数还必须对下列标志做出适当响应:
标志 | 描述 |
---|---|
'init' | 求解器在积分开始前调用 |
[] | 求解器在每个请求输出的积分步长之后调用
|
'done' | 积分完成后,求解器调用 |
数据类型: function_handle
OutputSel
— 输出函数的分量选择
索引向量
输出函数的分量选择,以逗号分隔的对组形式指定,其中包含 'OutputSel'
和一个索引向量。向量指定要将哪些解分量传递给输出函数。
示例: opts = odeset('OutputFcn',@myFcn,'OutputSel',[1 3])
将第一个和第三个解分量传递给输出函数。
Refine
— 解细化因子
标量
解细化因子,指定为以逗号分隔的对组,包含 'Refine'
和一个标量。标量指定一个因子,该因子决定每步中应增加的输出点数。
对于大多数求解器,Refine
的默认值为 1
,但 ode45
使用默认值 4
,而 ode78
和 ode89
使用默认值 8
。这些求解器使用较大的默认值来补偿它们采用大步长的倾向。
如果细化因子为
1
,求解器将只返回每步末尾的解。如果细化因子为
n > 1
,则求解器将每步分为n
个更小的区间,并返回每个点处的解。
细化因子生成的额外值是通过连续展开公式计算而来的。这些公式是专用公式,供 ODE 求解器用于在计算的时间步长之间获取正确的解,而不会大幅延长计算时间。
注意
当 length(tspan) > 2
或者 ODE 求解器以结构体形式返回解时,Refine
不适用。
示例: opts = odeset('Refine',5)
按照因子 5 增加输出点数。
Stats
— 求解器统计信息
'off'
(默认) | 'on'
求解器统计信息,以逗号分隔的对组形式指定,其中包含 'Stats'
以及 'on'
或 'off'
。当为 'on'
时,求解器会在完成解之后显示信息:
成功步长的数目
失败尝试次数
调用 ODE 函数的以便计算 的次数
隐式求解器显示解的其他信息:
构成偏导数矩阵 的次数
LU 分解的次数
线性方程组的解的数目
示例: opts = odeset('Stats','on')
数据类型: char
| string
InitialStep
— 建议的初始步长
标量
建议的初始步长,以逗号分隔的对组形式指定,其中包含 'InitialStep'
和一个正标量。InitialStep
设置求解器尝试的第一个步长的量级上限。
如果不指定初始步长,求解器将基于初始时间点 tspan(1)
处的解的斜率确定初始步长。如果所有解分量的斜率为零,则求解器尝试的步长可能太大。如果您意识到出现这种情况,或者要确保求解器解析积分开始时的重要行为,则使用 InitialStep
提供合适的初始步长。
示例: opts = odeset('InitialStep',1e-3)
将初始步长的上限设置为 1e-3
。
MaxStep
— 最大步长
0.1*abs(t0-tf)
(默认) | 标量
最大步长,以逗号分隔的对组形式指定,其中包含 'MaxStep'
和一个正标量。MaxStep
设置求解器使用的任何步长的上限。例如,如果方程存在周期性行为,则将 MaxStep
设置为该周期的一部分可确保求解器不会将步长增大太多,导致越过目标区域。
不要只是为获得更多输出点而使用
MaxStep
,因为它会大大降低积分速度。要以较低的计算成本计算其他点,请改用Refine
选项。不要使用
MaxStep
来提高解的准确性。如果解不够准确,可以减小RelTol
的值,并使用解来确定AbsTol
的合适值。避免使用
MaxStep
来确保求解器不会越过积分区间仅发生一次的某些行为。如果您知道行为发生的时间,则将区间划分为两个部分,并调用两次求解器。如果您不知道发生更改的时间,请尝试减小RelTol
和AbsTol
。这种情况下,只能将MaxStep
作为最后的手段。
示例: opts = odeset('MaxStep',1e-2)
Events
— 事件函数
函数句柄
事件函数,以逗号分隔的对组形式指定,其中包含 'Events'
和一个函数句柄,例如 @myEventsFcn
。
函数签名
对于 ODE:由函数句柄指定的事件函数必须采用下面的一般形式:
[value,isterminal,direction] = myEventsFcn(t,y)
对于 PDE:由函数句柄指定的事件函数必须采用下面的一般形式:
[value,isterminal,direction] = myEventsFcn(m,t,xmesh,umesh)
在这两种情况下,value
、isterminal
和 direction
是第 i
个元素与第 i
个事件函数相对应的向量:
value(i)
是第i
个事件函数的值。如果积分将在此事件函数为零的位置终止,则
isterminal(i) = 1
。否则为0
。如果需要查找全零值(默认值),则
direction(i) = 0
。值为+1
时仅在事件函数递增的位置查找零,值为-1
时仅在事件函数递减的位置查找零。
有关如何向事件函数传入额外输入的信息,请参阅参数化函数。
事件输出
如果您指定事件函数,可以使用三个额外的输出参量调用求解器,例如:
[t,y,te,ye,ie] = odeXY(odefun,tspan,y0,options)
求解器返回的三个附加输出对应于检测到的事件:
te
是发生事件的时刻的列向量。ye
是与te
中的事件时间对应的解值。ie
是事件函数返回的向量的索引。这些值指示求解器检测到的事件。
还可以调用具有单个输出的求解器:
sol = odeXY(odefun,tspan,y0,options)
这种情况下,事件信息以 sol.te
、sol.ye
和 sol.ie
的形式存储在结构体中。
诊断
ODE/PDE 求解器与事件函数一起所采用的求根机制存在以下限制:
如果在积分的第一步即发生终止事件,则求解器会将该事件记录为非终止事件并继续积分。
如果在第一步发生多个终止事件,则仅记录第一个事件,并且求解器会继续积分。
零值由每步之间的符号交叉确定。因此,各步之间具有偶数交叉点的零点可能会被漏掉。
如果求解器步长跨越了多个事件,请尝试减小 RelTol
和 AbsTol
以提高精度。也可以设置 MaxStep
以便为步长设置上限。调整 tspan
不会更改求解器所用的步长。
示例
有关检测球的反弹和天体轨道的 ODE 事件函数的示例,请参阅ODE 事件位置。
有关检测振荡解过零点的 PDE 事件函数的示例,请参阅求解振荡 PDE 并记录事件。
数据类型: function_handle
Jacobian
— 雅可比矩阵
矩阵 | 函数句柄 | 元胞数组
雅可比矩阵,以逗号分隔的对组形式指定,其中包含 'Jacobian'
和一个矩阵、元胞数组或函数(用于计算雅可比)。雅可比是定义微分方程的函数的偏导数矩阵。
您可以将雅可比矩阵指定为具有 计算值的常量矩阵,或指定为计算矩阵元素并具有以下一般形式的函数
dfdy = Fjac(t,y)
对于刚性 ODE 求解器(ode15s
、ode23s
、ode23t
、ode23tb
和 ode15i
),提供雅可比矩阵信息对可靠性和效率至关重要。如果不提供雅可比,ODE 求解器将使用有限差分以数值方式求其近似值。
仅适用于 ode15i
:Jacobian
选项必须为 和 都指定矩阵。您可以通过下面两种方式提供这些矩阵,使用包含两个常量矩阵的元胞数组 ,或者使用一般形式如下的用于计算矩阵的函数:
[dfdy, dfdp] = Fjac(t,y,yp)
对于无法提供整个分析雅可比矩阵的超大型方程组,请使用 JPattern
属性来传入雅可比矩阵的稀疏模式。求解器使用稀疏模式计算稀疏雅可比矩阵。
示例: opts = odeset('Jacobian',@Fjac)
指定函数 Fjac
来计算雅可比矩阵。
示例: opts = odeset('Jacobian',[0 1; -2 1])
指定常量雅可比矩阵。
示例: opts = odeset('Jacobian',{A,Ap})
指定两个常量雅可比矩阵以用于 ode15i
。
数据类型: single
| double
| cell
| function_handle
JPattern
— 雅可比稀疏模式
稀疏矩阵 | 元胞数组
雅可比稀疏模式,以逗号分隔的对组形式指定,其中包含 'JPattern'
和一个稀疏矩阵。稀疏矩阵中的 1
值表示雅可比中相应位置可能为非零项。ODE 求解器使用稀疏模式以数值方式生成雅可比稀疏矩阵。对于无法提供分析雅可比矩阵的大型 ODE 方程组,使用此选项可以缩短执行时间。
仅适用于 ode15i
:使用包含两个稀疏矩阵 {dfdyPattern, dfdypPattern}
的元胞数组设置 JPattern
选项,它们是 和 的稀疏模式。
注意
如果您使用 Jacobian
指定雅可比矩阵,求解器将忽略 JPattern
的任何设置。
示例: opts = odeset('JPattern',S)
使用稀疏矩阵 S
指定雅可比矩阵的稀疏模式。
示例: opts = odeset('JPattern',{dFdy, dFdyp})
指定两个常量雅可比稀疏模式以用于 ode15i
。
数据类型: double
| cell
Vectorized
— 向量化的函数切换
'off'
(默认) | 'on'
| 元胞数组
向量化函数切换,指定为由 'Vectorized'
和 'off'
或 'on'
组成的逗号分隔的对组。使用此选项告知 ODE 求解器函数经过编码,使它接受第二个参量并返回向量。也就是说,f(t,[y1 y2 y3...])
将返回 [f(t,y1) f(t,y2) f(t,y3) ...]
。与每次计算一个值相比,这种向量化允许求解器减少计算雅可比矩阵的所有列所需的函数计算数,可大幅减少求解时间。有关支持向量化的按元素运算符的说明,请参阅数组与矩阵运算。
仅适用于 ode15i
:使用二元素元胞数组设置 Vectorized
选项。如果 f(t,[y1,y2,...],yp)
返回 [f(t,y1,yp), f(t,y2,yp), ...]
,将第一个元素设置为 'on'
。如果 f(t,y,[yp1,yp2,...])
返回 [f(t,y,yp1), f(t,y,yp2), ...]
,将第二个元素设置为 'on'
。在这种情况下,Vectorized
的默认值为 {'off','off'}
。
注意
如果您使用 Jacobian
指定雅可比矩阵,求解器将忽略 Vectorized
的 'on'
的一项设置。
示例: opts = odeset('JPattern',S,'Vectorized','on')
指定函数已向量化,并设置雅可比稀疏模式。
示例: opts = odeset('JPattern',{dy,dyp},'Vectorized',{'on','on'})
指定函数已针对 y
和 yp
进行向量化,并设置雅可比稀疏模式以用于 ode15i
。
数据类型: char
| cell
| string
ode15i
)Mass
— 质量矩阵
矩阵 | 函数句柄
质量矩阵,以逗号分隔的对组形式指定,其中包含 'Mass'
和一个矩阵或函数句柄。ODE 求解器可以解算包含 形式的质量矩阵的问题,其中 是一个质量矩阵,可以是满矩阵,也可以是稀疏矩阵(ode23s
求解器只能解算具有常量质量矩阵的方程)。
如果质量矩阵是非奇异矩阵,该方程将简化为 且 ODE 对任何初始值都有解。但是,通常更方便、更自然的方式是直接使用 以质量矩阵来表示模型,而且避免矩阵求逆计算可以减少解算问题所需的存储和执行时间。
当 是奇异矩阵时,该问题就是一个微分代数方程组 (DAE)。DAE 只有在
y0
一致时才有解;也就是说,存在一个初始斜率yp0
使得M(t0,y0)yp0 = f(t0,y0)
,其中yp0
是使用InitialSlope
选项指定的。DAE 的特点在于其微分指数,即将一个方程组简化为等价的 ODE 方程组所需要的导数数量。对于索引为 1 的 DAE,在初始条件一致的情况下解算初始值问题与解算 ODE 非常相似。ode15s
和ode23t
求解器可解算索引为 1 的 DAE。当解算 DAE 时,用公式表示问题以将质量矩阵变换为对角矩阵(半显式 DAE),会很有帮助。
在所有情况下,基于时间或状态(而不是常量)的质量矩阵需要使用附加选项:
对于 形式的问题,请将
MStateDependence
选项设置为'none'
。这样可以确保求解器调用带单个t
输入参量的质量矩阵函数。如果质量矩阵依赖于
y
,则将MStateDependence
设置为'weak'
(默认值)或'strong'
。在这两种情况下,求解器都会调用带有两个输入(t,y)
的质量矩阵函数,但'weak'
选项会导致隐式求解器在解算代数方程时使用近似值。如果方程组包含强烈依赖于状态的质量矩阵 的多个方程,则将
MvPattern
设置为稀疏矩阵S
以指定稀疏模式。
示例: 示例文件 fem2ode
和 batonode
演示了质量矩阵的不同用法。
数据类型: single
| double
| function_handle
MStateDependence
— 质量矩阵的状态依赖性
'weak'
(默认) | 'none'
| 'strong'
质量矩阵的状态依赖性,以逗号分隔的对组形式指定,其中包含 'MStateDependence
以及 'weak'
、'strong'
或 'none'
。
对于 形式的问题,请将
MStateDependence
选项设置为'none'
。这样可以确保求解器调用带单个t
输入参量的质量矩阵函数。如果质量矩阵依赖于
y
,则将MStateDependence
设置为'weak'
(默认值)或'strong'
。在这两种情况下,求解器都会调用带有两个输入(t,y)
的质量矩阵函数,但'weak'
选项会导致隐式求解器在解算代数方程时使用近似值。
示例: opts = odeset('Mass',@M,'MStateDependence','none')
指定质量矩阵 M
仅依赖于 t
。
数据类型: char
| string
MvPattern
— 质量矩阵的稀疏模式
稀疏矩阵
质量矩阵的稀疏模式,以逗号分隔的对组形式指定,其中包含 'MvPattern'
和一个稀疏矩阵。使用此选项指定矩阵 的稀疏模式。如果对于任何 k
, 的 (i,k)
分量依赖于 y
的 j
分量,则稀疏矩阵 S
满足 S(i,j) = 1
。
注意
当 MStateDependence
为 'strong'
时,MvPattern
可供 ode15s
、ode23t
和 ode23tb
使用。
示例: opts = odeset('MStateDependence','strong','MvPattern',S)
MassSingular
— 奇异质量矩阵切换
'maybe'
(默认) | 'yes'
| 'no'
奇异质量矩阵切换,以逗号分隔的对组形式指定,其中包含 'MassSingular'
以及 'maybe'
、'yes'
或 'no'
。默认值 'maybe'
可使得求解器通过测试质量矩阵是否为奇异矩阵来测试问题是否为 DAE。要避免此项检查,如果您知道是 DAE 方程组,可以指定 'yes'
;如果不是 DAE 方程组,可以指定 'no'
。
数据类型: char
| string
InitialSlope
— 一致初始斜率
零向量 (默认) | 向量
一致初始斜率,指定为以逗号分隔的对组,包含 'InitialSlope'
和一个向量。采用 ode15s
和 ode23t
求解器解算 DAE 时使用此选项。指定的向量为初始斜率 ,因此 。如果指定的初始条件不一致,求解器会将其视为猜想值,尝试计算与猜想值接近的一致值,并继续解算该问题。
数据类型: single
| double
ode15s
和 ode15i
MaxOrder
— 公式的最大阶次
5
(默认) | 4
| 3
| 2
| 1
公式的最大阶次,以逗号分隔的对组形式指定,其中包含 'MaxOrder'
和一个介于 1
和 5
之间的整数。使用此选项可指定变阶求解器 ode15s
和 ode15i
使用的数值微分公式 (NDF) 或后向差分公式 (BDF) 中使用的最大阶次。
BDF
— 指示是否将 BDF 用于 ode15s
的开关
'off'
(默认) | 'on'
指示是否将后向差分公式 (BDF) 用于 ode15s
的开关,以逗号分隔的对组形式指定,其中包含 'BDF'
以及 'off'
或 'on'
。默认的数值微分公式 (NDF) 通常比 BDF 更高效,但二者密切相关。
示例: opts = odeset('BDF','on','MaxOrder',4)
允许 ode15s
使用 BDF,最大阶次为 4
。
数据类型: char
| string
输出参量
options
— Options 结构体
结构体
Options 结构体。options
可用作 ode45
、ode23
、ode113
、ode15s
、ode23s
、ode23t
、ode23tb
或 ode15i
的第四个输入参量。
提示
有关演示如何使用各种选项的 ODE 示例的列表,请参阅 ODE 示例和文件摘要。
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
所有输入都必须为常量。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
版本历史记录
在 R2006a 之前推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)