主要内容

解决系统的常微分方程与多个初始条件

这个例子比较了两种技术解决常微分方程组与多组初始条件。的技术是:

  • 使用一个循环执行几个模拟,每个组一个初始条件。这种技术是使用简单但不为大型系统提供最佳的性能。

  • Vectorize ODE函数解决方程组同时为所有的初始条件。这种技术是加快大型系统的方法,但需要重写ODE函数,这样它会重塑正确的输入。

方程用于演示这些技术是著名的生态方程是一阶非线性微分方程描述种群的捕食者和猎物。

问题描述

生态方程是一个系统的两个一阶非线性常微分方程描述种群的捕食者和猎物在一个生物系统。随着时间的推移,捕食者和猎物种群的变化根据方程

dx dt = α x - - - - - - β xy , dy dt = δ xy - - - - - - γ y

在这些方程的变量

  • x 人口规模的猎物吗

  • y 人口规模的天敌

  • t 是时候

  • α , β , δ , γ 是常量参数,描述了这两个物种之间的相互作用。下面的例子使用了参数值 α = γ = 1 , β = 0 01 , δ = 0 02

对于这个问题,初始值 x y 初始种群的大小。解决方程然后提供的信息数量随时间变化的物种如何交互。

解决方程与一个初始条件

在MATLAB解决生态方程,编写一个编码函数方程,为集成指定一个时间间隔,并指定初始条件。然后您可以使用ODE解决者之一,如数值随着时间的推移,模拟系统。

一个编码函数方程

函数dpdt = lotkaODE (t, p)%洛特卡捕食生态模型δ= 0.02;β= 0.01;dpdt = [p(1) *(1 -β* p (2));(2页)。*(1 +δ* p (1)));结束

(包括这个函数是作为本地函数结束时的例子。)

因为系统中有两个方程,dpdt是一个向量和一个元素为每个方程。同时,解向量p有一个元素为每个解决方案组件:(1页)代表 x 在原始方程,(2页)代表 y 在原始方程。

接下来,指定时间间隔为集成 ( 0 , 15 ] 并设置初始种群大小 x y 到50。

t0 = 0;tfinal = 15;p0 = [50;50);

解决系统数值通过指定ODE函数,时间跨度和初始条件。情节产生的数量和时间。

(t, p) =数值(@lotkaODE t0 tfinal, p0);情节(t, p)标题(捕食者和猎物种群随时间的)包含(“t”)ylabel (“人口”)传说(“猎物”,“捕食者”)

图包含一个坐标轴对象。坐标轴对象与标题捕食者和猎物的数量随着时间的推移,包含2线类型的对象。这些对象代表猎物,捕食者。

自解决方案表现出周期金宝搏官方网站性,情节的解决方案在一个阶段的阴谋。

情节(p(: 1),(2):,)标题(捕食者和猎物种群的相图)包含(“猎物”)ylabel (“捕食者”)

图包含一个坐标轴对象。坐标轴对象与标题相的捕食者和猎物种群包含一个类型的对象。

由此产生的情节显示解决方案给定的初始种群大小。解决方程对不同初始种群大小,改变的值p0并重新运行仿真。然而,这种方法只解决了一个初始条件的方程。接下来的两个小节描述技术来解出许多不同的初始条件。

方法1:计算多个初始条件对- - - - - -循环

最简单的方法来解决系统多个常微分方程的初始条件的循环。这种技术使用相同的颂歌函数作为一个初始条件技术,但是循环自动化解决方案的过程。

例如,你可以持有的初始人口规模 x 在50岁,和使用循环变化的初始人口规模 y 10至400。创建一个向量的人口规模y0,然后遍历每个设置的值来解决方程的初始条件。阴谋策划阶段结果从所有迭代。

y0 = 10:10:400;k = 1:长度(y0) (t, p) =数值(@lotkaODE [t0 tfinal], [50 y0 (k)]);情节(p (: 1), (2):,)结束标题(捕食者和猎物种群的相图)包含(“猎物”)ylabel (“捕食者”)举行

图包含一个坐标轴对象。坐标轴对象与标题相的捕食者和猎物种群包含40线类型的对象。

相位图显示所有的计算解决方案不同的初始条件。金宝搏官方网站

方法2:计算多个初始条件与矢量化赋函数

另一种方法来解决系统多个常微分方程的初始条件是重写ODE函数,以便所有的方程同时解决。这样做的步骤是:

  • 提供所有的初始条件数值作为一个矩阵。矩阵的大小年代——- - - - - -n,在那里年代解决方案组件的数量和吗n初始条件的数量被解决。矩阵的每一列代表一个完整的系统的初始条件。

  • ODE函数必须接受一个额外的输入参数n的初始条件。

  • ODE内部函数,解算器通过解决方案组件p是一个列向量。ODE函数必须重塑向量矩阵的大小年代×n。矩阵的每一行包含所有的每个变量的初始条件。

  • ODE函数必须解决方程的矢量格式,以便表达接受向量解决方案组件。换句话说,f (t, y1 y2 y3……)必须返回(f (t, y1) (t, y2) f (t, y3)…]

  • 最后,ODE函数必须重塑其输出回一个向量,以便ODE求解器接收来自每个函数调用返回一个向量。

如果你遵循这些步骤,然后ODE求解器可以解决方程组解决方案组件使用一个向量,而ODE功能重塑向量矩阵,解决了每个解决方案组件的初始条件。其结果是,您可以解决系统的所有在一个模拟的初始条件。

实现这个方法的生态系统,首先找到初始条件的数量n,然后形成一个矩阵的初始条件。

n =长度(y0);p0_all =(50 *的(n, 1) y0 (:)) ';

接下来,重写ODE函数接受n作为输入。使用n重塑解向量为一个矩阵,然后解决矢量化系统和重塑输出回一个向量。修改赋函数来执行这些任务

函数dpdt = lotkasystem (t, p, n)%洛特卡捕食生态系统模型的输入p。δ= 0.02;β= 0.01;变化百分比的大小p: equations-by-number最初的数量%的条件。[]p =重塑(p, n);%写方程的矢量化的形式。:dpdt = [p(1)。*(1 -β* p (2:));:p(2)。*(1 +δ* p (1,:)));%线性化输出。dpdt = dpdt (:);结束

求解方程组的初始条件使用数值。自数值需要ODE函数接受两个输入,使用一个匿名函数传入的值n从工作空间lotkasystem

(t, p) =数值(@ (t, p) lotkasystem (t, p, n), [t0 tfinal], p0_all);

重塑的输出向量为一个矩阵的大小(numTimeSteps *年代)——- - - - - -n。每一列的输出p (:, k)包含一组初始条件的解决方案金宝搏官方网站。画一个阶段解决方案组件的情节。

[]p =重塑(p, n);元=长度(t);k = 1: n的阴谋(p (1: nt, k), p (nt + 1:最终,k))结束标题(捕食者和猎物种群随时间的)包含(“t”)ylabel (“人口”)举行

图包含一个坐标轴对象。坐标轴对象与标题捕食者和猎物的数量随着时间的推移,包含40线类型的对象。

结果相媲美的循环技术。然而,有一些属性矢量化解决方案的技术,你应该记住:

  • 计算解决方案可以从一个稍微不同金宝搏官方网站的比计算初始输入。出现这种差异是因为ODE求解器规范检查适用于整个系统计算时间步的大小,所以时域行为解决方案的略有不同。时间步的变化一般不影响解决方案的准确性,而是这乘以评估解决方案。

  • 为解决僵硬的颂歌ode15s,ode23s,ode23t,ode23tb),自动评估系统的雅可比矩阵数值,指定雅可比矩阵的块对角稀疏模式使用JPattern选择odeset可以提高计算的效率。雅可比矩阵的块对角形式来自输入重塑重写颂歌中执行函数。

比较时间结果

每次使用之前的方法时间。时机解决方程与一组初始条件包括基线数量规模的方法。

%的时间一个集成电路基线时间=(@()数值(@lotkaODE [t0 tfinal], p0), 2);%的时间循环k = 1:长度(y0) loop_timing时间(k) =(@()数值(@lotkaODE [t0 tfinal], [50 y0 (k)]), 2);结束loop_timing =总和(loop_timing);%的时间矢量化fcnvectorized_timing =时间(@()数值(@ (t, p) lotkasystem (t, p, n), [t0 tfinal], p0_all), 2);

创建一个表的计时结果。所有的结果乘以1 e3表达时间,以毫秒为单位。每个解决方案包含一个列的时间,把每一次的初始条件得到解决。

TimingTable =表(1 e3。*(基线;loop_timing;vectorized_timing], 1 e3。*[基线;loop_timing / n;vectorized_timing / n),“VariableNames”,{“TotalTime (ms)”,“TimePerSolution (ms)”},“RowNames”,{一个集成电路的,“多ICs:循环”,“乘ICs:矢量化”})
TimingTable =3×2表TotalTime (ms) TimePerSolution ____________________ (ms) * * *一个IC 1.3287 - 1.3287多ICs:循环50.236 - 1.2559乘ICs:矢量化8.1757 - 0.20439

TimePerSolution列显示的矢量化技术是最快的三个方法。

本地函数

这里列出本地函数数值调用计算解决方案。金宝搏官方网站

函数dpdt = lotkaODE (t, p)%洛特卡捕食生态模型δ= 0.02;β= 0.01;dpdt = [p(1) *(1 -β* p (2));(2页)。*(1 +δ* p (1)));结束% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -函数dpdt = lotkasystem (t, p, n)%洛特卡捕食生态系统模型的输入p。δ= 0.02;β= 0.01;变化百分比的大小p: equations-by-number最初的数量%的条件。[]p =重塑(p, n);%写方程的矢量化的形式。:dpdt = [p(1)。*(1 -β* p (2:));:p(2)。*(1 +δ* p (1,:)));%线性化输出。dpdt = dpdt (:);结束

另请参阅

|

相关的话题