|
"Jac " <jac_domney@hotmail.com> wrote in message
news:k501kq$lc0$1@newscl01ah.mathworks.com...
> I am faced with the following question
>
> The logistic growth model given below is often used to describe the
> population growth where r is the population growth rate ad K is the
> maximum population.
>
> dP/dt = r*P((K-P)/K)
>
> Use loop to iterate through possible values for parameters r and Kto fit
> the logistic growth ODE within 15 seconds time limit. The code should
> automatically find parameters where mean absolute error of the world
> population is at a minimum. The growth rate of world population is
> typically 1%-3% and the maximum world population is typically less than 50
> billion.
>
> Some more background information
> - The data was recorded from 1950:2010
> - initial population is 2532229237
> - Already defined in a vector 'Pop' which holds the world population for
> each year
> - There is a 15second time limit for MATLAB to compute the answer using my
> code
>
> My current code is quiet inefficient as it can not find the values of K
> and r within this 15 second window.
>
> K = 10*10^9 - 2*10^6;
> P_q2f(1:21,1) = 2532229237;
> myx = 0;
>
> %Begin a nested bunch of loops
> while K <= 50*10^9
> K = K + 2*10^6;
So you want to go from K = 9998000000 to K = 50000000000 by increments of
2000000 -- how many increments will you need in the worst-case scenario?
K0 = 10*10^9 - 2*10^6
K1 = 50*10^9
d = 2*10^6
nInc = (K1-K0)/d
doWeHitTheUpperLimit = K0+(nInc*d) == K1
We perform nInc+1 = 20002 iterations of the WHILE loop in the worst case.
> myz = 0;
> r = 0.009;
> while r <= 0.03
> r = r + 0.001;
21 iterations here per outer loop iteration in the worst case scenario. That
could mean 20002*21 iterations if your upper limits for K and r are the
optimal values you seek.
> myz = myz + 1;
> myx = myx + 1;
> for i = 2:61
> P_q2f(myz,i) = P_q2f(myz,i-1) +
> r*P_q2f(myz,i-1)*((K-P_q2f(myz,i-1))/K);
> end
60 iterations of this FOR loop for each iteration of the inner and outer
loops, so 20002*21*60 assignments into P_q2f.
And preallocate this to be 61 rows long so you don't have to grow it each
iteration through the loop.
> error_q2f(myx,1) = sum(abs(P_q2f(myz,1:end)-Pop));
> end
> end
>
> [minVal, I] = min(error_q2f)
>
>
> My code is a pretty ugly mess of nested loops. Can anyone think of a
> simpler and/or more efficient way of computing:
> - The best fitting K and r values
> - A vector of the population using these parameters
If you have Optimization Toolbox, look at FMINUNC or FSOLVE with one of the
ODE solvers in MATLAB like ODE45.
--
Steve Lord
slord@mathworks.com
To contact Technical Support use the Contact Us link on
http://www.mathworks.com
|