Lotka-Volterra model Euler's Method

In summary, the conversation discusses the Lotka-Volterra predator-prey model equations and how to graph the densities as a function of time and a phase space graph. The conversation also includes a java code implementing the equations and a suggestion to improve the code by using named variables and formatting the equations for readability. The output file from the code is used to plot the prey and predator densities, with varying parameter values, and the resulting graph is compared to other Lotka model graphs found online.
  • #1
Robben
166
2

Homework Statement



*I am not sure if this should be in the computer science section or here?

I am trying to graph the densities, of the Lotka-Volterra prey and predator model, as a function of time, i.e. ##p(t)## vs ##t## and ##q(t)## vs ##t##. Also, the phase space, i.e. ##p## vs ##q##, but I am not sure how to do that?

Let ##p## be the prey density and ##q## is the predator density, thus: $$\frac{dp}{dt} = ap\left(1-\frac{p}{K}\right)-\frac{bpq}{1+bp}$$ $$\frac{dq}{dt}=mq\left(1-\frac{q}{kp}\right).$$

Where ##bpq## is the interaction rate between the species, ##\frac{bpq}{1+bp}## is the effective rate of eating prey, ##m## is the mortality rate of the predators, ##K## and ##k## are the carrying capacitance of each population. Let ##a=0.2, \ m=0.1, \ K=500,\ k = 0.2.##

Homework Equations


$$p_i = p_{i-1}+\text{p-slope}_{i-1}\Delta t$$
$$q_i = q_{i-1}+\text{q-slope}_{i-1}\Delta t.$$

The Attempt at a Solution



We are also given ##a=0.2, \ m=0.1, \ K=500,\ k = 0.2, b = 0.1, p(0) = 10, q(0) = 5.## I chose ##\Delta t = h = 0.1.##

Thus:

$$\begin{align} p_i& = p_{i-1} + \left(0.2~ p_{i-1}\left(1 - \dfrac{p_{i-1}}{500}\right) -\dfrac{0.1~ p_{i-1}~ q_{i-1}}{1 + 0.1~ p_{i-1}} \right)(0.1) \\ q_i& = q_{i-1} + \left(0.1~q_{i-1}\left(1 - \dfrac{q_{i-1}}{0.2~ p_{i-1}}\right) \right)(0.1) \end{align}$$

Which gives the iteration:

##p_0 = 10, \ q_0 = 5##
##p_1 = 9.946, \ q_1 = 4.925##
##p_2 = 9.89538, \ q_2 = 4.85231##
##p_3 = 9.84803, \ q_3 = 4.78187##
##\ldots##

My java code:

Java:
public class Lotka {
    public static void main(String[] args) {
        double[] p = new double[1000];
        double[] q = new double[1000];
        p[0] = 10;
        q[0] = 5;
        for(int i = 1; i < 1000; i++) {
            p[i] = p[i-1] + (0.2*p[i-1]*(1-p[i-1]/500)-(0.2*p[i-1]*q[i-1])/(1+0.2*p[i-1]))*0.001;
            q[i] = q[i-1] + (0.1*q[i-1]*(1-q[i-1]/(0.2*p[i-1])))*0.001;
            System.out.println("" + p[i] + " " + q[i]);  
        }   
    }   
}

 
Physics news on Phys.org
  • #2
The phase space ##(p,q)## will containt trajectories having ##t## as parameter, i.e. you form pairs of ##p## and ##q## at equal time ##t## and then you plot them. Did you plot ##p(t)## and ##q(t)## ?
 
  • #3
soarce said:
The phase space ##(p,q)## will containt trajectories having ##t## as parameter, i.e. you form pairs of ##p## and ##q## at equal time ##t## and then you plot them. Did you plot ##p(t)## and ##q(t)## ?

So, I should make the parameter ##t## vary instead of letting ##t = 0.1##? So, something like ##0.1## through ##0.5##?
 
  • #4
Let's run ##t## from ##t_{min}## and ##t_{max}##, from your program you will obtain three columns of data ##t_i##, ##p_i## and ##q_i##. The curves in the phase space are given by ##(p_i,q_i)##.
 
  • #5
The first thing you should do is replace all the numbers in your code with named variables. Not only does this make your code more readable and maintainable, but you will find that you have used different values in your code from what you say they should be.

You should also reformat your equations in the code to add spaces, again for readability; as it is now, they are completely unreadable.

Also, since you are only using the last value of p and q, there is no reason to store all of them. Just assign the initial values to variables like p_old and q_old, and then at the end of each iteration store the new values in those variable.
 
  • #6
soarce said:
Let's run ##t## from ##t_{min}## and ##t_{max}##, from your program you will obtain three columns of data ##t_i##, ##p_i## and ##q_i##. The curves in the phase space are given by ##(p_i,q_i)##.

I see, thank you!

tms said:
You should also reformat your equations in the code to add spaces, again for readability; as it is now, they are completely unreadable.

Also, since you are only using the last value of p and q, there is no reason to store all of them. Just assign the initial values to variables like p_old and q_old, and then at the end of each iteration store the new values in those variable.

What do you mean by add spaces?

Also, I need all values of i because I am going to plot them in gnuplot.
 
  • #7
Robben said:
What do you mean by add spaces?
I mean space out the equations so they are more readable. Instead of
Code:
q[i] = q[i-1] + (0.1*q[i-1]*(1-q[i-1]/(0.2*p[i-1])))*0.001;
write something like
Code:
q[i] = q[i-1] + (0.1 * q[i-1] * (1 - q[i-1] / (0.2 * p[i-1]))) * 0.001;
It's easier to see how the various terms group that way.

Even better would be to replace the numbers with variables:
Code:
q = q_old + (m * q_old * (1 - q_old / (k * p_old))) * delta_t;

Also, I need all values of i because I am going to plot them in gnuplot.
Just redirect the output to a file, and have gnuplot read that file.
 
  • #8
tms said:
I mean space out the equations so they are more readable. Instead of
Code:
q[i] = q[i-1] + (0.1*q[i-1]*(1-q[i-1]/(0.2*p[i-1])))*0.001;
write something like
Code:
q[i] = q[i-1] + (0.1 * q[i-1] * (1 - q[i-1] / (0.2 * p[i-1]))) * 0.001;
It's easier to see how the various terms group that way.

Even better would be to replace the numbers with variables:
Code:
q = q_old + (m * q_old * (1 - q_old / (k * p_old))) * delta_t;

Just redirect the output to a file, and have gnuplot read that file.

I see, I have edited my code using your suggestions. Also, I have redirected the output file to gnuplot and got the following graph (prey vs predator) that I inserted and uploaded below. I varied the parameter ##b## from ##0.01## to ##0.5##. Is that how the graph suppose to look of the Lotka model because the graph I am seeing on google when I search for Lotka model looks different.

Java:
public class Lotka {
    public static void main(String[] args) {
        double[] prey = new double[1000];
        double[] predator = new double[1000];  
        double[] b = new double[101]; //parameter
        prey[0] = 10;
        predator[0] = 5;  
        b[0] = 0.01;   
  
        for (int j = 1; j < 101; j ++) {
            b[j] = b[0] * ((double) j/2);  
        }   
   
        for(int i = 1; i < 100; i++) {
            prey[i] = prey[i-1] + (0.2 * prey[i-1] * (1 - prey[i-1] / 500)
                -(b[i] * prey[i-1] * predator[i-1]) / (1 + b[i] * prey[i-1])) * .001;
            predator[i] = predator[i-1] + (0.1 * predator[i-1] * (1 - predator[i-1]
                /(0.2 * prey[i-1]))) * 0.001;  
            System.out.println("" + predator[i] + " " + prey[i]);
        }  
    }      
}
 

Attachments

  • Screenshot (42).png
    Screenshot (42).png
    2.8 KB · Views: 544
  • #9
It's better, but there are still problems. For one thing, all the parameters, not just b, should be named. (I'm sure Java has a way to name constants, but I don't remember what it is. In C it would be "const double b;" or whatever the variable is. At any rate, if you can't make them constants, make them variables; it is much easier to read and modify that way.)

I don't understand why you made b vary. The parameters should be constant for any particular trial.

In your description, you had ##\Delta t## be 0.1, but in your code it is 0.001. The larger value seems more appropriate, given how little change there is from one iteration to another. With a hundred time more time, you may see a better plot.

You still don't need to save the results of each iteration, since you aren't using them.
 
  • #10
tms said:
It's better, but there are still problems. For one thing, all the parameters, not just b, should be named. (I'm sure Java has a way to name constants, but I don't remember what it is. In C it would be "const double b;" or whatever the variable is. At any rate, if you can't make them constants, make them variables; it is much easier to read and modify that way.)

I don't understand why you made b vary. The parameters should be constant for any particular trial.

In your description, you had ##\Delta t## be 0.1, but in your code it is 0.001. The larger value seems more appropriate, given how little change there is from one iteration to another. With a hundred time more time, you may see a better plot.

You still don't need to save the results of each iteration, since you aren't using them.

I need to vary b because it serves as the interaction rate, so I want to see what happens as we increase ##b##. I noticed that the densities die off when ##b = 0.5## which is why I was varying ##b##.

I had to change delta t because if I left it at ##0.1## then it wouldn't converge which is why i changed it to ##0.001##.
 
  • #11
If you want to vary ##b## like that, you have to run different trials, each with a different value of ##b##. In anyone trial, ##b## must stay the same (unless, of course, a varying ##b## is part of your model, which it isn't here).

Regarding ##\Delta t##, I don't know what you mean by "converge". If you want to keep it at it's current value, then you will need many more iterations per trial.
 
  • #12
tms said:
If you want to vary ##b## like that, you have to run different trials, each with a different value of ##b##. In anyone trial, ##b## must stay the same (unless, of course, a varying ##b## is part of your model, which it isn't here).

Regarding ##\Delta t##, I don't know what you mean by "converge". If you want to keep it at it's current value, then you will need many more iterations per trial.

I see, thank you!
 

1. What is the Lotka-Volterra model?

The Lotka-Volterra model, also known as the predator-prey model, is a mathematical model used to describe the dynamics of predator-prey relationships in an ecosystem. It was developed by Alfred J. Lotka and Vito Volterra in the early 20th century.

2. What is Euler's Method?

Euler's Method is a numerical method used to approximate solutions to differential equations. It involves dividing the interval of time into smaller intervals and using linear approximations to estimate the values of the function at each point.

3. How does Euler's Method relate to the Lotka-Volterra model?

Euler's Method can be used to solve the system of differential equations that make up the Lotka-Volterra model. It allows us to approximate the population sizes of the predator and prey species over time.

4. What are the limitations of the Lotka-Volterra model and Euler's Method?

The Lotka-Volterra model assumes a constant environment and does not take into account external factors such as competition, migration, and environmental changes. Euler's Method may also introduce errors in the approximation when the intervals are too large.

5. How can the Lotka-Volterra model and Euler's Method be used in practical applications?

The Lotka-Volterra model and Euler's Method can be used to study and predict the dynamics of predator-prey relationships in real-life ecosystems. They can also be used to analyze data and make predictions about population sizes and sustainability in conservation efforts.

Similar threads

  • Advanced Physics Homework Help
Replies
1
Views
911
  • Advanced Physics Homework Help
Replies
3
Views
889
Replies
27
Views
2K
  • Advanced Physics Homework Help
Replies
3
Views
800
Replies
19
Views
1K
  • Advanced Physics Homework Help
2
Replies
36
Views
2K
  • Advanced Physics Homework Help
Replies
5
Views
1K
  • Quantum Physics
Replies
31
Views
2K
  • Advanced Physics Homework Help
Replies
1
Views
811
Replies
3
Views
596
Back
Top