ode15i

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

描述

例子

(t,y] = ode15i(odefun,tspan,y0,yp0),在那里tspan = [t0 tf],积分微分方程组 f ( t , y , y ) = 0 T0TF与初始条件y0yp0。解决方案数组中的每一行y对应于列向量中返回的值t

例子

(t,y] = ode15i(odefun,tspan,y0,yp0,选项)所定义的集成设置选项,这是使用所创建的参数odeset函数。例如,使用AbsTolRelTol选项指定绝对和相对误差容限,或雅可比矩阵选项提供的雅可比矩阵。

(t,y,TE,,] = ode15i(odefun,tspan,y0,yp0,选项)另外发现的,其中功能(T,Y,Y'),称为事件函数,为零。在输出中,TE是事件发生的时间,解决方案是在事件发生的时候,和是触发事件的索引。

对于每个事件的功能,指定整合是否是在零和是否过零个事项的方向终止。通过设置这样做“事件”属性指向一个函数,例如myEventFcn要么@myEventFcn以及创建对应的功能:[价值,isterminal,方向] =myEventFcn(t,y,yp)。欲了解更多信息,请参阅ODE活动地点

溶胶= ode15i (___)返回的结构,你可以使用德瓦尔求区间上任意一点的解的值[T0 TF]。您可以在以前的语法中使用任何输入参数组合。

例子

全部折叠

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

Weissinger的方程是

TY 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
函数res = weissinger(t,y,yp) % weissinger求维斯辛格隐式ODE的残差% %参见ODE15I。The MathWorks, Inc. = 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 = sqrt (3/2);yp0 = 0;[y0, yp0] = decic (yp0 @weissinger t0, y0, 1日,0)
y0 = 1.2247
yp0 = 0.8165

解决方程

使用返回的一致初始条件decicode15i为了解决以上的时间间隔的ODE ( 1 10 ]

[T,Y] = ode15i(@weissinger,[110],Y0,YP0);

阴谋的结果

这个ODE的精确解

y ( t ) = t 2 + 1 2

绘制数值解y通过计算ode15i针对解析解ytrue

ytrue = sqrt (t。^ 2 + 0.5);情节(t y‘*’,T,ytrue,“o”)传说('ode15i','精确')

这个例子将一个ode系统重新定义为一个完全隐式的微分代数方程组(DAEs)。罗伯逊问题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

设置错误的公差和值$\偏f / \偏y

选择= odeset (“RelTol”,1E-4,“AbsTol”(1) e-6 1平台以及1 e-6],...的雅可比矩阵, {[], [1 0 0;0 1 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,[],选项);

解决DAE的使用系统ode15i

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

绘制解决方案组件。由于第二溶液成分是相对于其他小,乘以它由1 e4在绘图之前。

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

输入参数

全部折叠

函数来解决,指定为功能句柄限定要被集成的功能。

功能f = odefun (t y yp),对于标量t和列向量yyp,必须返回一个列向量f的数据类型要么对应于 f ( t , y , y ) odefun必须接受三个输入t,yyp即使其中一个输入没有在函数中使用。

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

函数f = odefun(T,Y,YP)F = YP  - ÿ;

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

y 1 - y 2 = 0 y 2 + 1 = 0 ,

使用此功能。

函数dy = odefun(t,y,yp)dy (1) = yp(1)是(2);dy (2) = yp (2) + 1;

有关如何的信息,以提供额外的参数给函数odefun,请参阅参数化功能

例子:@myFcn

数据类型:function_handle

积分区间,用向量表示。至少,tspan必须是两个元件矢量[T0 TF]指定初始和最终时间。在两者之间的特定时间万博 尤文图斯求得解T0TF,使用较长的向量形式(t0, t1, t2,…,tf)。中的元素tspan一定是全递增或全递减。

解算器通过施加给定的初始条件y0在初始时刻tspan (1),然后从tspan (1)tspan(结束):

  • 如果tspan有两个元素,[T0 TF],然后求解器返回在区间内的每个内部积分步骤中计算的解。

  • 如果tspan元素多于两个(t0, t1, t2,…,tf),则求解器返回在给定评估点的溶液。然而,解算器不准确一步在每个指定点tspan。相反,求解器使用它自己的内部步骤来计算解决方案,然后在请求的点上计算解决方案tspan。在指定点万博 尤文图斯产生的解与在每个内部步骤计算的解具有相同的精度。

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

的值tspan被求解器用来计算合适的值InitialStepMaxStep:

  • 如果tspan包含几个中间点(t0, t1, t2,…,tf),则指定点得到刻度的指示的问题,这会影响的值InitialStep由求解器使用。因此,根据您是否指定,求解器获得的解可能不同tspan作为两元件载体或作为与中间点的矢量。

  • 中的初始值和最终值tspan是用来计算最大步长吗MaxStep。因此,改变初始或最终值在tspan可以使用不同的步骤顺序,这可能会改变溶液导致解算器。

例子:10 [1]

例子:[1 3 5 7 9 10]

数据类型:|

初始条件为y,指定为矢量。y0必须是相同的长度的矢量输出odefun, 以便y0中定义的每个方程包含一个初始条件odefun

对初始条件y0yp0必须是一致的,这意味着 f ( t 0 , y 0 , y 0 ) = 0 。使用decic函数来计算接近猜测值的一致初始条件。

数据类型:|

初始条件为y ',指定为矢量。yp0必须是相同的长度的矢量输出odefun, 以便yp0包含中定义的每个变量的初始条件odefun

对初始条件y0yp0必须是一致的,这意味着 f ( t 0 , y 0 , y 0 ) = 0 。使用decic函数来计算接近猜测值的一致初始条件。

数据类型:|

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

看到ODE选项摘要获取与每个ODE求解器兼容的选项列表。

例子:选项= odeset (e-5 RelTol, 1,“统计”,“对”,“OutputFcn”,@odeplot)指定的相对容错1 e-5,圈求解器统计的显示器上,并指定输出功能@odeplot因为它被计算来绘制该溶液中。

数据类型:结构体

输出参数

全部折叠

评估点,返回的列向量。

  • 如果tspan包含两个元素,[T0 TF],然后t包含用于执行整合内部评估点。

  • 如果tspan包含两个以上的元素,然后t是一样的tspan

万博 尤文图斯解决方案,以数组形式返回。在每一行y的对应行中返回的值对应的解决方案t

事件时间,作为列向量返回。事件时间TE对应于解决方案,在返回万博 尤文图斯指定发生了哪个事件。

在事件的时间解决方案,作为一个数组返回。事件时间TE对应于解决方案,在返回万博 尤文图斯指定发生了哪个事件。

触发事件函数的索引,作为列向量返回。事件时间TE对应于解决方案,在返回万博 尤文图斯指定发生了哪个事件。

结构进行评估,返回作为一个结构数组。使用这种结构与德瓦尔函数来计算在任何点的时间间隔的溶液[T0 TF]。的溶胶结构数组总是包含以下字段:

结构字段 描述

sol.x

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

sol.y

万博 尤文图斯解决方案。每列sol.y(:,我)包含时间的解决方案sol.x(我)

sol.solver

解算器的名字。

此外,如果您指定活动然后检测选项和事件溶胶还包括以下领域:

结构字段 描述

sol.xe

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

sol.ye

万博 尤文图斯中的事件对应的解决方案sol.xe

sol.ie

索引到载体返回由指定的功能活动选择。值指示求解程序检测到的事件。

提示

  • 提供了雅可比矩阵ode15i是可靠性和效率的关键。或者,如果系统是大的和稀疏的,那么提供雅可比矩阵稀疏模式也帮助求解者。在任何情况下,使用odeset方法传入矩阵雅可比矩阵要么JPattern选项。

算法

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

参考文献

[1]劳伦斯F. Shampine,“解决0 = F(T,Y(t)的,Y'(t))的在MATLAB,”杂志数值数学,10卷,第4期,2002年,第291-310。

R2006a前推出