这一页包含两个例子,解决刚性常微分方程使用ode15s
.MATLAB®有四个为刚性ode设计的求解器。
ode15s
ode23s
ode23t
ode23tb
对于大多数棘手的问题,ode15s
表现最好的。然而,ode23s
,ode23t
,ode23tb
如果问题允许粗略的容错,则可以更有效。
对于一些ODE问题,求解器所采取的步长被强迫降至一个不合理的小水平,与积分区间相比,即使在求解曲线是平滑的区域。这些步长可能非常小,以至于穿越一个短时间间隔可能需要数百万次计算。这可能导致求解器在集成中失败,但即使它成功了,也需要很长时间才能做到。
在ODE求解器中导致这种行为的方程被称为僵硬的.僵硬的ode提出的问题是显式求解器(例如数值
)解决问题的速度慢得站不住脚。这就是为什么数值
被归类为该方法解算器随着ode23
和ode113
.
为刚性ode设计的求解器,称为僵硬的解决者,通常每一步做更多的工作。结果是,与非刚性求解器相比,它们能够采取更大的步骤,并提高了数值稳定性。
对于刚性问题,指定雅可比矩阵使用odeset
是特别重要的。刚性求解器使用雅可比矩阵在集成过程中估计ODE的局部行为,因此提供雅可比矩阵(或者,对于大型稀疏系统,提供其稀疏模式)对于效率和可靠性是至关重要的。使用雅可比矩阵
,JPattern
,或矢量化
选项的odeset
来指定关于雅可比矩阵的信息。如果你不提供雅可比矩阵,那么求解器就会用有限差分数值估计它。
看到odeset
获取其他求解器选项的完整列表。
范德波尔方程是一个二阶微分方程
在哪里为标量参数。当,得到的ode系统是非刚性的,易于使用数值
.但是,如果你增加到1000时,解发生了剧烈的变化,并在更长的时间尺度上表现出振荡。初值问题的近似解变得更加困难。因为这个特殊的问题是僵硬的,一个解决非僵硬问题的方法,例如数值
它的效率太低,不实用。使用硬解算器,如ode15s
而不是这个问题。
将范德波尔方程改写为一阶ode系统.得到的一阶ode系统为
的vdp1000
函数求范德波尔方程的值.
函数dydt = vdp1000 (t, y)计算mu = 1000时的范德堡尔ode。%%参见ODE15S, ODE23S, ODE23T, ODE23TB。亚采克·基尔赞卡和劳伦斯·f·沙宾版权所有1984-2014 The MathWorks, Inc.dydt = [y (2);1000 * (1 y (1) ^ 2) * y (2) - y (1)];
使用ode15s
函数的初始条件向量为[2;0]
的时间间隔3000年[0]
.出于缩放的原因,只绘制解决方案的第一个组件。
[t,y] = ode15s(@vdp1000,[0 3000],[2;0]);情节(t y (: 1),“o”);标题(van der Pol方程的解,\mu = 1000);包含(“t”);ylabel (“解决方案y_1”);
的vdpode
函数也解决了相同的问题,但是它接受用户指定的值.方程变得越来越僵硬增加。
经典的布鲁塞尔方程组可能是庞大、僵硬和稀疏的。布鲁塞尔系统模拟化学反应中的扩散,并由一个涉及,,,.
函数文件brussode
在时间间隔上解这组方程[0, 10]
与.初始条件为
在哪里为.因此,有而是雅可比矩阵是否有一个宽度为5的带状矩阵,如果方程是有序的.作为,问题变得越来越僵硬,雅可比矩阵变得越来越稀疏。
函数调用brussode (N)
,因为,指定的值N
在方程组中,对应于网格点的个数。默认情况下,brussode
使用.
brussode
包含一些子函数:
嵌套函数f (t, y)
编码布鲁塞尔问题的方程组,返回一个向量。
当地的函数jpattern (N)
返回一个由1和0组成的稀疏矩阵,表示雅可比矩阵中非零的位置。这个矩阵被赋给JPattern
期权结构的字段。ODE解算器使用这个稀疏模式来产生雅可比矩阵作为一个稀疏矩阵。在问题中提供这种稀疏模式可以显著减少生成2N × 2N雅可比矩阵所需的函数求值次数,从2N求值减少到仅4次。
函数brussode (N)模拟化学反应的困难问题。%参数N >= 2用于指定网格点的个数;的生成的系统由2N个方程组成。缺省情况下,N为20。的随着N的存在,问题变得越来越僵硬和稀疏%增加。这个问题的雅可比矩阵是一个稀疏常数矩阵%(带状带宽为5)。%属性'JPattern'用于为求解器提供一个稀疏的由1和0组成的%矩阵,表示雅可比矩阵中非零的位置% df / dy。默认情况下,ODE套件的刚性求解器生成雅可比矩阵%数值上为完整矩阵。然而,当稀疏模式是%,求解器使用它来生成雅可比矩阵的数值形式为a%稀疏矩阵。提供稀疏模式可以显著减少生成雅可比矩阵所需的函数值的百分比%加速整合。对于BRUSSODE问题,只有4个评价%函数需要计算2N x 2N雅可比矩阵。%%设置“矢量化”属性表示函数f%矢量化。%% E.海勒,G.万纳,求解常微分方程II,僵硬和微分代数问题,施普林格-弗拉格,柏林,1991,第5-8页。%%参见ODE15S, ODE23S, ODE23T, ODE23TB, ODESET, FUNCTION_HANDLE。Mark W. Reichelt和Lawrence F. Shampine, 8-30-94版权所有1984-2014 The MathWorks, Inc.问题参数,与嵌套函数共享。如果nargin<1 N = 20;结束tspan = [0;10);罪y0 =(1 +(2 *π/ (N + 1) * (1: N));repmat (1, N)];选择= odeset (矢量化的,“上”,“JPattern”, jpattern (N));[t、y] = ode15s (@f tspan, y0,选项);u = y(1:2,::结束);x = (1: N) / (N + 1);图;冲浪(x, t, u);视图(-40年,30);包含(“空间”);ylabel (“时间”);zlabel (解决你的);标题(['布鲁塞尔的N = 'num2str (N)));% -------------------------------------------------------------------------%嵌套函数——N由外部函数提供。%函数dydt = f (t, y)%导数函数c = 0.02 * (N+1)^2;dydt = 0 (2 * N,大小(y, 2));% preallocate dy / dt%计算网格一侧的函数的两个分量%(带边缘条件)。i = 1;= 1 + y(i+1,:).*y(i,:)。^2 - 4*y(i,:) +c*(1-2*y(i,:)+y(i+2,:)); dydt(i+1,:) = 3*y(i,:) - y(i+1,:).*y(i,:).^2 + c*(3-2*y(i+1,:)+y(i+3,:));在所有内部网格点上计算函数的2个分量。我= 3:2:2 * n - 3;= 1 + y(i+1,:).*y(i,:)。^2 - 4*y(i,:) +...c * (y(:我2)2 *(我:)+ y(我+ 2,));y(i+1,:) = 3*y(i,:) - y(i+1,:).*y(i,:)^ 2 +...: c * (y(张)2 *(我+ 1,)+ y (i + 3,:));%在网格的另一边计算函数的两个分量%(带边缘条件)。我= 2 * n - 1;= 1 + y(i+1,:).*y(i,:)。^2 - 4*y(i,:) +c*(y(i-2,:)-2*y(i,:)+1); dydt(i+1,:) = 3*y(i,:) - y(i+1,:).*y(i,:).^2 + c*(y(i-1,:)-2*y(i+1,:)+3);结束% -------------------------------------------------------------------------结束% brussode% ---------------------------------------------------------------------------%子函数——稀疏模式%函数S = jpattern (N)%雅可比稀疏模式B = 1 (2 * N, 5);B (2:2:2 * N, 2) = 0 (N, 1);B (1:2:2 * N - 1, 4) = 0 (N, 1);S = spdiags (B, 2:2, 2 * N, 2 * N);结束% ---------------------------------------------------------------------------
解决布鲁塞尔系统通过运行函数brussode
.
brussode
解决系统通过指定输入brussode
.
brussode (50)