2015-11-29 2 views
0

Я получил следующее упражнение:Проведение While-цикл в Matlab с массивами

В этом упражнении мы будем использовать очень простую модель земли (земля только), на котором трава растет. Чистая скорость изменения доли площади земли, покрытой травой (A), определяется следующим образом: dA/dt = A ((1-A) .GD), где D - коэффициент смертности (константа 0,1 на 10 миллион лет). Темп роста травы составляет 0,4 на 10 миллионов лет (G). Дискретизируйте это уравнение. Используйте дискретизированное уравнение для вычисления A как функцию времени. Каждый шаг в программе соответствует периоду в 10 миллионов лет. Запустите модель на 200 единиц времени (2 миллиарда лет). Используйте начальное значение для A 0,001. Написать на экран время, в которое стабилизирует прирост (здесь определено как, что изменение в течение одного временного шага становится меньше, чем на 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) 

Это далеко, это, кажется, работает отлично, но я не могу понять вторую часть вопроса я думал, что это может быть сделано с помощью цикла в то время, но Matlab держит geking me errors.

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 

Может кто-нибудь помочь? Спасибо!

+1

В коде есть много опечаток. Вы не можете иметь 'A (0)' в MATLAB. Также нет '*' в '0.01 (A (t) -A)'. И так далее. – NKN

+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 

В условиях цикла, пока я думаю, вы хотите проверить delta(A) быть больше, чем небольшой стоимость. Также вы должны проверить, чтобы повторить указанное количество шагов. В противном случае вы должны обращаться с управлением памятью по-другому. Внутри цикла также вы можете избавиться от постоянных значений A и t и играть непосредственно с векторами.

Смежные вопросы