解决僵硬的颂歌
本页包含两个例子,解决刚性常微分方程使用ode15s
.MATLAB®有四个求解器设计为刚性ode。
ode15s
ode23s
ode23t
ode23tb
对于大多数难题,ode15s
表现最好的。然而,ode23s
,ode23t
,ode23tb
如果问题允许粗略的容错,可以更有效。
什么是硬ODE?
对于某些ODE问题,与积分区间相比,求解器所取的步长被迫降至一个不合理的小水平,即使在解曲线是光滑的区域。这些步长可能非常小,以至于在很短的时间间隔内遍历可能需要进行数百万次计算。这可能导致解算器集成失败,但即使它成功了,也需要很长时间才能完成。
在ODE求解器中引起这种行为的方程被称为僵硬的.僵硬的ode带来的问题是显式求解器(例如数值
)在达成解决方案方面慢得令人难以忍受。这就是为什么数值
被归类为该方法解算器随着ode23
,ode78
,ode89
,ode113
.
为硬ode设计的求解器,称为僵硬的解决者,通常每一步做更多的工作。其结果是,与非刚性求解器相比,它们能够采取更大的步骤,并有更好的数值稳定性。
解算器选项
对于复杂的问题,用odeset
特别重要。刚性求解者使用雅可比矩阵在积分过程中估计ODE的局部行为,因此提供雅可比矩阵(或者,对于大型稀疏系统,它的稀疏模式)对效率和可靠性至关重要。使用雅可比矩阵
,JPattern
,或矢量化
选项的odeset
来指定关于雅可比矩阵的信息。如果不提供雅可比矩阵,则求解器使用有限差分进行数值估计。
看到odeset
有关其他求解器选项的完整列表。
例子:Stiff van der Pol方程
范德堡尔方程是二阶ODE
在哪里是一个标量参数。当,得到的ode系统非刚性,易于求解数值
.然而,如果你增加到1000时,溶液会发生剧烈变化,并在更长的时间尺度上呈现振荡。逼近初值问题的解变得更加困难。因为这个特定的问题是刚性的,所以针对非刚性问题的求解器,例如数值
,效率太低,不实际。使用硬求解器,例如ode15s
而是这个问题。
通过代换,将范德堡尔方程改写为一阶ode方程组.得到的一阶ode系统为
的vdp1000
函数求范德堡尔方程的值.
函数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)];
使用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。的%问题变得越来越僵硬,越来越稀疏%增加。这个问题的雅可比矩阵是一个稀疏常数矩阵%(带宽为5)。%属性“JPattern”用于为求解器提供一个稀疏的%矩阵的1和0表示非零在雅可比矩阵中的位置% df / dy。默认情况下,ODE套件的硬求解器生成雅可比矩阵%作为完整矩阵。然而,当稀疏模式是%的条件下,求解器用它来生成数值形式为a的雅可比矩阵%稀疏矩阵。提供稀疏模式可以显著减少生成雅可比矩阵所需的函数计算的%数量加快整合。对于BRUSSODE问题,只有4个评价%的函数需要计算2N × 2N的雅可比矩阵。%设置'Vectorized'属性表示函数f是%矢量化。%E. Hairer和G. Wanner,求解常微分方程II,刚性和微分代数问题,Springer-Verlag,柏林,% 1991,第5-8页。%%参见ODE15S, ODE23S, ODE23T, ODE23TB, ODESET, FUNCTION_HANDLE。Mark W. Reichelt和Lawrence F. Shampine, 8-30-94版权所有The MathWorks, Inc.问题参数,与嵌套函数共享。如果nargin<1 N = 20;结束Tspan = [0;10);y0 = [1+sin((2* /(N+1))*(1:N));repmat (1, N)];选项= odeset(矢量化的,“上”,“JPattern”, jpattern (N));[t,y] = ode15s(@f,tspan,y0,options);U = y(:,1:2:end);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)²;dydt = 0 (2*N,size(y,2));%预分配dy/dt在网格的边缘处计算函数的两个分量。%(带有边缘条件)。I = 1;Dydt (i,:) = 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,:));求函数在所有内部网格点上的两个分量。。i = 3:2:2*N-3;Dydt (i,:) = 1 + y(i+1,:).*y(i,:)。^2 - 4*y(i,:) +...c * (y(:我2)2 *(我:)+ y(我+ 2,));Dydt (i+1,:) = 3*y(i,:) - y(i+1,:).*y(i,:)。^ 2 +...: c * (y(张)2 *(我+ 1,)+ y (i + 3,:));在网格的另一边计算函数的两个分量。%(带有边缘条件)。i = 2*N-1;Dydt (i,:) = 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 = ones(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)