n竞争物种的数值模拟

时间:2018-04-04 10:29:26

标签: matlab plot differential-equations

我想对在Matlab中共享公共资源的n种进行数值模拟。我的系统是这样的形式;

dx_n/dt=x_n(2 - x_{n-1} - x_n),

dx_{n-1}/dt=x_{n-1}(3 - x_{n-2} - x_{n-1} - x_n).

我已经为" n = 5"编写了代码。如下;

dx = @(t,x) [
  x(1); x(1)*(2-x(1)-x(2));
  x(2); x(2)*(3-x(2)-x(2)-x(3));
  x(3); x(3)*(3-x(2)-x(3)-x(4));
  x(4); x(4)*(3-x(3)-x(4)-x(5));
  x(5); x(5)*(2-x(4)-x(5))];
tspan=[0 15];
x0=[0 2 0 3 0 4 0 6 0 8]
[t,x]=ode45(@(t,x) dx(t,x), tspan, x0);
figure(1)
plot(t,x)

我的问题是,"是否有更简单的方法可以为任何' n'?"编写通用代码。有人可以帮帮我吗。我是Matlab的新手。

2 个答案:

答案 0 :(得分:1)

对于{em>匿名函数中的差异进行编码似乎非常棘手,如果不是不可能,就像对n=5所做的那样。

所以你必须将数学放入显式(非匿名)函数

function dx = spdiff(t,x)
n = len(x);
dx(1) = x(1);
dx(2) = x(1) .* (2 - x(1) - x(2));
for k = 2:(n-1)
    dx(2*k-1) = x(k);
    dx(2*k)   = x(k) .* (3 - x(k-1) - x(k) - x(k+1));
end
dx(2*n-1) = x(n);
dx(2*n)   = x(n) .* (2 - x(n-1) - x(n));

然后解决它

[t,x]=ode45(@spdiff, tspan, x0);

发表评论......
让我们在原始问题中使用ODE集,我已经写出了上面的完整代码。

答案 1 :(得分:0)

要在一行中获得原始系统的衍生物,请使用

dx = @(t,x) x.*conv(1-x, [1 1 1], 'same')

1-x生成带有条目1-x(k)的向量,带有[1 1 1]的{​​{3}}生成数组

[ 1-x(1), 2-x(1)-x(2),  3-x(1)-x(2)-x(3), 3-x(2)-x(3)-x(4),... 
                       ..., 3-x(n-2)-x(n-1)-x(n), 2-x(n-1)-x(n), 1-x(n)]

选项shape='same'将其减少到中心部分,即切掉第一个和最后一个元素。然后使用元素乘法,您可以得到公式的右侧。

与问题的初始值除以10的一个积分看起来像

convolution

gnu-octave中,与matlab类似,以下代码生成类似的图

dx = @(x,t) x.*conv(1-x, [1 1 1], 'same')

tspan = 0:0.1:10;    
x0=[0.2, 0.3, 0.4, 0.6, 0.8];
sol = lsode(dx, x0, tspan );
plot(tspan, sol)