Main Content

odeset

为 ODE 和 PDE 求解器创建或修改 options 结构体

说明

示例

options = odeset(Name,Value,...) 创建 options 结构体,您可以将其作为参量传递给 ODE 和 PDE 求解器。在结构体 options 中,指定选项具有指定的值。任何未指定的选项都使用默认值。例如,options = odeset('RelTol',1e-3) 返回 RelTol 设置为 1e-3 的 options 结构体。

示例

options = odeset(oldopts,Name,Value,...) 使用新指定的名称-值参量修改现有的 options 结构体 oldopts。这样将覆盖指定选项的任何旧值,并将新选项的值添加到结构体中。

示例

options = odeset(oldopts,newopts) 通过合并现有 options 结构体 oldopts 和新 options 结构体 newopts 来修改现有 options 结构体。任何不等于 [] 的新选项都会覆盖 oldopts 中的相应选项。

不带输入参量的 odeset 将显示所有可能的选项名称及其可能的值。默认值通过 {} 指出(如果适用)。

示例

全部折叠

创建一个 options 结构体,其中包含 RelTolAbsTol 的值。

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 结构体。

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: []

输入参数

全部折叠

旧的 options 结构体,指定为以前使用 odeset 创建的结构体。

数据类型: struct

新的 options 结构体,指定为以前使用 odeset 创建的结构体。

数据类型: struct

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: options = odeset('AbsTol',1e-3,'Reltol',1e-2,'Jacobian',@J,'Mass',M) 指定绝对和相对误差容限的阈值、返回雅可比矩阵的函数和一个数值质量矩阵。

误差控制

全部折叠

相对误差容限,以逗号分隔的对组形式指定,其中包含 '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' 和一个正的标量或向量。此容差是一个阈值,低于此阈值的解值将不重要。如果解 |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' 以及 'on''off'。当 NormControl'on' 时,求解器使用解的范数(而不是其绝对值)控制每一步的误差 e

norm(e(i)) <= max(RelTol*norm(y(i)),AbsTol(i))

示例: opts = odeset('NormControl','on')

数据类型: char | string

求解器输出

全部折叠

非负解分量,以逗号分隔的对组形式指定,其中包含 'NonNegative' 和一个标量或向量。标量或向量选择哪些解分量必须为非负数。

注意

NonNegative 不适用于 ode23sode15i。此外,对于 ode15sode23tode23tb,它不适用于涉及质量矩阵的问题。

示例: opts = odeset('NonNegative',1) 指定第一个解分量必须为非负数。

数据类型: single | double

输出函数,以逗号分隔的对组形式指定,其中包含 'OutputFcn' 和一个函数句柄。ODE 求解器会在每个成功的时间步后调用输出函数。如果您调用没有任何输出的 ODE 求解器,则输出函数默认为 @odeplot,即在计算时绘制所有解分量。否则,默认值为 []

以下是可以与 OutputFcn 一起使用的内置输出函数:

函数名称描述
odeplot绘制所有解分量与时间
odephas2前两个解分量的二维相平面图
odephas3前三个解分量的三维相平面图
odeprint打印解和时间步

如果您编写自定义输出函数,必须采用以下形式:

status = myOutputFcn(t,y,flag)

输出函数还必须对下列标志做出适当响应:

标志描述
'init'

求解器在积分开始前调用 myOutputFcn([tspan(1) tspan(end)],y0,'init'),以便允许初始化输出函数。tspany0 是 ODE 求解器的输入参量。

[]

求解器在每个请求输出的积分步长之后调用 status = myOutputFcn(t,y,[]),系统将在积分步长中请求输出。t 包含在步长执行过程中生成输出的点,y 是这些点在 t 中的数值解。如果 t 为向量,则 y 的第 i 个列与 t 的第 i 个元素相对应。

  • 如果 length(tspan) > 2,将在 tspan 中的每个点生成输出。

  • 如果 length(tspan) = 2,将根据 Refine 选项生成输出。

myOutputFcn 必须返回状态 01。如果 status = 1,求解器会停止积分。例如,您可以使用此机制实现停止按钮。

'done'

积分完成后,求解器调用 myOutputFcn([],[],'done') 以便允许输出函数执行清除任务。

数据类型: function_handle

输出函数的分量选择,以逗号分隔的对组形式指定,其中包含 'OutputSel' 和一个索引向量。向量指定要将哪些解分量传递给输出函数。

示例: opts = odeset('OutputFcn',@myFcn,'OutputSel',[1 3]) 将第一个和第三个解分量传递给输出函数。

解细化因子,指定为以逗号分隔的对组,包含 'Refine' 和一个标量。标量指定一个因子,该因子决定每步中应增加的输出点数。

对于大多数求解器,Refine 的默认值为 1,但 ode45 使用默认值 4,而 ode78ode89 使用默认值 8。这些求解器使用较大的默认值来补偿它们采用大步长的倾向。

  • 如果细化因子为 1,求解器将只返回每步末尾的解。

  • 如果细化因子为 n > 1,则求解器将每步分为 n 个更小的区间,并返回每个点处的解。

细化因子生成的额外值是通过连续展开公式计算而来的。这些公式是专用公式,供 ODE 求解器用于在计算的时间步长之间获取正确的解,而不会大幅延长计算时间。

注意

length(tspan) > 2 或者 ODE 求解器以结构体形式返回解时,Refine 不适用。

示例: opts = odeset('Refine',5) 按照因子 5 增加输出点数。

求解器统计信息,以逗号分隔的对组形式指定,其中包含 'Stats' 以及 'on''off'。当为 'on' 时,求解器会在完成解之后显示信息:

  • 成功步长的数目

  • 失败尝试次数

  • 调用 ODE 函数的以便计算 f(t,y) 的次数

隐式求解器显示解的其他信息:

  • 构成偏导数矩阵 f/y 的次数

  • LU 分解的次数

  • 线性方程组的解的数目

示例: opts = odeset('Stats','on')

数据类型: char | string

步长

全部折叠

建议的初始步长,以逗号分隔的对组形式指定,其中包含 'InitialStep' 和一个正标量。InitialStep 设置求解器尝试的第一个步长的量级上限。

如果不指定初始步长,求解器将基于初始时间点 tspan(1) 处的解的斜率确定初始步长。如果所有解分量的斜率为零,则求解器尝试的步长可能太大。如果您意识到出现这种情况,或者要确保求解器解析积分开始时的重要行为,则使用 InitialStep 提供合适的初始步长。

示例: opts = odeset('InitialStep',1e-3) 将初始步长的上限设置为 1e-3

最大步长,以逗号分隔的对组形式指定,其中包含 'MaxStep' 和一个正标量。MaxStep 设置求解器使用的任何步长的上限。例如,如果方程存在周期性行为,则将 MaxStep 设置为该周期的一部分可确保求解器不会将步长增大太多,导致越过目标区域。

  • 不要只是为获得更多输出点而使用 MaxStep,因为它会大大降低积分速度。要以较低的计算成本计算其他点,请改用 Refine 选项。

  • 不要使用 MaxStep 来提高解的准确性。如果解不够准确,可以减小 RelTol 的值,并使用解来确定 AbsTol 的合适值。

  • 避免使用 MaxStep 来确保求解器不会越过积分区间仅发生一次的某些行为。如果您知道行为发生的时间,则将区间划分为两个部分,并调用两次求解器。如果您不知道发生更改的时间,请尝试减小 RelTolAbsTol。这种情况下,只能将 MaxStep 作为最后的手段。

示例: opts = odeset('MaxStep',1e-2)

事件位置

全部折叠

事件函数,以逗号分隔的对组形式指定,其中包含 'Events' 和一个函数句柄,例如 @myEventsFcn

函数签名

对于 ODE:由函数句柄指定的事件函数必须采用下面的一般形式:

[value,isterminal,direction] = myEventsFcn(t,y)

对于 PDE:由函数句柄指定的事件函数必须采用下面的一般形式:

[value,isterminal,direction] = myEventsFcn(m,t,xmesh,umesh)

在这两种情况下,valueisterminaldirection 是第 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.tesol.yesol.ie 的形式存储在结构体中。

诊断

ODE/PDE 求解器与事件函数一起所采用的求根机制存在以下限制:

  • 如果在积分的第一步即发生终止事件,则求解器会将该事件记录为非终止事件并继续积分。

  • 如果在第一步发生多个终止事件,则仅记录第一个事件,并且求解器会继续积分。

  • 零值由每步之间的符号交叉确定。因此,各步之间具有偶数交叉点的零点可能会被漏掉。

如果求解器步长跨越了多个事件,请尝试减小 RelTolAbsTol 以提高精度。也可以设置 MaxStep 以便为步长设置上限。调整 tspan 不会更改求解器所用的步长。

示例

数据类型: function_handle

雅可比矩阵

全部折叠

雅可比矩阵,以逗号分隔的对组形式指定,其中包含 'Jacobian' 和一个矩阵、元胞数组或函数(用于计算雅可比)。雅可比是定义微分方程的函数的偏导数矩阵。

J=fy=[f1y1f1y2f2y1f2y2]

您可以将雅可比矩阵指定为具有 fy 计算值的常量矩阵,或指定为计算矩阵元素并具有以下一般形式的函数

dfdy = Fjac(t,y)

对于刚性 ODE 求解器(ode15sode23sode23tode23tbode15i),提供雅可比矩阵信息对可靠性和效率至关重要。如果不提供雅可比,ODE 求解器将使用有限差分以数值方式求其近似值。

仅适用于 ode15iJacobian 选项必须为 fyfy' 都指定矩阵。您可以通过下面两种方式提供这些矩阵,使用包含两个常量矩阵的元胞数组 {fy,fy'},或者使用一般形式如下的用于计算矩阵的函数:

[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' 和一个稀疏矩阵。稀疏矩阵中的 1 值表示雅可比中相应位置可能为非零项。ODE 求解器使用稀疏模式以数值方式生成雅可比稀疏矩阵。对于无法提供分析雅可比矩阵的大型 ODE 方程组,使用此选项可以缩短执行时间。

仅适用于 ode15i:使用包含两个稀疏矩阵 {dfdyPattern, dfdypPattern} 的元胞数组设置 JPattern 选项,它们是 fyfy' 的稀疏模式。

注意

如果您使用 Jacobian 指定雅可比矩阵,求解器将忽略 JPattern 的任何设置。

示例: opts = odeset('JPattern',S) 使用稀疏矩阵 S 指定雅可比矩阵的稀疏模式。

示例: opts = odeset('JPattern',{dFdy, dFdyp}) 指定两个常量雅可比稀疏模式以用于 ode15i

数据类型: double | cell

向量化函数切换,指定为由 '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'}) 指定函数已针对 yyp 进行向量化,并设置雅可比稀疏模式以用于 ode15i

数据类型: char | cell | string

质量矩阵和 DAE(不适用于 ode15i

全部折叠

质量矩阵,以逗号分隔的对组形式指定,其中包含 'Mass' 和一个矩阵或函数句柄。ODE 求解器可以解算包含 M(t,y)y'=f(t,y) 形式的质量矩阵的问题,其中 M(t,y) 是一个质量矩阵,可以是满矩阵,也可以是稀疏矩阵(ode23s 求解器只能解算具有常量质量矩阵的方程)。

  • 如果质量矩阵是非奇异矩阵,该方程将简化为 y'=M1f(t,y) 且 ODE 对任何初始值都有解。但是,通常更方便、更自然的方式是直接使用 M(t,y)y'=f(t,y) 以质量矩阵来表示模型,而且避免矩阵求逆计算可以减少解算问题所需的存储和执行时间。

  • M(t,y) 是奇异矩阵时,该问题就是一个微分代数方程组 (DAE)。DAE 只有在 y0 一致时才有解;也就是说,存在一个初始斜率 yp0 使得 M(t0,y0)yp0 = f(t0,y0),其中 yp0 是使用 InitialSlope 选项指定的。DAE 的特点在于其微分指数,即将一个方程组简化为等价的 ODE 方程组所需要的导数数量。对于索引为 1 的 DAE,在初始条件一致的情况下解算初始值问题与解算 ODE 非常相似。ode15sode23t 求解器可解算索引为 1 的 DAE。当解算 DAE 时,用公式表示问题以将质量矩阵变换为对角矩阵(半显式 DAE),会很有帮助。

在所有情况下,基于时间或状态(而不是常量)的质量矩阵需要使用附加选项:

  • 对于 M(t)y'=f(t,y) 形式的问题,请将 MStateDependence 选项设置为 'none'。这样可以确保求解器调用带单个 t 输入参量的质量矩阵函数。

  • 如果质量矩阵依赖于 y,则将 MStateDependence 设置为 'weak'(默认值)或 'strong'。在这两种情况下,求解器都会调用带有两个输入 (t,y) 的质量矩阵函数,但 'weak' 选项会导致隐式求解器在解算代数方程时使用近似值。

  • 如果方程组包含强烈依赖于状态的质量矩阵 M(t,y) 的多个方程,则将 MvPattern 设置为稀疏矩阵 S 以指定稀疏模式。

示例: 示例文件 fem2odebatonode 演示了质量矩阵的不同用法。

数据类型: single | double | function_handle

质量矩阵的状态依赖性,以逗号分隔的对组形式指定,其中包含 'MStateDependence 以及 'weak''strong''none'

  • 对于 M(t)y'=f(t,y) 形式的问题,请将 MStateDependence 选项设置为 'none'。这样可以确保求解器调用带单个 t 输入参量的质量矩阵函数。

  • 如果质量矩阵依赖于 y,则将 MStateDependence 设置为 'weak'(默认值)或 'strong'。在这两种情况下,求解器都会调用带有两个输入 (t,y) 的质量矩阵函数,但 'weak' 选项会导致隐式求解器在解算代数方程时使用近似值。

示例: opts = odeset('Mass',@M,'MStateDependence','none') 指定质量矩阵 M 仅依赖于 t

数据类型: char | string

质量矩阵的稀疏模式,以逗号分隔的对组形式指定,其中包含 'MvPattern' 和一个稀疏矩阵。使用此选项指定矩阵 y[M(t,y)v] 的稀疏模式。如果对于任何 kM(t,y)(i,k) 分量依赖于 yj 分量,则稀疏矩阵 S 满足 S(i,j) = 1

注意

MStateDependence'strong' 时,MvPattern 可供 ode15sode23tode23tb 使用。

示例: opts = odeset('MStateDependence','strong','MvPattern',S)

奇异质量矩阵切换,以逗号分隔的对组形式指定,其中包含 'MassSingular' 以及 'maybe''yes''no'。默认值 'maybe' 可使得求解器通过测试质量矩阵是否为奇异矩阵来测试问题是否为 DAE。要避免此项检查,如果您知道是 DAE 方程组,可以指定 'yes';如果不是 DAE 方程组,可以指定 'no'

数据类型: char | string

一致初始斜率,指定为以逗号分隔的对组,包含 'InitialSlope' 和一个向量。采用 ode15sode23t 求解器解算 DAE 时使用此选项。指定的向量为初始斜率 y'0,因此 M(t0,y0)y'0=f(t0,y0)。如果指定的初始条件不一致,求解器会将其视为猜想值,尝试计算与猜想值接近的一致值,并继续解算该问题。

数据类型: single | double

仅适用于 ode15sode15i

全部折叠

公式的最大阶次,以逗号分隔的对组形式指定,其中包含 'MaxOrder' 和一个介于 15 之间的整数。使用此选项可指定变阶求解器 ode15sode15i 使用的数值微分公式 (NDF) 或后向差分公式 (BDF) 中使用的最大阶次。

指示是否将后向差分公式 (BDF) 用于 ode15s 的开关,以逗号分隔的对组形式指定,其中包含 'BDF' 以及 'off''on'。默认的数值微分公式 (NDF) 通常比 BDF 更高效,但二者密切相关。

示例: opts = odeset('BDF','on','MaxOrder',4) 允许 ode15s 使用 BDF,最大阶次为 4

数据类型: char | string

输出参量

全部折叠

Options 结构体。options 可用作 ode45ode23ode113ode15sode23sode23tode23tbode15i 的第四个输入参量。

提示

扩展功能

基于线程的环境
使用 MATLAB® backgroundPool 在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool 加快代码运行速度。

版本历史记录

在 R2006a 之前推出