运行ode45时模拟挂起

时间:2014-05-16 17:53:47

标签: matlab

我想要为藻类种群制作模型。这是我到目前为止的代码(全部来自在线示例)。当我运行Solve_algaepop时,它只会挂起很长时间。

任何想法为什么?有什么明显的事我做错了吗?方程式来自研究论文。

这是Solve_algaepop.m。在r1和r2的等式中,P10和P20应该是值 P1 = x(1)中定义了P2 = x(2)algaepop_model.m。当我在Solve_algaepop.m

时,我不知道如何访问这些值
% Initial conditions
P10 = 560000; %from Chattopadhyay; estimated from graph
P20 = 250000; %same as above
Z0 = 280000; %
N0 = 0.6; %from Edwards

%some variables that the expressions of the parameters use
lambda = .6;
mu = .035;
k = 0.05;

%define parameters (start with estimates from Edwards paper):
r1 = (N0/(.03+N0))*((.2*P10)/(.2 + .4*P10)); 
r2 = (N0/(.03+N0))*((.2*P20)/(.2 + .4*P20));
a = Z0*((lambda*P10^2)/(mu^2 + P10^2));%G1: zooplankton growth function from Edwards paper
% m1 = .15; %r in Edwards paper
m1 = .075; % q in Edwards
m2 = .15;% r in Edwards paper
m3 = .15; % r in Edwards paper
d = 0.5;
cN = k;%*(N-N0);

par = [r1 r2 a m1 m2 m3 d cN]; % Creates vector of parameter values to pass to the ode solver

tspan = 0:1:300; %(Note: can also use the function linspace)

x0 = [P10 P20 Z0 N0]; % Creates vector of initial conditions

[t,x] = ode45(@algaepop_model,tspan,x0,[],par);
plot(t,x)

这是algaepop_model.m

function dxdt = algaepop_model(t,x,par)

P1 = x(1);
P2 = x(2);
Z = x(3);
N = x(4);

r1 = par(1);
r2 = par(2);
a = par(3);
m1 = par(4);
m2 = par(5);
m3 = par(6);
d = par(7);
cN = par(8);

dxdt = zeros(4,1);

dxdt(1) = r1*N*P1 - m3*P1 - a*P1*Z;
dxdt(2) = r2*N*P2 - a*P2*Z - m2*P2;
dxdt(3) = a*P2*Z + a*P1*Z - m1*Z;
dxdt(4) = d*m2*P2 + d*m1*Z + d*m3*P1 + cN - r2*N*P2 - r1*N*P1;

end

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

让我们调试一下。您可以做的最简单的事情之一是在集成函数t内打印xalgaepop_model。一旦你这样做,你可能会注意到发生了什么:ode45正在采取非常小的步骤。他们按1.9e-9的顺序排列。如果步数很小,则需要永远模拟到t = 300(如果在每一步上打印出来,则需要更长时间)。

这可能是由于初始条件选择不当,缩放或尺寸不合理,错误导致错误的方程,或者只是因为您对特定问题使用了不适当的求解器(和/或容差) 。我无法真正解决前两种情况,必须假设您没有任何错误。因此,在这种情况下,您实际拥有的stiff systemode45在这种情况下不是特别好的选择。只需将解算器更改为ode15s,几乎可以立即生成以下图表:

plot

正如您所看到的,在情节的初始部分,短时间内会有很大的变化。如果你放大你'''看到巨大的尖峰发生在第一个时间单位(你可能输出更多的时间点或只是让tspan = [0 300])。一些状态变量正在迅速变化,而其他变量则逐渐变化。如此高的频率和时间尺度的差异是僵硬系统的标志。我建议,除了确认您的代码是正确的之外,您还可以尝试通过odeset调整集成容差。确保更严格的公差产生质量相似的结果。如果您愿意,也可以尝试other stiff solvers in the ODE suite

最后,通过功能句柄本身传递参数更有效率和最新,而不是你如何做到这一点。以下是:

[t,x] = ode15s(@(t,x)algaepop_model(t,x,par),tspan,x0);