我正在尝试遵循此research paper。我正在尝试复制第20页的图7中的解决方案图。我有一个图7的屏幕截图:
我首先要重新创建左图。我所拥有的系统是dX
。这是我在m文件中的内容:
function dX = CompetitionModel(t,X)
bs = 8*10^(-3);
bl = 4*10^(-3);
bh = 6.4*10^(-3);
N = bs + bl + bh;
K = 10^8;
m1 = 2*10^(-5);
m2 = 9*10^(-9);
p = 5*10^(-13);
I = 10^(-3);
T = 0;
a = 0;
dX = [X(1) * (bs * (1 - N/K) - I - T - m1) - p * X(1) * (X(2) + X(3));
X(2) * (bl * (1 - N/K) - I - a*T - m2) + m1 * X(1) + p * X(2) * (X(1) - X(3));
X(3) * (bh * (1 - N/K) - I - a*T) + m2 * X(2) + p * X(3) * (X(1) + X(2))];
end
ode45
的语法为:[T,Y] = solver(odefun,tspan,y0)
。我从我发布的图片中得到了tspan。我的初始条件是:S0 = 10^4; Rl0 = 0; Rh0 = 0
,所以这就是y0
。我在命令窗口中键入以下内容:
>>[t,X1] = ode45('CompetitionModel', [0,45000], [10^4, 0, 0]);
>>[t,X2] = ode45('CompetitionModel', [0,45000], [10^4, 0, 0]);
>>[t,X3] = ode45('CompetitionModel', [0,45000], [10^4, 0, 0]);
过去30分钟,MATLAB一直很忙,我的笔记本电脑开始变热了。因此,在完成之前我无法进行绘图,而且我不知道代码中是否存在任何错误。我想知道是否有更好的方法可以获得系统的解决方案dX
。
答案 0 :(得分:3)
我检查了ODE对纸张,发现一个错误。根据文件第9页的最后一段N = S + Rl + Rh
。更正后的代码:
function dX = CompetitionModel(~,X)
bs = 8e-3;
bl = 4e-3;
bh = 6.4e-3;
N = sum(X); % this line was incorrect
K = 1e8;
m1 = 2e-5;
m2 = 9e-9;
p = 5e-13;
I = 1e-3;
T = 0;
a = 0;
dX = [X(1) * (bs * (1 - N/K) - I - T - m1) - p * X(1) * (X(2) + X(3));
X(2) * (bl * (1 - N/K) - I - a*T - m2) + m1 * X(1) + p * X(2) * (X(1) - X(3));
X(3) * (bh * (1 - N/K) - I - a*T) + m2 * X(2) + p * X(3) * (X(1) + X(2))];
注意一些语法上的变化。首先,由于您实际上并未在ODE中使用时间值,因此可以使用~
代替函数定义中的t
作为未使用输入的替代。其次,您可以使用符号8e-3
代替8*10^(-3)
。他们评价同样的事情,但前者看起来更清洁。
不治疗的情节,即T = 0
,如下所示。
我首先尝试用MATLAB中的一些刚性ODE求解器求解你的方程,从而找出了ODE中的问题。有关详细信息,请参阅MATLAB ODE solver documentation。基本上我用ode15s
和ode23s
解决了它,发现解决方案不稳定(人口变为无穷大)。如果您的解决方案悬而未决,这些其他求解器是很好的工具。有时其中一个会工作,它会给你你想要的东西,或者表明你在其他地方有另一个问题。
注意:我相当确定您没有使用"相位画像"在这里正确。您只是在给定一组初始条件下寻找ODE与时间的解决方案。 A phase portrait着眼于系统的状态(这里有三个不同的群体)如何根据不同的初始条件进化。它没有向您展示这些解决方案的时间依赖性,以及它们相对于彼此的演变方式。