主要内容

ode23s

求解刚性微分方程-低阶法

描述

例子

ty= ode23s(odefuntspany0,在那里Tspan = [t0 tf],对微分方程组进行积分 y f t y t0特遣部队在初始条件下y0.解数组中的每一行y对应列向量中返回的值t

所有MATLAB®ODE求解器可以求解这种形式的方程组 y f t y ,或者涉及质量矩阵的问题, t y y f t y .这些求解器都使用类似的语法。的ode23s求解器只有在质量矩阵恒定的情况下才能求解质量矩阵问题。ode15s而且ode23t可以解决质量矩阵是奇异的问题,称为微分代数方程(DAEs)。指定质量矩阵使用质量选择odeset

例子

ty= ode23s(odefuntspany0选项还使用定义的集成设置选项方法创建的参数odeset函数。例如,使用AbsTol而且RelTol选项来指定绝对和相对误差容忍质量选项提供质量矩阵。

tyte= ode23s(odefuntspany0选项另外找到函数的位置ty,称为事件函数,为零。在输出中,te是事件发生的时间,解决方案在事件发生时,和触发事件的索引。

对于每个事件函数,指定积分是否终止于0点,以及过0点的方向是否重要。通过设置“事件”属性设置为函数,例如myEventFcn@myEventFcn,并创建相应的函数:[价值isterminal方向] =myEventFcnty).有关更多信息,请参见ODE活动地点

索尔= ode23s (___返回可以使用的结构德瓦尔求区间上任意点的解(t0 tf).您可以使用前面语法中的任何输入参数组合。

例子

全部折叠

具有单个解决方案组件的简单ode可以在对求解器的调用中指定为匿名函数。匿名函数必须接受两个输入(t, y),即使函数中没有使用其中一个输入。

解ODE

y - 1 0 t

指定时间间隔为(0 - 2)初始条件y = 1

Tspan = [0 2];Y0 = 1;[t,y] = ode23s(@(t,y) -10*t, tspan, y0);

画出解。

情节(t y“o”

图中包含一个axes对象。axis对象包含一个类型为line的对象。

一个刚性方程组的例子是弛豫振荡中的范德波尔方程。极限环有一些区域,在这些区域中,解的分量变化缓慢,问题相当僵硬,与变化非常剧烈的区域交替出现,但问题并不僵硬。

方程组为:

数组$ $ \开始{}{cl} y_1 ' & # 38; = y_2 \ \ y_2’& # 38;= 1000 (1-y_1 ^ 2) y_2-y_1 \{数组}$ $

初始条件是美元y_1(0) = 2美元而且美元y_2(0) = 0美元.这个函数vdp1000附带MATLAB®和方程式编码。

函数Dydt = vdp1000(t,y)求mu = 1000时的van der Pol ode。%参见ODE15S, ODE23S, ODE23T, ODE23TB。Jacek Kierzenka和Lawrence F. Shampine。版权所有The MathWorks, Inc.Dydt = [y(2);1000 * (1 y (1) ^ 2) * y (2) - y (1)];

数值默认的相对和绝对容错(1 e - 3而且1 e-6,分别)非常慢,需要几分钟来求解和绘制解。数值需要数百万的时间步骤来完成集成,由于它的刚度领域,它努力满足公差。

这是一个解的图数值,这需要很长时间来计算。请注意,通过刚度区域需要大量的时间步骤。

解决刚性系统的问题ode23s求解器,然后画出解的第一列y与时间点相反t.的ode23s求解器通过坚硬区域的步骤比数值

[t,y] = ode23s(@vdp1000,[0 3000],[2 0]);情节(t y (: 1),“o”

ode23s只适用于使用两个输入参数的函数,t而且y.但是,可以通过在函数外部定义参数并在指定函数句柄时传入额外的参数。

解ODE

$$y

将方程改写为一阶方程组

数组$ $ \开始{}{cl} y ' _1 & # 38; = y_2 \ \ y ' _2 & # 38; = \压裂{一}{B} t y_1强生# xA; \{数组}$ $

odefcn.m将这个方程组表示为一个接受四个输入参数的函数:ty一个,B

函数dydt = odefcn(t,y,A,B) dydt = 0 (2,1);Dydt (1) = y(2);dydt(2) = (A/B)*t.*y(1);

求解ODEode23s.指定函数句柄,以便传递为的预定义值一个而且Bodefcn

A = 1;B = 2;Tspan = [0 5];Y0 = [0 0.01];[t、y] = ode23s (@ (t, y) odefcn (t, y, A、B), tspan, y0);

画出结果。

情节(t y (: 1),“o”、t、y (:, 2),“-”。

ode15s求解器是解决大多数困难问题的首选。然而,对于某些类型的问题,其他的硬求解器可能更有效。本例使用所有四个刚性ODE求解器求解一个刚性测试方程。

考虑测试方程

y - λ y

随着的大小,方程变得越来越僵硬 λ 增加。使用 λ 1 × 1 0 9 初始条件 y 0 1 在时间间隔内0.5 [0].有了这些值,问题就变得非常棘手数值而且ode23很难对方程积分。此外,使用odeset传入常数雅可比矩阵 J f y - λ 并打开求解器统计信息的显示。

λ = 1e9;Y0 = 1;Tspan = [0 0.5];Opts = odeset(的雅可比矩阵λ,“统计数据”“上”);

ode15sode23sode23t,ode23tb.制作副图进行比较。

Subplot (2,2,1) tic, ode15s(@(t,y) -lambda*y, tspan, y0, opts), toc
104个成功的步骤1个失败的尝试212个函数求值0个偏导数21个LU分解210个线性系统的解耗时为1.505900秒。金宝搏官方网站
标题(“ode15s”) subplot(2,2,2) tic, ode23s(@(t,y) -lambda*y, tspan, y0, opts), toc
63个成功的步骤0个失败的尝试191个函数求值0个偏导数63个LU分解189个线性系统的解耗时0.439813秒。金宝搏官方网站
标题(“ode23s”) subplot(2,2,3) tic, ode23t(@(t,y) -lambda*y, tspan, y0, opts), toc
95个成功的步骤0个失败的尝试125个函数求值0个偏导数28个LU分解123个线性系统的解耗时为0.598499秒。金宝搏官方网站
标题(“ode23t”) subplot(2,2,4) tic, ode23tb(@(t,y) -lambda*y, tspan, y0, opts), toc
71个成功的步骤0个失败的尝试167个函数求值0个偏导数23个LU分解236个线性系统解耗时为0.600518秒。金宝搏官方网站
标题(“ode23tb”

图中包含4个轴对象。标题为ode15s的axis对象1包含两个类型为line的对象。标题为ode23s的Axes对象2包含两个类型为line的对象。标题为ode23t的Axes对象3包含两个类型为line的对象。标题为ode23tb的Axes对象4包含两个类型为line的对象。

硬解者都表现得很好,但是ode23s对于这个特定的问题,用最少的步骤完成集成并以最快的速度运行。由于指定了恒定的雅可比矩阵,任何求解器都不需要计算偏导数来计算解。指定雅可比矩阵的收益ode23s因为它通常计算每一步的雅可比矩阵。

对于一般的刚性问题,刚性求解器的性能取决于问题的格式和指定的选项。提供雅可比矩阵或稀疏模式可以提高求解刚性问题的效率。但由于刚性求解者使用的雅可比矩阵不同,改进可能会有显著差异。实际上,如果一个方程组非常大,或者需要求解很多次,那么就有必要研究不同求解器的性能,以减少执行时间。

输入参数

全部折叠

函数,指定为定义要集成的函数的函数句柄。

这个函数Dydt = odefun(t,y),对于标量t一个列向量y,必须返回列向量dydt的数据类型这对应于 f t y odefun必须接受两个输入参数t而且y,即使函数中没有使用其中一个实参。

例如,求解 y 5 y 3. ,使用函数:

函数Dydt = odefun(t,y) Dydt = 5*y-3;结束

对于方程组,的输出odefun是一个向量。向量中的每个元素都是一个方程的解。例如,求解

y 1 y 1 + 2 y 2 y 2 3. y 1 + 2 y 2

使用函数:

函数Dydt = odefun(t,y) Dydt = 0 (2,1);Dydt (1) = y(1)+2*y(2);Dydt (2) = 3*y(1)+2*y(2);结束

有关如何向函数提供附加参数的信息odefun,请参阅参数化功能

例子:@myFcn

数据类型:function_handle

积分区间,用向量表示。至少,tspan必须是二元向量(t0 tf)指定初始和最终时间。在特定的时间得到解金宝搏官方网站t0而且特遣部队,使用更长的向量形式(t0, t1, t2,…,tf).元素tspan必须是全部增加或全部减少。

求解器施加的初始条件为y0在初始时间tspan (1),然后对tspan (1)tspan(结束)

  • 如果tspan有两个元素(t0 tf),则求解器返回在间隔内的每个内部集成步骤上求值的解。

  • 如果tspan有两个以上的元素(t0, t1, t2,…,tf),求解器返回在给定点处的解。然而,该求解器并不精确地步进到中指定的每一个点tspan.相反,求解器使用它自己的内部步骤来计算解,然后在请求点处计算解tspan.在指定点金宝搏官方网站产生的解与在每个内部步骤计算的解具有相同的精度顺序。

    指定几个中间点对计算效率影响不大,但会影响大型系统的内存管理。

的价值tspan用求解器计算适合的值InitialStep而且MaxStep

  • 如果tspan包含几个中间点(t0, t1, t2,…,tf),则指定的点表示问题的规模,这可以影响的值InitialStep由解算器使用。因此,根据您是否指定,求解器获得的解可能不同tspan作为双元向量或作为中间点的向量。

  • 中的初始值和最终值tspan是用来计算最大步长吗MaxStep.的初始值或最终值tspan可能导致求解器使用不同的步骤序列,这可能会改变解。

例子:10 [1]

例子:[1 3 5 7 9 10]

数据类型:|

初始条件,指定为一个向量。y0必须与的输出向量的长度相同odefun,因此y0中定义的每个方程包含初始条件odefun

数据类型:|

选项结构,指定为结构数组。使用odeset函数来创建或修改选项结构。看到ODE选项摘要获取与每个求解器兼容的选项列表。

例子:options = odeset('RelTol',1e-5,'Stats','on','OutputFcn',@ odeploy)的相对容错1 e-5,打开求解器统计信息的显示,并指定输出函数@odeplot在计算的过程中绘制出解。

数据类型:结构体

输出参数

全部折叠

计算点,作为列向量返回。

  • 如果tspan包含两个元素(t0 tf),然后t包含用于执行集成的内部评估点。

  • 如果tspan那么,包含两个以上的元素ttspan

金宝搏官方网站解决方案,作为数组返回。每一行y的对应行中返回值处的解t

事件的时间,作为列向量返回。中的事件时间te对应于返回的解金宝搏官方网站,指定发生的事件。

事件发生时的解决方案,作为数组返回。中的事件时间te对应于返回的解金宝搏官方网站,指定发生的事件。

触发事件函数的索引,作为列向量返回。中的事件时间te对应于返回的解金宝搏官方网站,指定发生的事件。

结构进行计算,作为结构数组返回。将此结构与德瓦尔函数求区间内任意点的解(t0 tf).的索尔结构数组总是包含以下字段:

结构域 描述

sol.x

由求解器选择的步骤的行向量。

sol.y

金宝搏官方网站解决方案。每一列sol.y(:,我)包含及时的解决方案sol.x(我)

sol.solver

解算器的名字。

此外,如果指定事件选择odeset然后检测事件索尔也包括这些字段:

结构域 描述

sol.xe

事件发生时的点。sol.xe(结束)包含终端事件的确切点(如果有的话)。

sol.ye

金宝搏官方网站中的事件对应的解sol.xe

sol.ie

类中指定的函数返回的向量事件选择。这些值指示解算器检测到的事件。

算法

ode23s是基于修正的2阶Rosenbrock公式。因为它是一个单步求解器,它可能比ode15s在解决允许粗公差的问题或用快速变化的解决方案解决问题时。金宝搏官方网站它可以解决一些棘手的问题ode15s是无效的。的ode23s求解器在每一步的积分过程中计算雅可比矩阵,因此提供雅可比矩阵对其可靠性和效率至关重要[1]

参考文献

香波,l.f.和m.w.瑞歇特,"MATLAB ODE套件”,SIAM科学计算杂志1997年,第18卷,第1-22页。

R2006a之前介绍过