#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 13 22:46:08 2024

@author: vincentleprince
"""

import matplotlib.pyplot as plt
import numpy as np

a=0.6 ; b=0.8 ; c=0.6 ; d=0.3 ; 
#ces variables sont considérées comme globales

def F(z):
    x=z[0] ; y=z[1]
    return [a*x-b*x*y, -c*y+d*x*y]   

    
#première version sans numpy
def EulerVectorielle(F,z0,T,N):
    h=float(T)/N
    Z=[z0]
    for i in range(1,N+1):
        x = Z[i-1][0]#valeurs précédentes
        y = Z[i-1][1]
        D = F([x,y])#dérivée vectorielle
        xi = x + h*D[0]
        yi = y + h*D[1]
        Z.append([xi,yi])
    return Z    


#deuxième version avec numpy
def EulerVectorielle2(F,z0,T,N):
    h=float(T)/N
    Z=np.zeros([2,N+1])
    Z[:,0]=z0
    for i in range(1,N+1):
        Z[:,i]=Z[:,i-1]+h*np.array(F(Z[:,i-1]))
    return Z    

    
x0 = 5  ;  y0 = 1
z0 = [x0,y0]
T = 50 ; N = 5000

Sol = EulerVectorielle2(F,z0,T,N)  
X = Sol[0,:]  
Y = Sol[1,:]  
temps = np.linspace(0,T,N+1)

# tracé des trajectoires en fonction du temsp
plt.plot(temps,X,'--')
plt.plot(temps,Y)
plt.xlabel('duree')
plt.ylabel('population')
plt.grid()

#tracé du diagramme de phase
plt.clf()
plt.plot(X,Y)

