我做了以下练习:
在本练习中,我们将使用一个非常简单的地球模型(土地 只有)草生长。净分数的净变化率 由草(A)覆盖的地球面积由下式给出:dA / dt = A((1-A).G-D),其中D是死亡率(每10年的常数为0.1)。草的生长速度为每10万年0.4(G)。 解释这个等式。使用离散方程计算A. 作为时间的函数。程序中的每一步都相当于10年的时间。运行模型200个单位(20亿年)。使用A的起始值为0.001。向屏幕写入增长稳定的时间(此处定义为超过一个时间步的变化小于所考虑时间A与A的初始值之间的差异的1%。
现在我收到了这个剧本:
clear all
%Define variables
D=0.1;
G=0.4;
A=0.001;
dt=10E6; %timestep
timevector=[];
grassvector=[];
startloop=1;
endloop=200;
%Define the loop
for t=startloop:endloop
A=A.*((((1-A).*G)-D)) + A;
grassvector(t)=A;
timevector(t)=t*dt;
end
plot(timevector, grassvector)
到目前为止,似乎工作正常。但我无法弄清楚问题的第二部分。我认为可以通过while循环来完成,但是Matlab会一直给我留下错误。
clear all
D=0.1;
G=0.4;
A=0.001;
dt=10E6;
t=0;
timevector=[];
grassvector=[];
while A(t+1)-A(t) > 0.01(A(t)-A)
t=(t+1)*dt;
A=A.*((((1-A).*G)-D)) + A;
grassvector(t)=A;
timevector(t)=t*dt;
end
有人可以帮忙吗? 谢谢!
答案 0 :(得分:1)
我无法弄清楚你在做什么,但你可能想要这样的东西:
D=0.1;
G=0.4;
A=0.001;
dt=10E-6; % should be a small value
t=0; % initial zero time, cannot be used as index in matlab
steps = 100; % say you want to calculate up to 100 iterations
timevector=zeros(1,steps);
grassvector=zeros(1,steps);
timevector(1,1) = t; % initialize the vectors with initial values
grassvector(1,1) = A;
ii = 1;
while (abs(grassvector(1,ii+1) - grassvector(1,ii)) > 0.01 * (grassvector(1,ii))) && (ii < steps-1)
t = (t+1)*dt;
grassvector(1,ii+1) = grassvector(1,ii) * ((1-grassvector(1,ii))*G - D) + grassvector(1,ii);
timevector(1,ii+1) = t*dt;
ii = ii + 1;
end
在while循环的条件下,我想你要检查delta(A)
是否是一个小值。此外,您还必须检查以重复指定的步骤数。否则,您应该以另一种方式处理内存管理。
在循环内部,您还可以摆脱A
和t
的常量值,并直接使用向量。