我想对在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的新手。
答案 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的一个积分看起来像
在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)