Modelo de Lotka - Volterra en Python

El modelo de Lotka - Volterra es un sistema de dos ecuaciones diferenciales no lineales en el que se intenta modelar la interacción entre los depredadores y las presas en un determinado ecosistema respectivamente. 

$${\Large \begin{align*} \frac{dx}{dt} &= x(a - b y) \hspace{1.2cm},\hspace{0.2cm} x(0) = x_{0} \\ \frac{dy}{dt} &= y(dx - c) \hspace{1.2cm},\hspace{0.2cm} y(0) = y_{0} \end{align*} }$$

Donde:

y(t) es el depredador
x(t) es la presa
t es el tiempo
a = taza de crecimiento de las presas
c = taza de crecimiento de los depredadores
b = taza de muerte de los depredadores 
d = taza de caza de los depredadores 

En este sistema de ecuaciones diferenciales no se puede obtener una solución analítica x(t) y y(t) debido a que es un sistema no lineal. Por consiguiente este problema se debe analizar mediante el análisis numérico.

Antes de crear el código fuente es necesario que se importan algunas librerías correspondientes para compilar este código.

import numpy as np
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt

np.seterr(divide='ignore', invalid='ignore')

Ahora iniciaremos el código respectivamente

Código Fuente del Modelo de Lotka - Volterra

def mlv(t0, tn, x0, y0, a, b, c, d):
    
    """ t0 = es el tiempo inicial
        tn 0 es el tiempo final
        n es el número de pasos
        [x0, y0] es la condicion inicial 
        [a,b,c,d] son las constantes del modelo de lotka - volterra"""
    
    
    fig, ((ax1, ax2)) = plt.subplots(1,2)
    fig.set_size_inches(20,8)
    
    f1 = lambda t,x,y: a*x - b*y*x
    f2 = lambda t,x,y: -c*y + d*y*x
    
    t = np.linspace(t0, tn, 500*tn +1)
    x = np.zeros(500*tn +1)
    y = np.zeros(500*tn +1)
    x[0] = x0
    y[0] = y0
    h = (tn-t0)/(500*tn)
    for i in range(1,500*tn +1):
        x[i] = x[i-1] + h*f1(t[i-1], x[i-1], y[i-1])
        y[i] = y[i-1] + h*f2(t[i-1], x[i-1], y[i-1])


    ax1.plot(t, x, lw = 3, color = 'r', label = "Presa")
    ax1.plot(t, y, lw = 3, color = 'b', label = "Depredador")
    ax1.set_xlabel('Tiempo', size = 20) 
    ax1.set_ylabel('Población', size = 20) 
    ax1.set_title("Presa y Depredador en función del tiempo", size=20)
    ax1.legend(fontsize = 20)
    ax1.grid()

    ax2.plot(x, y, lw = 3, color="black", label="Atractor")
    ax2.plot(c/d, a/b, lw = 6, marker="o", color="black", markersize = 20)
    ax2.set_xlabel('Presa', size = 20)
    ax2.set_ylabel('Depredador', size = 20) 
    ax2.set_title("Depredador en función de la Presa", size=20)
    ax2.legend(fontsize = 20)
    ax2.grid()
    
    u = np.linspace(0, max(x), 20)
    v = np.linspace(0, max(y), 20)

    U, V = np.meshgrid(u, v)
    
    Ux = U*(1 - (b/a)*V) / np.sqrt((U*(1 - (b/a)*V))**2 + (V*((d/c)*U - 1))**2)
    Vy = V*((d/c)*U - 1) / np.sqrt((U*(1 - (b/a)*V))**2 + (V*((d/c)*U - 1))**2)
    
    ax2.quiver(U,V,Ux,Vy)
    
    plt.suptitle('Modelo Lotka - Volterra', fontsize=25, size=20)
    
    plt.subplots_adjust(left=0.125,
                    bottom=0.1, 
                    right=0.9, 
                    top=0.9, 
                    wspace=0.15, 
                    hspace=0.35)

    return mlv

 

Aplicación del código fuente

  • Cuando la población de las presas es mayor que la población de los depredadores 
$${\large \begin{align*} \frac{dx}{dt} &= x(0.4 - 0.2 y) \hspace{1.2cm},\hspace{0.2cm} x(0) = 10 \\ \frac{dy}{dt} &= -y(0.3 - 0.05 x) \hspace{1.2cm},\hspace{0.2cm} y(0) = 4 \end{align*} }$$


mlv(0,250,10,4, 0.4, 0.37, 0.3, 0.05)


Simulación del Modelo Lotka - Volterra


Superficie del Modelo Lotka Volterra




Comentarios