Got Questions? Get Answers.
Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Thread Subject:
ODE - nested loops *complex*

Subject: ODE - nested loops *complex*

From: Jac

Date: 9 Oct, 2012 02:20:10

Message: 1 of 2

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;
    myz = 0;
    r = 0.009;
    while r <= 0.03
        r = r + 0.001;
        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
        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

Any help is greatly appreciated I have spent so many hours on this one question. Thanks

Subject: ODE - nested loops *complex*

From: Steven_Lord

Date: 9 Oct, 2012 14:00:24

Message: 2 of 2



"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

Tags for this Thread

No tags are associated with this thread.

What are tags?

A tag is like a keyword or category label associated with each thread. Tags make it easier for you to find threads of interest.

Anyone can tag a thread. Tags are public and visible to everyone.

Contact us