# Capacité 4 : PROPAGATION D'UN PAQUET D'ONDES
######################################################################################
# 1) PROPAGATION D'UN PAQUETS D'ONDES GAUSSIEN DANS UN MILIEU NON DISPERSIF

import numpy as np
import matplotlib.pyplot as plt

# Spectre en pulsation w du paquet d'ondes gaussien 

def A(w):
    return np.exp(-(w-w0)**2/(2*sigma**2))
    
wmin = 0                # Pulsation minimale
wmax = 10               # Pulsation maximale
w0 = 5                  # Pulsation centrale
sigma = 0.35            # Paramètre caractéristique de la largeur du spectre

N = 1000                # Choix du nombre de valeurs de w           

w = np.linspace(wmin,wmax,N)    # Plage de variation de w

plt.plot(w,A(w))
plt.xlabel('pulsation w')
plt.ylabel('amplitude',rotation=0)  
plt.title("Spectre du paquet d'ondes")
plt.grid()
plt.show()
plt.pause(5)            # Temps d'affichage de la courbe  
plt.clf()               # Effacement de la courbe

# Expression du paquet d'ondes

def paquet(x,t):
    sum = 0
    for w in np.linspace(wmin,wmax,N):
        sum = sum + A(w)*np.cos(w*t-k(w)*x)
    return sum

# Relation de dispersion

def k(w):                  # k = w/c dans un milieu non dispersif
    return(w/c)

c = 1                      # Célérité des ondes
    
# Enveloppe du paquet d'ondes    
    
def env(x,t):
    sum = 0
    for w in np.linspace(wmin,wmax,N):
        sum = sum + A(w)*np.cos((w-w0)*(t-x/c))
    return sum        
    
# Plage d'abscisses pour les tracés 

x=np.linspace(-10,50,1000)

# Tracé du paquet d'ondes à t = 0

plt.axis([-10,50,-100,100])
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,0.25):            # t varie de 0 à 30 avec un pas de 0.25

    plt.clf()                             # Effacement de l'image précédente  
    plt.axis([-10,50,-100,100])
    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(x,env(x,t),'r',linewidth=0.5)
    plt.plot(x,-env(x,t),'r',linewidth=0.5)
    plt.plot(c*t,paquet(c*t,t),'or')     # Tracé du point situé en x = 0 à t = 0
    plt.grid()
    plt.pause(0.01)
#######################################################################################