from math import *
import matplotlib.pyplot as plt

from scipy.integrate import odeint

lam=0.15
def Foscill(Y,t):
    (x,v)=Y
    a=-2*lam*v-x # ω0=1
    return (v,a)

N=500
tMax=10
tList=[i*tMax/(N-1) for i in range(N)] # on peut diviser par N...

# Aucune mdification de code ici : on reste en 2D
def euler2D(F,Y0,tList):
    # pas forcément le même tList que la var globale :
    # sa longeur n'est pas connue
    N=len(tList)
    res=[Y0]
    Yk=Y0 # variable de boucle
    for k in range(N-1):
        xk,yk=Yk
        tk=tList[k]
        tkp1=tList[k+1]
        dt=tkp1-tk
        dx,dy=F(Yk,tk)
        # on modifie la var de boucle
        Yk=[xk+dx*dt, yk+dy*dt]
        # et on la stocke surtout !!
        res.append(Yk)
    return res

# aucune différence à part le nom des arguments
def resoutOscill(x0,v0,solveur=odeint):
    xList=[0]*N
    vList=[0]*N # donne [0,0,...,0] N fois

    # 3 arguments, les CI sont un vecteur 2D
    # solveur vaut PAR DEFAUT odeint
    toutLeBazar = solveur(Foscill,(x0,v0),tList)

    for i in range(N): # la longueur est connue
        xList[i],vList[i]=toutLeBazar[i] # on peut aussi coder ...[i][0]

    return (xList,vList)

xList,vList=resoutOscill(1,0)
# 2 courbes = 2 appels à plot, le show() à la fin
# on doit appeler plt.legend() pour afficher les labels
plt.plot(tList,xList,'b-',label='Position')
plt.plot(tList,vList,'r-',label='Vitesse')
plt.legend()
plt.show()

