# Capacité 4 : PROPAGATION D'UN PAQUET D'ONDES
####################################################################################################
# PROPAGATION D'UN PAQUETS D'ONDES BICHROMATIQUE DANS UN MILIEU DISPERSIF

import numpy as np
import matplotlib.pyplot as plt

# Constantes

A = 1                      # Amplitude des deux ondes
w = 5                      # Pulsation de la première onde
dw = 0.5                   # Pulsation w + dw pour la deuxième onde (dw << w)

# Expression du paquet d'ondes

def paquet(x,t):
    return A*np.cos(w*t-k(w)*x) + A*np.cos((w+dw)*t-k(w+dw)*x)

# Relation de dispersion de Klein-Gordon : k² = (w² - wp²)/c²

c = 1 
wp = 4
def k(w):
    return np.sqrt(w**2-wp**2)/c    
 
# Enveloppe du paquet d'ondes (obtenue après transformation de la somme de cos en un produit de cos)     
    
def env(x,t):
    return 2*A*np.cos(dw*t/2-(k(w+dw)-k(w))*x/2)        

# Plage d'abscisses pour les tracés
  
x=np.linspace(0,30,1000)

# Tracé du paquet d'ondes à t = 0

plt.axis([0,30,-2.5,2.5])
plt.xlabel('abscisse x')
plt.ylabel('s(x,0)',rotation=0)  
plt.title("Paquet d'ondes s(x,0)")
plt.plot(x,paquet(x,0),'b')
plt.plot(x,env(x,0),'r',linewidth=0.5)
plt.plot(x,-env(x,0),'r',linewidth=0.5)
plt.grid()
plt.show()
plt.pause(5)   

# Propagation du paquet d'ondes

vphi = (w+dw/2)/((k(w)+k(w+dw))/2)    # Vitesse de phase vphi = wmoyen/kmoyen
vg = dw / ((k(w+dw)-k(w)))            # Vitesse de groupe vg = dw/dk

for t in np.arange(0,30,0.1):
    
    plt.clf()                         # Effacement de l'image précédente
    plt.axis([0,30,-2.5,2.5])
    plt.xlabel('abscisse x')
    plt.ylabel('s(x,t)',rotation=0)
    plt.title("Paquet d'ondes s(x,t)")  
    plt.plot(x,paquet(x,t),'b')
    plt.plot(vphi*t,paquet(vphi*t,t),'ob')    # Tracé du point signal situé en x = 0 à t = 0
    plt.plot(vg*t,env(vg*t,t),'or')           # Tracé du point enveloppe situé en x = 0 à t = 0
    plt.plot(x,env(x,t),'r',linewidth=0.5)
    plt.plot(x,-env(x,t),'r',linewidth=0.5)
    plt.grid()
    plt.pause(0.01)
###############################################################################################