主要内容

odeset

创建或修改ODE和PDE求解器的选项结构

描述

例子

选项= odeset (名称,值,……)创建一个选项结构,您可以将其作为参数传递给ODE和PDE求解器。在结构中,选项时,命名选项具有指定的值。任何未指定的选项都有默认值。例如,options = odeset('RelTol',1e-3)返回一个选项结构RelTol设置为1 e - 3

例子

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

例子

选项= odeset (oldoptsnewopts修改现有选项结构,oldopts,通过将其与新的期权结构相结合,newopts.任何新的选项都不等于[]中的相应选项oldopts

odeset如果没有输入参数,则显示所有可能的选项名称及其可能的值。默认值用{},如适用。

例子

全部折叠

创建包含值的选项结构RelTol而且AbsTol

选项= odeset(“RelTol”1 e-8“AbsTol”1平台以及);

更新的值AbsTol在现有的期权结构中。

选项= odeset(选项,“AbsTol”1 e-9)
选择=带字段的结构:AbsTol: 1.0000 -09 BDF: [] Events: [] InitialStep: [] Jacobian: [] JConstant: [] JPattern: [] Mass: [] MassSingular: [] MaxOrder: [] MaxStep: [] NonNegative: [] NormControl: [] OutputFcn: [] OutputSel: [] Refine: [] RelTol: 1.0000 -08 Stats: [] Vectorized: [] mstate dependency: [] MvPattern: [] InitialSlope: []

创建两个选项结构。

Opts_1 = odeset(“RelTol”1 e-8“AbsTol”1 e-9“OutputFcn”@odeplot,“统计数据”“上”);
Opts_2 = odeset(“质量”,@(t) [t 0;0 - t),“MStateDependence”“没有”...“MassSingular”“不”“OutputFcn”, @odephas2);

结合选项结构,给予优先opts_2.因为两个结构都包含不同的值OutputFcn的值。opts_2覆盖inopts_1

Opts = odeset(opts_1,opts_2)
选择=带字段的结构:AbsTol: 1.0000 -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.0000 -08 Stats: 'on' Vectorized: [] MStateDependence: 'none' MvPattern: [] InitialSlope: []

输入参数

全部折叠

旧的选项结构,指定为以前使用创建的结构odeset

数据类型:结构体

新的选项结构,指定为以前使用创建的结构odeset

数据类型:结构体

名称-值参数

的可选逗号分隔对名称,值参数。的名字参数名称和价值对应的值。的名字必须出现在引号内。您可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:选择= odeset (AbsTol, 1 e - 3,‘Reltol’,1飞行,雅可比矩阵,@J,“质量”,米)指定绝对和相对容错的阈值,返回雅可比矩阵的函数和数值质量矩阵。
错误控制

全部折叠

相对容错,指定为逗号分隔的对,由“RelTol”一个正标量。此公差测量相对于每个溶液组分的大小的误差。粗略地说,它控制了除小于绝对公差外的所有解决方案组件的正确位数AbsTol

在每一步,ODE求解器估计局部误差e解的第Th分量。为了成功,该步骤必须具有可接受的误差,这由相对和绝对误差容忍度决定:

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

例子:opts = odeset('RelTol',1e-5,'AbsTol',1e-7)

数据类型:|

绝对容错,指定为由逗号分隔的对组成“AbsTol”一个正的标量或向量。这个容忍度是一个阈值,低于这个阈值,解决方案的值就不重要了。如果解决方案y | |小于AbsTol,则求解器不需要在中获取任何正确的数字y | |.因此,的值AbsTol应考虑到解决方案组件的规模。

如果AbsTol是一个向量,那么它必须和解的长度相同。如果AbsTol为标量,则该值应用于所有解决方案组件。

在每一步,ODE求解器估计局部误差e解的第Th分量。为了成功,该步骤必须具有可接受的误差,这由相对和绝对误差容忍度决定:

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

例子:opts = odeset('RelTol',1e-5,'AbsTol',1e-7)

数据类型:|

相对于解决方案范数的控制错误,指定为逗号分隔的对,由“NormControl”而且“上”“关闭”.当NormControl“上”,由解算器控制误差e在每一步使用解的范数,而不是它的绝对值:

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

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

数据类型:字符|字符串

解算器输出

全部折叠

非负的溶液组件,指定为逗号分隔的对,由非负的一个标量或向量。标量或向量选择哪些解的分量必须是非负的。

请注意

非负不可用于ode23sode15i.此外,为ode15sode23t,ode23tb它不适用于有质量矩阵的问题。

例子:opts = odeset('非负',1)指定第一个解决方案组件必须是非负的。

数据类型:|

输出函数,指定为逗号分隔的对,由“OutputFcn”和一个函数句柄。ODE求解器在每个成功的时间步骤之后调用输出函数。如果调用没有输出的ODE求解器,则输出函数默认为@odeplot,它将计算出的所有解决方案组件绘制成图。否则,默认为[]

这些是您可以使用的内置输出函数OutputFcn

函数名 描述
odeplot 画出解决方案的所有组成部分与时间的关系
odephas2 前两个溶液组分的二维相平面图
odephas3 前三种溶液组分的三维相平面图
odeprint 打印溶液和时间步长

如果您编写一个自定义输出函数,那么它必须是这样的形式

status = myOutputFcn(t,y,flag)

输出函数也必须适当地响应这些标志:

国旗 描述
“init”

求解器调用myOutputFcn ([tspan (1) tspan(结束)],y0,“init”)在开始集成之前,允许输出函数初始化。tspan而且y0是ODE求解器的输入参数。

[]

求解器调用status = myOutputFcn(t,y,[])在请求输出的每个集成步骤之后。t包含在步骤期间生成输出的点和y在这些点上的数值解是多少t.如果t是向量,那么的第Th列y对应于的第Th元素t

  • 如果长度(tspan) >,则在中的每一点都产生输出tspan

  • 如果长度(tspan) = 2,则输出是根据完善选择。

myOutputFcn必须返回状态为01.如果Status = 1时,求解器停止积分。例如,您可以使用此机制来实现一个停止按钮。

“完成”

求解器调用myOutputFcn([][],“做”)一旦集成完成,允许输出函数执行清理任务。

数据类型:function_handle

输出函数的组件选择,指定为逗号分隔的对,由“OutputSel”还有一个指标向量。向量指定将解决方案的哪些组件传递给输出函数。

例子:opts = odeset('OutputFcn',@myFcn,'OutputSel',[1 3])将解决方案的第一个和第三个组件传递给输出函数。

解决方案细化因子,指定为由逗号分隔的对组成“完善”一个标量。标量指定在每一步中增加输出点数量的一个因子。

的默认值完善对于大多数求解器来说是1,但数值使用默认值4,而ode78而且ode89使用默认值8.这些解算器使用更大的默认值来补偿它们采取大步骤的倾向。

  • 如果细化因子是1,则求解器仅在每一步结束时返回解。金宝搏官方网站

  • 如果细化因子是N > 1,求解器将每一步细分为n更小的间隔并返回每个点的解。金宝搏官方网站

利用连续展开式计算了由细化因子产生的附加值。这些是ODE求解器使用的专门公式,用于在计算时间步长之间获得精确的解,而不会显著增加计算时间。金宝搏官方网站

请注意

完善不适用于以下情况长度(tspan) >,或者当ODE求解器以结构形式返回解时。

例子:opts = odeset('Refine',5)将输出点的数量增加到原来的五倍。

求解器统计信息,指定为逗号分隔的对,由“统计数据”而且“上”“关闭”.当“上”,解算器在完成解后显示信息:

  • 成功的步数

  • 失败的次数

  • 调用ODE函数求值的次数 f t y

隐式求解器显示关于解决方案的附加信息:

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

  • LU分解的个数

  • 线性系统解的个数金宝搏官方网站

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

数据类型:字符|字符串

步长

全部折叠

建议的初始步长,指定为逗号分隔的对,由“InitialStep”一个正标量。InitialStep设置求解器尝试的第一步大小的大小的上界。

如果不指定初始步长,则求解器将初始步长基于初始时间点解的斜率,tspan (1).如果所有解分量的斜率都为零,那么求解器可能会尝试一个太大的步长。如果您意识到这种情况正在发生,或者如果您想确保求解器在集成的开始就解决了重要的行为,那么请使用InitialStep提供合适的初始步长。

例子:opts = odeset('InitialStep',1e-3)的上限1 e - 3初始步长的大小。

最大步长,指定为逗号分隔的对,由“MaxStep”一个正标量。MaxStep设置求解器所采取的任何步骤的大小的上限。如果方程具有周期性,例如,设置MaxStep到周期的一小部分确保求解器不会将步长扩大到超出感兴趣的区域。

  • 不要使用MaxStep只是为了获得更多的输出点,因为它可以显著减缓积分。相反,使用完善选项计算额外的点,以较低的计算成本。

  • 不要使用MaxStep提高解的精度。如果解不够准确,则降低值RelTol并利用该解决方案确定一个合适的值AbsTol

  • 避免使用MaxStep确保求解器不会跳过某些在积分区间中只发生一次的行为。如果您知道行为发生的时间,那么将间隔分成两部分,并调用求解器两次。如果你不知道变化发生的时间,试着减少RelTol而且AbsTol.使用MaxStep只是在这种情况下不得已而为之。

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

活动地点

全部折叠

事件函数,指定为逗号分隔的对,由“事件”和函数句柄,如@myEventsFcn

函数签名

对常微分方程:由函数句柄指定的事件函数必须具有通用形式

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

对pde:由函数句柄指定的事件函数必须具有通用形式

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

在这两种情况下,价值isterminal,方向是向量Th元素对应于事件函数:

  • 值(我)是值事件函数。

  • 终点(i) = 1如果积分终止于这个事件函数的零点。否则,就是0

  • 方向i = 0如果要定位所有的零(默认值)。值为+1仅定位事件函数增加的零点,和-1仅定位事件函数递减的零点。

看到参数化功能查看如何将额外的输入传递给事件函数。

事件输出

如果指定事件函数,则可以使用三个额外的输出参数调用求解器,例如

[t,y,te,ye,ie] = odeXY(odefun,tspan,y0,options)

求解器返回的另外三个输出对应于检测到的事件:

  • te是事件发生时间的列向量。

  • 解值是否与in中的事件时间对应te

  • 是事件函数返回的向量的索引。这些值指示解算器检测到的事件。

或者,您可以调用具有单个输出的求解器为

sol = odeXY(odefun,tspan,y0,options)

在这种情况下,事件信息存储在结构as中sol.tesol.ye,sol.ie

诊断

ODE/PDE求解器与事件函数一起使用的根查找机制有以下限制:

  • 如果在集成的第一步中发生了终结事件,那么求解器将该事件注册为非终结事件并继续集成。

  • 如果在第一步中发生了多个终端事件,那么只有第一个事件注册,求解器继续进行集成。

  • 零是通过步骤之间的符号交叉来确定的。因此,步骤之间交叉次数为偶数的零可能会被忽略。

如果解算器步骤过去的事件,尝试减少RelTol而且AbsTol提高准确性。另外,组MaxStep在步长上设置一个上界。调整tspan不改变求解器所采取的步骤。

例子

数据类型:function_handle

雅可比矩阵

全部折叠

雅可比矩阵,指定为逗号分隔的对,由的雅可比矩阵和求雅可比矩阵的矩阵或函数。雅可比矩阵是定义微分方程的函数的偏导数的矩阵。

J f y f 1 y 1 f 1 y 2 f 2 y 1 f 2 y 2

对于生硬的ODE求解器(ode15sode23sode23tode23tb,ode15i),提供有关雅可比矩阵的信息对于可靠性和效率至关重要。如果您不提供雅可比矩阵,那么ODE求解器使用有限差分在数值上逼近它。

ode15i只有:雅可比矩阵选项必须为两者指定矩阵 f y 而且 f y .您可以将这些矩阵作为两个常量矩阵的单元格数组提供 f y f y ,或作为计算矩阵的函数,具有一般形式

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

对于无法提供整个解析雅可比矩阵的非常大的系统,使用JPattern属性传递给雅可比矩阵的稀疏模式。求解器使用稀疏模式来计算稀疏雅可比矩阵。

例子:opts = odeset('雅可比矩阵',@J)指定函数J计算雅可比矩阵的方法。

例子:opts = odeset('雅可比矩阵',[0 1;2 (1)指定一个常数雅可比矩阵。

例子:opts = odeset('雅可比矩阵',{A,Ap})指定用于的两个常数雅可比矩阵ode15i

数据类型:||细胞|function_handle

雅可比稀疏模式,指定为由逗号分隔的对组成“JPattern”和一个稀疏矩阵。稀疏矩阵包含1s中可能有非零项在雅可比矩阵中。ODE求解器使用稀疏模式数值生成稀疏雅可比矩阵。当ODE系统很大且无法提供解析雅可比矩阵时,使用此选项可缩短执行时间。

ode15i只有:设置JPattern选项,使用包含两个稀疏矩阵的单元格数组{dfdyPattern, dfdypPattern}的稀疏模式 f y 而且 f y

请注意

如果你指定一个雅可比矩阵使用雅可比矩阵,则解算器忽略为的任何设置JPattern

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

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

数据类型:|细胞

向量化函数切换,指定为逗号分隔的对,由矢量化的,要么“关闭”“上”.使用此选项通知ODE求解器函数已编码,以便它接受并返回用于第二个参数的向量。也就是说,F (t,[y1 y2 y3…])返回[f(t,y1) f(t,y2) f(t,y3)…].与一次计算一个值相比,这种向量化允许求解器减少计算雅可比矩阵的所有列所需的函数计算的数量,并可能显著减少求解时间。看到数组运算与矩阵运算有关支持向量化的元素操作符的描述。金宝app

ode15i只有:设置矢量化选项,使用两元素单元格数组。将第一个元素设置为“上”如果f (t, y1, y2,…,yp)返回[f(t,y1,yp), f(t,y2,yp),…].将第二个元素设置为“上”如果f (t y [yp1, yp2,…])返回[f(t,y,yp1), f(t,y,yp2),…].的默认值矢量化在这种情况下{‘off’,‘off’}

请注意

如果你指定一个雅可比矩阵使用雅可比矩阵,则求解器忽略的设置“上”矢量化

例子:opts = odeset('JPattern',S,'Vectorized','on')指定函数是向量化的,并设置雅可比稀疏模式。

例子:选择= odeset (JPattern, {dy,多元印刷},矢量化,{‘上’,‘’})指定函数对的向量化y而且yp,并且还设置了用于的雅可比稀疏模式ode15i

数据类型:字符|细胞|字符串

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

全部折叠

质量矩阵,指定为由逗号分隔的对组成“质量”一个矩阵或函数句柄。ODE求解器可以求解包含这种形式的质量矩阵的问题 t y y f t y ,在那里 t y 是一个质量矩阵,可以是满的或稀疏的(ode23s求解器只能求解常量质量矩阵的方程)。

  • 当质量矩阵非奇异时,方程化简为 y 1 f t y ODE对任何初值都有解。但是,直接用质量矩阵来表示模型往往更方便自然 t y y f t y ,避免了矩阵逆的计算,减少了解决问题所需的存储和执行时间。

  • t y 是奇异矩阵,则问题是微分代数方程组。DAE只有在以下情况下才有解决方案y0是一致的;也就是说,存在一个初始斜率yp0这样M(t0,y0)yp0 = f(t0,y0),在那里yp0使用InitialSlope选择。dae的特征是它们的微分指数,或将系统简化为ode的等效系统所需的导数的数量。对于索引1的dae,求解具有一致初始条件的初值问题与求解ODE非常相似。的ode15s而且ode23t求解器可以求解索引1的dae。在求解DAE时,将问题表述为质量矩阵为对角矩阵(半显式DAE)是有利的。

在所有情况下,依赖于时间或状态的质量矩阵(而不是常数)需要使用额外的选项:

  • 对于表格中的问题 t y f t y ,设置MStateDependence选项“没有”.这确保求解器调用质量矩阵函数时使用单个输入参数t

  • 如果质量矩阵依赖于y,然后设置MStateDependence要么“弱”(默认)或“强”.在这两种情况下,求解器调用具有两个输入的质量矩阵函数(t, y),但“弱”选项导致隐式求解器在求解代数方程时使用近似。

  • 如果系统包含许多具有强状态依赖的质量矩阵的方程 t y ,然后设置MvPattern到一个稀疏矩阵年代指定稀疏模式。

例子:示例文件fem2ode而且batonode说明质量矩阵的不同用法。

数据类型:||function_handle

质量矩阵的状态依赖关系,以逗号分隔的对组成“MStateDependence而且“弱”“强”,或“没有”

  • 对于表格中的问题 t y f t y ,设置MStateDependence选项“没有”.这确保求解器调用质量矩阵函数时使用单个输入参数t

  • 如果质量矩阵依赖于y,然后设置MStateDependence要么“弱”(默认)或“强”.在这两种情况下,求解器调用具有两个输入的质量矩阵函数(t, y),但“弱”选项导致隐式求解器在求解代数方程时使用近似。

例子:opts = odeset('Mass',@M,' mstate dependency ','none')指定质量矩阵只取决于t

数据类型:字符|字符串

质量矩阵稀疏模式,指定为逗号分隔对组成“MvPattern”和一个稀疏矩阵。使用此选项可指定矩阵的稀疏模式 y t y v .稀疏矩阵年代S(i,j) = 1如果有k,(我,k)的组成部分 t y 取决于组件jy

请注意

MvPattern是供ode15sode23t,ode23tbMStateDependence“强”

例子:opts = odeset(' mstate dependency ','strong','MvPattern',S)

奇异质量矩阵开关,指定为由逗号分隔的对组成“MassSingular”而且“也许”“是的”,或“不”.的默认值“也许”通过测试质量矩阵是否奇异,使解算器测试问题是否为DAE。通过指定避免此检查“是的”如果你知道这个系统是DAE,或者“不”如果不是的话。

数据类型:字符|字符串

一致的初始斜率,指定为由逗号分隔的对组成“InitialSlope”还有一个向量。属性使用此选项ode15s而且ode23t求解dae时的解算器。指定的向量是初始斜率 y 0 这样 t 0 y 0 y 0 f t 0 y 0 .如果指定的初始条件不一致,则求解器将其视为猜测,尝试计算与猜测接近的一致值,并继续解决问题。

数据类型:|

只对ode15s而且ode15i

全部折叠

公式的最大顺序,指定为逗号分隔的对,由“MaxOrder”和一个整数1而且5.使用此选项可指定变阶求解器使用的数值微分公式(ndf)或向后微分公式(BDFs)中使用的最大阶数ode15s而且ode15i

切换到使用反向微分公式(BDFs)ode15s,指定为逗号分隔的对,由“快速公车提供”,要么“关闭”“上”.默认的数值微分公式(ndf)通常比BDFs更有效,但两者密切相关。

例子:opts = odeset('BDF','on','MaxOrder',4)允许使用BDFsode15s最大阶数为4

数据类型:字符|字符串

输出参数

全部折叠

选择结构。选项可以作为第四个输入参数数值ode23ode113ode15sode23sode23tode23tb,或ode15i

提示

扩展功能

R2006a之前介绍