解决刚性常微分方程
这个页面包含两个求解刚性常微分方程使用的例子ode15s
。MATLAB®有四个连接器设计为刚性常微分方程。
ode15s
ode23s
ode23t
ode23tb
最硬的问题,ode15s
表现最好的。然而,ode23s
,ode23t
,ode23tb
可以更有效的如果问题允许原油错误宽容。
什么是僵硬的歌唱?
颂歌一些问题的解决者被迫采取的步长到不合理的小级别的间隔集成相比,即使在一个地区解决曲线是光滑的。这些步骤大小可以很小,遍历一个短的时间间隔可能需要数以百万计的评估。这可能导致求解失败的集成,但即使它成功了,它将花费很长的时间。
在歌唱动力学方程导致这种行为说僵硬的。刚性常微分方程带来的问题是明确的解决者(如数值
)是站不住脚的缓慢在实现一个解决方案。这就是为什么数值
被归为一个该方法解算器随着ode23
,ode78
,ode89
,ode113
。
设计为刚性常微分方程的解决者,称为僵硬的解决者每一步,通常做更多的工作。回报是他们能够采取更大的措施,解决和改善了数值稳定性相比该方法。
解算器选项
僵硬的问题,指定使用雅可比矩阵odeset
是特别重要的。僵硬的解决者使用雅可比矩阵估计ODE的本地行为作为集成收益,所以提供的雅可比矩阵(或者,为大型稀疏系统,其稀疏模式)对效率和可靠性至关重要。使用雅可比矩阵
,JPattern
,或矢量化
选项的odeset
指定的雅可比矩阵的信息。如果你不提供雅可比矩阵然后使用有限差分数值解算器估计。
看到odeset
其他解算器选项的完整清单。
例如:僵硬的范德波尔方程
范德波尔方程是二阶的颂歌
在哪里是一个标量参数。当常微分方程,得到的系统使用该方法,容易解决数值
。然而,如果你增加到1000年,那么解决方案大幅变化,展品更长的时间尺度振荡。近似初值问题的解决变得更加困难。因为这个问题是僵硬的,用于解决该问题,如数值
,太低效的实用。使用一个硬解算器等ode15s
关于这个问题。
重写范德波尔方程作为一个系统的一阶常微分方程进行替换。结果系统的一阶常微分方程
的vdp1000
使用函数计算范德波尔方程。
函数dydt = vdp1000 (t, y)% VDP1000评估范德堡尔常微分方程为μ= 1000。%%参见ODE15S、ODE23S ODE23T ODE23TB。% Jacek Kierzenka和劳伦斯·f·Shampine% 1984 - 2014版权MathWorks公司。dydt = [y (2);1000 * (1 y (1) ^ 2) * y (2) - y (1)];
使用ode15s
函数来解决问题的初始条件的向量[2;0]
,在一个时间间隔3000年[0]
。扩展的原因,只有第一个组件的解决方案。
[t、y] = ode15s (@vdp1000, 3000年[0],[2;0]);情节(t y (: 1),“o”);标题(范德波尔方程的解,\μ= 1000 ');包含(“t”);ylabel (“解决方案y_1”);
的vdpode
函数还解决了相同的问题,但是它接受用户指定的值。方程变得越来越僵硬增加。
例如:稀疏Brusselator系统
经典的Brusselator方程组可能很大,僵硬,稀疏。Brusselator系统模型在化学反应扩散,和由方程组表示,,,。
函数文件brussode
解决了这组方程的时间间隔[0,10]
与。初始条件是
在哪里为。因此,有在系统方程,但雅可比矩阵是一个带状矩阵与一个常数的宽度5如果方程命令。作为的增加,这个问题变得越来越僵硬,雅可比矩阵变得越来越稀疏。
函数调用brussode (N)
,因为,指定一个值N
方程组,对应网格点的数量。默认情况下,brussode
使用。
brussode
包含几个子功能:
嵌套函数
f (t, y)
编码的方程组Brusselator问题,返回一个向量。当地的函数
jpattern (N)
返回一个稀疏矩阵的1和0的位置在雅可比矩阵非零。这个矩阵是分配给的JPattern
场的选择结构。ODE求解器使用这种稀疏模式来生成雅可比矩阵稀疏矩阵数值。提供这种稀疏模式问题的数量显著减少函数评估需要生成2 n-by-2n雅可比矩阵,从2 n评估4。
函数brussode (N)% BRUSSODE僵硬问题模拟化学反应(Brusselator)。% N > = 2参数用于指定网格点的数量;的%由2 n方程组。默认情况下,N是20。的%的问题变得越来越僵硬,N是越来越稀疏%增加。雅可比矩阵这个问题是一个稀疏常数矩阵5)%(带状带宽。%%属性“JPattern”是用来提供解决稀疏% 1和0显示位置的矩阵非零的雅可比矩阵% df / dy。默认情况下,ODE套件的僵硬的解决产生雅克比%作为完整的矩阵数值。然而,当一个稀疏模式%,解算器使用它来生成雅可比矩阵数值作为一个%稀疏矩阵。提供一个稀疏模式可以显著减少%需要生成雅可比矩阵和函数值的运算次数%加速整合。BRUSSODE问题,只有4的评价%计算所需的函数2 n x 2 n的雅可比矩阵。%%设置属性表示函数f是矢量化%矢量化。%%的头发和g·华纳、解常微分方程二世%僵硬和微分代数问题,斯普林格出版社,柏林,% 1991,5 - 8页。%%也看到ODE15S ODE23S、ODE23T ODE23TB, ODESET FUNCTION_HANDLE。马克·w·Reichelt和劳伦斯·f·Shampine % 8-30-94% 1984 - 2014版权MathWorks公司。%问题参数,与嵌套函数共享。如果输入参数个数< 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 (解决你的);标题([的Brusselator N = 'num2str (N)));% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%嵌套函数——N是由外部提供的函数。%函数dydt = f (t, y)%导数函数c = 0.02 * (N + 1) ^ 2;dydt = 0 (2 * N,大小(y, 2));% preallocate dy / dt%评估2组件的函数在一个网格的边缘%(边界条件)。i = 1;dydt(我:)= 1 + y (i + 1:)。* y(我:)。^ 2 - 4 * y(我:)+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,:));%评估函数的两部分,内部网格点。我= 3:2:2 * n - 3;dydt(我:)= 1 + y (i + 1:)。* y(我:)。^ 2 - 4 * y(我:)+…c * (y(:我2)2 *(我:)+ y(我+ 2,));:dydt (i + 1) = 3 *(我:)- y (i + 1:)。* y(我:)。^ 2 +…:c * (y(张)2 *(我+ 1,)+ y (i + 3,:));%评估2组件的函数在其他网格的边缘%(边界条件)。我= 2 * n - 1;dydt(我:)= 1 + y (i + 1:)。* y(我:)。^ 2 - 4 * y(我:)+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);结束% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
解决Brusselator系统通过运行函数brussode
。
brussode
解决系统通过指定一个输入brussode
。
brussode (50)