文档

ode15s

求解刚性微分方程和DAEs -变阶法

语法

[t,y] = 0 (t, t,y)
[t,y] = ode15s(odefun,tspan, 0,options)
[t,y, the,ye,ie] = ode15s(odefun,tspan,y0,options)
= ode15s()___

描述

例子

ty[qh] [qh]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只有当质量矩阵为常数时,求解器才能求解含有质量矩阵的问题。ode15sode23t可以解决质量矩阵是奇异的问题,称为微分代数方程(DAEs)。指定质量矩阵质量选择odeset

例子

ty[qh] [qh]odefuntspany0选项定义的集成设置选项方法创建的参数odeset函数。例如,使用AbsTolRelTol选项来指定绝对和相对误差容限,或者质量选择提供质量矩阵。

tyte[qh] [qh]odefuntspany0选项的函数ty称为事件函数,是零。在输出中,te是事件发生的时间,解决方案在事件发生时,和被触发事件的索引。

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

例子

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

例子

全部折叠

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

求解ODE

使用时间间隔为(0, 2)初始条件Y0 = 1

Tspan = [02];Y0 = 1;[t,y] = ode15s(@(t,y) -10*t, tspan, y0);

画出解。

情节(t y“o”

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

方程组为:

初始条件为。这个函数vdp1000随MATLAB®发货并对方程进行编码。

函数Dydt = vdp1000(t,y)%VDP1000求mu = 1000时的范德Pol ode值。%参见ODE15S, ODE23S, ODE23T, ODE23TB。杰塞克·基尔岑卡和劳伦斯·f·香蒲版权所有:The MathWorks, Inc。Dydt = [y(2);1000 * (1 y (1) ^ 2) * y (2) - y (1)];

数值具有默认的相对和绝对误差容限(1 e - 31 e-6)非常慢,需要几分钟来求解和绘制解决方案。数值由于难以满足公差的刚度区域,需要数百万个时间步骤来完成集成。

这是由数值,这需要很长时间来计算。注意通过刚性区域所需的大量时间步长。

求解刚性系统ode15s求解器,然后画出解的第一列y对比时间点t。的ode15s求解器通过刚性区域的步骤远少于数值

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

ode15s只适用于使用两个输入参数的函数,ty。但是,您可以在函数外部定义额外的参数,并在指定函数句柄时传入它们。

求解ODE

将方程改写成一阶方程组

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);

使用以下命令求解ODEode15s。指定函数句柄,以便它传递的预定义值一个Bodefcn

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

绘制结果。

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

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

考虑测试方程

随着的大小,方程变得越来越僵硬增加。使用初始条件在时间间隔内0.5 [0]。有了这些值,问题就很棘手了数值ode23努力对方程进行积分。此外,使用odeset传入常数雅可比矩阵并打开解算器统计信息的显示。

λ = 1e9;Opts = odeset()“统计数据”“上”的雅可比矩阵λ);Tspan = [0 0.5];Y0 = 1;次要情节(2 2 1)disp (“ode15s统计:”
ode15s统计:
Tic, ode15s(@(t,y) -lambda*y, tspan, y, options), toc
104个成功步骤1次失败尝试212个函数评估0个偏导数21个LU分解210个线性系统的解运行时间为2.240989秒。金宝搏官方网站
标题(“ode15s”) subplot(2,2,2)' '

                   
disp (“ode23s统计:”
ode23s统计:
Tic, ode23s(@(t,y) -lambda*y, tspan, y, options), toc
63个成功步骤0个失败尝试191个函数评估0个偏导数63个LU分解189个线性系统的解运行时间为0.554184秒。金宝搏官方网站
标题(“ode23s”) subplot(2,2,3)' '

                   
disp (“ode23t统计:”
ode23t统计:
Tic, ode23t(@(t,y) -lambda*y, tspan, y0, options), toc
95次成功步骤0次失败尝试125次函数求值0次偏导数28次LU分解线性系统123个解运行时间为0.831466秒。金宝搏官方网站
标题(“ode23t”) subplot(2,2,4)' '

                   
disp (“ode23tb统计:”
ode23tb统计:
Tic, ode23tb(@(t,y) -lambda*y, tspan, y0, options), toc
71次成功的步骤0次失败的尝试167次函数评估0次偏导数23次LU分解236次线性系统的解运行时间为0.737902秒。金宝搏官方网站
标题(“ode23tb”

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

对于一般的刚性问题,刚性求解器的性能取决于问题的格式和指定的选项。提供雅可比矩阵或稀疏模式总是能提高求解刚性问题的效率。但是,由于刚性求解器使用的雅可比矩阵不同,因此改进的效果差别很大。实际上,如果一个方程系统非常大,或者需要求解很多次,那么研究不同求解器的性能以最小化执行时间是值得的。

范德波尔方程是一个二阶ODE

解范德波尔方程使用ode15s。这个函数vdp1000.m随MATLAB®发货并对方程进行编码。指定单个输出以返回包含有关解决方案的信息的结构,例如求解器和求值点。

Tspan = [0 3000];Y0 = [20];(@vdp1000,tspan,y0)
索尔=带有字段的结构体:Solver: 'ode15s' extdata: [1x1 struct] x: [1x592 double] y: [2x592 double] stats: [1x1 struct] data: [1x1 struct]

使用linspace在区间内生成2500个点3000年[0]。在这些点上评估解决方案的第一个组件德瓦尔

X = linspace(0,3000,2500);Y = deval(sol,x,1);

画出解。

情节(x, y)

将解决方案扩展到使用odextend并将结果添加到原始情节中。

Tf = 4000;Sol_new = oextend (sol,@vdp1000,tf);X = linspace(3000,tf,350);Y = deval(sol_new,x,1);持有情节(x, y,“r”

本例将ode系统重新表述为微分代数方程(DAEs)系统。发现的罗伯逊问题hb1ode.m是解决僵硬ode的程序的经典测试问题。方程组是

hb1ode在初始条件下求解了该系统的稳态,。但方程也满足线性守恒定律,

对于解和初始条件,守恒律为

用守恒定律来确定的状态,方程组可以改写为DAEs系统。这将问题重新表述为DAE系统

这个系统的微分指数是1,因为只有一个导数需要使它成为一个ode系统。因此,在求解系统之前不需要进一步的转换。

这个函数robertsdae对DAE系统进行编码。保存robertsdae.m在当前文件夹中运行示例。

函数= robertsdae (t、y) = [-0.04 * y (1) + 1 e4 * y(2)。* y y (1) - (3) 0.04 * 1 e4 * y(2)。* y (3) - 3 e7 * y(2)。^2 y(1) + y(2) + y(3) - 1];

完整的示例代码为这个公式的罗伯逊问题是可用的hb1dae.m

解决DAE系统的使用ode15s。的一致初始条件y0根据守恒定律是很明显的。使用odeset设置选项:

  • 用一个常数质量矩阵来表示方程组的左边。

  • 设置相对容错为1的军医

  • 使用的绝对容忍度1平台以及对于第二个解决方案组件,由于规模与其他组件差异很大。

  • 离开“MassSingular”选项的默认值“也许”来测试DAE的自动检测。

Y0 = [1;0;0);Tspan = [0 4*logspace(-6,6)];M = [1 0 0];0 0 0;0 0 0];选项= odeset()“质量”米,“RelTol”1的军医,“AbsTol”,[1e-6 1e-10 1e-6]);[t,y] = ode15 (@robertsdae,tspan,y0,options);

画出解。

Y (:,2) = 1e4* Y (:,2);semilogx (t、y);ylabel ('1 * y(:,2)');标题(“带有守恒定律的罗伯逊DAE问题,由ODE15S解决”);

输入参数

全部折叠

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

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

例如,解 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 (1)tspan(结束)。因此,求解器不必精确地步进到中指定的每个点tspan。然而,在指定点产生的解与在金宝搏官方网站每个内部步骤计算的解具有相同的精度数量级。

    指定几个中间点对计算效率几乎没有影响,但对于大型系统,它可能会影响内存管理。

求解器得到的解可能不同,这取决于您是否指定tspan作为一个双元素向量或者作为一个有中间点的向量。如果tspan包含几个中间点,然后它们给出了问题规模的指示,这可以影响求解器所采取的初始步骤的大小。

例子:10 [1]

例子:[1 3 5 7 9 10]

数据类型:|

初始条件,用向量表示。y0必须和输出的向量长度相同odefun,所以y0中定义的每个方程的初始条件odefun

数据类型:|

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

例子:options = odeset('RelTol',1 -5,'Stats','on','OutputFcn',@ odeploy)的相对误差容忍度1 e-5,打开求解器统计信息的显示,并指定输出函数@odeplot在解被计算时画出它。

数据类型:结构体

输出参数

全部折叠

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

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

  • 如果tspan包含两个以上的元素t等于tspan

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

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

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

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

用于求值的结构,作为结构数组返回。用这个结构搭配the德瓦尔函数来求区间内任意点的解(t0 tf)。的索尔结构数组总是包含这些字段:

结构域 描述

sol.x

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

sol.y

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

sol.solver

解算器的名字。

此外,如果指定事件选项和事件被检测到索尔还包括这些字段:

结构域 描述

sol.xe

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

sol.ye

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

sol.ie

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

算法

ode15s是基于1 ~ 5阶数值微分公式(ndf)的变步长变阶(VSVO)求解器。它还可以选择使用通常效率较低的后向微分公式(bdf,也称为Gear方法)。就像ode113ode15s是一个多步求解器。使用ode15s如果数值失败或效率很低,你怀疑问题很僵硬,或者在解微分代数方程(DAE)时[1][2]

参考文献

[qh]香蒲,L. F.和M. W.赖切尔特,MATLAB ODE套件”,SIAM科学计算杂志, 1997年第18卷,第1-22页。

[b]香波,L. F., M. W. Reichelt,和J.A. Kierzenka,用MATLAB和Simulink求解Index-1 DAEs金宝app”,暹罗审查, 1999年第41卷,第538-552页。

R2006a之前引入

这个话题有帮助吗?