# -*- coding: utf-8 -*-
"""
Created on Fri Oct 11 09:19:30 2024

@author: arnau
"""

import numpy as np
import matplotlib.pyplot as plt


#%% Fonction définissant le système de Lotka-Volterra


def F(x,y):
    return [(1-y)*x,(x-2)*y]

def phi(x,y):
    '''Energie '''
    return x-2*np.log(x)+y-np.log(y)

#%% constantes 

x0=1
y0 = 0.5
T= 20
n = 1000

#%% Méthode d'Euler

def Euler_syst(x0,y0,T,n):
    '''
    Entrées : [0,T] les extremités de l'intervalle de définition d'une solution
              (x0,y0) une condition initiale
              n le nombre de subdivision
    Sortie : une approximation de la solution du système
    sur [0,T] avec la condition initiale respectée
    '''
    h=T/n  # pas 
    X = [x0]
    Y = [y0]
    for _ in range(1,n+1):
        x = X[-1]
        y = Y[-1]
        X.append(x+h*F(x,y)[0])# liste des approximation de x(a+k(b-a)/n)
        Y.append(y+h*F(x,y)[1])# liste des approximation de x(a+k(b-a)/n)
    return [X,Y]

[X,Y] = Euler_syst(x0,y0,T,n)
temps = [k*T/n for k in range(n+1)]
plt.plot(temps,X, ':', label='valeur approchée de x (proies)')
plt.plot(temps,Y,  label='valeur approchée de y (prédateurs)')
plt.legend()
plt.show()


#%% Energie pour Euler 

plt.plot(temps, phi(X,Y))
plt.show()

'''
On devrait en théorie obtenir une fonction constante, ce qui n'est pas le cas ici
'''

#%% Graphe de y en fonction de x

plt.plot(X,Y)
plt.xlabel('x_k')
plt.ylabel('y_k')
plt.show()

'''
Comme x et y sont périodiques de même période on devrait en théorie obtenir une courbe fermée, ce qui n'est pas le cas ici
'''
