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

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

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

全部折叠

相对误差容限,以逗号分隔的对组形式指定,其中包含 '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' 和一个标量。标量指定一个因子,该因子决定每步中应增加的输出点数。

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

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

大多数求解器的默认值为 1,但 ode45 使用默认值 4 来补偿较大的步长。

细化因子生成的额外值是通过连续展开公式计算而来的。这些公式是专用公式,供 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 矩阵

全部折叠

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

J=fy=[f1y1f1y2f2y1f2y2]

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

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

[dfdy, dfdp] = Fjac(t,y,yp)

对于无法提供整个分析 Jacobian 矩阵的超大型方程组,请使用 JPattern 属性来传入 Jacobian 矩阵的稀疏模式。求解器使用稀疏模式计算稀疏 Jacobian 矩阵。

示例: opts = odeset('Jacobian',@J) 指定函数 J 来计算 Jacobian 矩阵。

示例: opts = odeset('Jacobian',[0 1; -2 1]) 指定常量 Jacobian 矩阵。

示例: opts = odeset('Jacobian',{A,Ap}) 指定两个常量 Jacobian 矩阵以用于 ode15i

数据类型: single | double | cell | function_handle

Jacobian 稀疏模式,以逗号分隔的对组形式指定,其中包含 'JPattern' 和一个稀疏矩阵。稀疏矩阵中的 1 值表示 Jacobian 中相应位置可能为非零项。ODE 求解器使用稀疏模式以数值方式生成 Jacobian 稀疏矩阵。对于无法提供分析 Jacobian 矩阵的大型 ODE 方程组,使用此选项可以缩短执行时间。

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

注意

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

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

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

数据类型: double | cell

向量化函数切换,指定为由 'Vectorized''off''on' 组成的逗号分隔的对组。使用此选项告知 ODE 求解器函数经过编码,使它接受第二个参数并返回向量。也就是说,f(t,[y1 y2 y3...]) 将返回 [f(t,y1) f(t,y2) f(t,y3) ...]。与每次计算一个值相比,这种向量化允许求解器减少计算 Jacobian 矩阵的所有列所需的函数计算数,可大幅减少求解时间。有关支持向量化的按元素运算符的说明,请参阅数组与矩阵运算

仅适用于 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 指定 Jacobian 矩阵,求解器将忽略 Vectorized'on' 的一项设置。

示例: opts = odeset('JPattern',S,'Vectorized','on') 指定函数已向量化,并设置 Jacobian 稀疏模式。

示例: opts = odeset('JPattern',{dy,dyp},'Vectorized',{'on','on'}) 指定函数已针对 yyp 进行向量化,并设置 Jacobian 稀疏模式以用于 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 的第四个输入参数。

提示

扩展功能

在 R2006a 之前推出