# Capacité 4 : PROPAGATION D'UN PAQUET D'ONDES
####################################################################################################
# PROPAGATION D'UN PAQUETS D'ONDES BICHROMATIQUE DANS UN MILIEU NON 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)
c = 1                      # Célérité des ondes

# 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

def k(w):
    return (w/c)           # k = w/c pour un milieu non dispersif
 
# 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

for t in np.arange(0,30.01,0.1):         # t varie de 0 à 30 avec un pas de 0.1

    plt.clf()                            # Effacement de la courbe 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(c*t,paquet(c*t,t),'or')     # Tracé du point situé en x = 0 à t = 0
    plt.plot(x,paquet(x,t),'b')
    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)
#####################################################################################################