Using the euler method

2 views (last 30 days)
Kelsey Pettrone
Kelsey Pettrone on 21 Sep 2020
Commented: James Tursa on 22 Sep 2020
Hi something is wrong with my for loop i have no idea what to do
% write a program that will explore population dynamics
% The population dynamics of a community can be described by:
% dp/dt = G(Pmax - P(t))*P(t)
% Use Euler's Method to determine the population (") as a function of time (#)
% Plot the population (") as a function of time (#) from t = 0 to t = 20 years
% Use the following values for constants in the differential equation:
% pmax = 10,000
% G = 0.00005
% Use an initial condition of p = 800 when t=0
%% set perameters
pmax = 10000
G = 0.00005
tmin = 0
tmax = 20
Nx = 50
t = linspace(tmin, tmax, Nx)
dt = t(1)-t(0)
p = zeros(1,Nx)
p(0) = 800
%% calculate p values using euler method
p(1) = G*(pmax - p(0))*p(0)*dt+p(0)
for ip = 1:Nx
p(ip+1) = G*(pmax - p(t(ip))*p(t(ip))*dt+p(t(ip))
end

Answers (2)

Geoff Hayes
Geoff Hayes on 21 Sep 2020
Kelsey - there are a couple of coding mistakes with the above. Before the code can execute, there is an error
Invalid expression. When calling a function or indexing a variable, use parentheses. Otherwise, check for
mismatched delimiters.
with the line
p(ip+1) = G*(pmax - p(t(ip))*p(t(ip))*dt+p(t(ip))
becaue there is a missing closing bracket. The above line should be
p(ip+1) = G*(pmax - p(t(ip))*p(t(ip))*dt+p(t(ip)));
Next, there is the error
Array indices must be positive integers or logical values.
with the line
dt = t(1)-t(0)
As the error message indicates, positive integers or logical values must be used as indices. 0 is not a positive integer, so you if you want to find the delta, then just do
dt = t(2)-t(1)
Similarly, you must change
p(0) = 800
%% calculate p values using euler method
p(1) = G*(pmax - p(0))*p(0)*dt+p(0)
for ip = 1:Nx
to
p(1) = 800
%% calculate p values using euler method
p(2) = G*(pmax - p(1))*p(1)*dt+p(1)
for ip = 2:Nx
The final problem will be with
p(ip+1) = G*(pmax - p(t(ip))*p(t(ip))*dt+p(t(ip)));
and the error
Array indices must be positive integers or logical values.
because of p(t(ip)) where you are using the vaues of t - which are not integers - as indices into p. What is this code trying to do here?
  1 Comment
Kelsey Pettrone
Kelsey Pettrone on 21 Sep 2020
just to take the formula that was given and use eulers method and a for loop to find the population from 1 to 20 years

Sign in to comment.


James Tursa
James Tursa on 21 Sep 2020
Edited: James Tursa on 21 Sep 2020
p(ip) is the value of p at time t(ip). p isn't a function that you are passing time into like you are doing with p(t(ip)). So get rid of that t(ip) subscripting and simply use ip subscripting instead. E.g.,
p(ip+1) = G*(pmax - p(ip))*p(ip)*dt + p(ip);
Also, the initial condition is p = 800, and the initial value is p(1), so replace that p(1) line with simply
p(1) = 800;
and get rid of the p(0) = 800 line since 0 is not a valid subscript.
Which also means that the dt calculation should be this:
dt = t(2) - t(1);
  4 Comments
Kelsey Pettrone
Kelsey Pettrone on 21 Sep 2020
and i think it might be this
p(ip) = G*(pmax - p(ip-1))*p(ip-1)*dt + p(ip-1);
with -1 but im not sure
would this make sense?
James Tursa
James Tursa on 22 Sep 2020
This depends on how you do the for-loop indexing. If the for-loop index starts at 1, then you use ip+1 on the lhs and ip on the rhs. If the for-loop index starts at 2, then you would use ip on the lhs and ip-1 on the rhs. Either way works ... personal preference.

Sign in to comment.

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!