主要内容

ode15i

求解全隐式微分方程-变阶法

描述

例子

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

例子

ty= ode15i(odefuntspany0yp0选项还使用定义的集成设置选项属性创建的参数odeset函数。例如,使用AbsTol而且RelTol选项用于指定绝对和相对误差容差,或雅可比矩阵选项提供雅可比矩阵。

tyte= ode15i(odefuntspany0yp0选项的函数(t、y, y”),称为事件函数,则为零。在输出中,te是事件发生的时间,解决方案是在事件发生时,和触发事件的索引。

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

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

例子

全部折叠

计算一致的初始条件并求解隐式ODEode15i

魏辛格方程是

2 y 3. - y 3. y 2 + t t 2 + 1 y - t 2 y 0

因为方程是一般形式 f t y y 0 ,你可以使用ode15i函数来解隐式微分方程。

代码方程

用适合的形式编码方程ode15i时,您需要编写一个带有输入的函数 t y , y 这返回了方程的残值。这个函数@weissinger编码这个方程。查看函数文件。

类型weissinger
function res = weissinger(t,y,yp) % weissinger计算weissinger隐式ODE的残差% %参见ODE15I。The MathWorks, Inc. res = t*y^2 *yp ^3 - y^3 *yp ^2 + t*(t^2 + 1)*yp - t^2 *y;

计算一致的初始条件

ode15i解算器需要一致的初始条件,即提供给求解器的初始条件必须满足

f t 0 y y 0

由于有可能提供不一致的初始条件,并且ode15i不进行一致性检查,建议您使用辅助功能decic计算这些条件。decic将某些指定变量保持固定,并为不固定的变量计算一致的初始值。

在这种情况下,固定初始值 y t 0 3. 2 ,让decic为导数计算一致的初始值 y t 0 ,从最初的猜测开始 y t 0 0

T0 = 1;Y0 =√(3/2);Yp0 = 0;[y0,yp0] = decic(@weissinger,t0,y0,1,yp0,0)
Y0 = 1.2247
Yp0 = 0.8165

解决方程

使用返回的一致初始条件decicode15i来求解时间区间上的ODE 1 10

[t,y] = ode15i(@weissinger,[1 10],y0,yp0);

阴谋的结果

ODE的精确解是

y t t 2 + 1 2

绘制数值解y计算ode15i相对于解析解ytrue

Ytrue =√(t。^2 + 0.5);情节(t y‘*’t ytrue“o”)传说(“ode15i”“准确”

图中包含一个轴对象。axis对象包含2个line类型的对象。这些对象表示ode15i。

这个例子将ode系统重新表述为完全隐式的微分代数方程系统。罗伯逊问题由hb1ode.m是解决硬ode的程序的经典测试问题。方程组是

数组$ $ \开始{}{cl} y ' _1 & # 38; = -0.04 y_1 + 10 ^ 4 y_2y_3 \ \ y ' _2 & # 38; = 0.04 y_1 & # xA; 10 ^ 4 4 y_2y_3 - (3 \ * 10 ^ 7) y_2 y ^ 2 \ \ ' _3 & # 38; = (3 \ * # xA; 10 ^ 7) y_2 ^ 2。\{数组}$ $

hb1ode在初始条件下,将该ode系统解到稳态$y_1 = 1$$y_2 = 0$,$y_3 = 0$.但方程也满足线性守恒定律,

$$y'_1 + y'_2 + y'_3 = 0

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

$$y_1 + y_2 + y_3 = 1, $$

利用守恒定律确定的状态,可以将该问题改写为dae系统y_3美元.这将问题重新表述为隐式DAE系统

数组$ $ \开始{}{cl} 0 & # 38; = y“_1 + 0.04 y_1 - 10 ^ 4 y_2y_3 \ \ 0 & # 38; = y ' -0.04 _2 y_1& # xA; + 10 ^ 4 y_2y_3 + (3 \ * 10 ^ 7) y_2 ^ 2 \ \ 0 & # 38; = y_1 + y_2 + y_3 & # xA; 1。\{数组}$ $

这个函数robertsidae编码这个DAE系统。

函数res = robertsidae (t, y, yp) res = [yp (1) + 0.04 * y (1) - 1 e4 * * y y (2) (3);Yp (2) - 0.04*y(1) + 1e4*y(2)*y(3) + 3e7*y(2)^2;Y (1) + Y (2) + Y (3) - 1];

Robertson问题的完整示例代码可在ihb1dae.m

的值$\partial f / \partial y'$

选项= odeset(“RelTol”1的军医,“AbsTol”,[1e-6 1e-10 1e-6],...的雅可比矩阵,{[],[1 0 0;0 10 0;0 0 0]});

使用decic根据猜测计算一致的初始条件。修复的前两个组件y0得到相同的一致的初始条件ode15shb1dae.m,将该问题表述为半显式DAE系统。

Y0 = [1;0;1 e - 3);Yp0 = [0;0;0);[y0, yp0] = decic (@robertsidae 0 y0, [1 1 0], yp0,[],选项);

解决了DAEs系统的使用问题ode15i

Tspan = [0 4*logspace(-6,6)];[t,y] = ode15i(@robertsidae,tspan,y0,yp0,options);

绘制解决方案组件。由于第二个溶液组分相对于其他组分较小,因此将其乘以1 e4在绘图之前。

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

输入参数

全部折叠

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

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

例如,解 y y 0 ,使用此函数。

函数F = odefun(t,y,yp) F = yp - y;结束

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

y 1 y 2 0 y 2 + 1 0

使用该函数。

函数Dy = odefun(t,y,yp) Dy = 0 (2,1);Dy (1) = yp(1)-y(2);Dy (2) = yp(2)+1;结束

有关如何向函数提供附加参数的信息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]

数据类型:|

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

的初始条件y0而且yp0必须是一致的,这意味着什么 f t 0 y 0 y 0 0 .使用decic函数计算接近猜测值的一致初始条件。

数据类型:|

的初始条件y ',指定为列向量。yp0必须与的向量输出的长度相同odefun,所以yp0中定义的每个变量的初始条件odefun

的初始条件y0而且yp0必须是一致的,这意味着什么 f t 0 y 0 y 0 0 .使用decic函数计算接近猜测值的一致初始条件。

数据类型:|

选项结构,指定为结构数组。使用odeset函数创建或修改选项结构。

看到ODE选项摘要获取与每个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

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

提示

  • 提供雅可比矩阵ode15i对可靠性和效率至关重要。或者,如果系统很大且稀疏,那么提供雅可比稀疏模式也有助于求解器。无论哪种情况,都要使用odeset来传递矩阵雅可比矩阵JPattern选项。

算法

ode15i是一种基于1 ~ 5阶后向微分公式的变步长变阶(VSVO)求解器。ode15i设计用于全隐式微分方程和指数-1微分代数方程。辅助函数decic计算适合一起使用的一致初始条件ode15i[1]

参考文献

[1] Lawrence F. Shampine,《用MATLAB求解0 = F(t, y(t), y ' (t))》数值数学杂志《中国科学》,2002年第4期,页291-310。

版本历史

R2006a之前介绍