0

I've got the following exercise:

In this exercise we are going to use a very simple model of the earth (land only) on which grass grows. The net rate of change in the fraction of the area of the earth covered by grass (A) is given by: dA/dt = A((1-A).G-D), where D is the death rate (a constant of 0.1 per 10 millon years). The growth rate of the grass is 0.4 per 10 millon years (G). Discretise this equation. Use the discretised equation to calculate A as a function of time. Every time step in the program corresponds to a period of 10 millon years. Run the model for 200 time units (is 2 billion years). Use a starting value for A of 0.001. Write to the screen the time at which the growth stabilizes (here defined as that the change over one timestep becomes smaller than 1% of the difference between A at the time under consideration compared to the initial value of A.

Now i got this script:

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)

This far, it seems to work fine. But I can't figure out the second part of the question. I thought it could be done with a while loop but Matlab keeps geving 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

Can someone help? Thanks!

2
  • 1
    There are many typos actually in your code. You cannot have A(0) in MATLAB. Also there is no * in 0.01(A(t)-A). And so on. Commented Nov 29, 2015 at 16:27
  • If the answer below satisfies your question, please, mark is at accepted. Commented Nov 30, 2015 at 12:30

1 Answer 1

1

I cannot exactly figure out what you are doing, but you might want something like this:

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

In the condition of the while loop I guess you want to check the delta(A) to be more than a small value. Also you have to check to repeat up to the specified number of steps. Otherwise, you should handle the memory management in another way. Inside the loop also you can get rid of constant values of A and t and play directly with the vectors.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.