################################
#PARAMETRES POUR UTILISATION NORMALE
###################################
fen_abs=6.5
fen_ord=4.5
taille_cara=10
larg_trait=1
taille_mark=4

########################
#PARAMETRES POUR LIVRE DUNOD
##############################
fen_abs=18  #18 
fen_ord=12  #12
taille_cara=30   #30
larg_trait=4      #4
taille_mark=15    #15




import numpy as np               #bibliothèque numpy renommée np
import matplotlib.pyplot as plt  #module matplotlib.pyplot renommé plt


#définition des fonctions d'onde
def F1(omega, t):  #onde sinusoïdale
    y=np.cos(omega*t)
    return y

def F2(omega, t): #onde gaussienne
    sigma=0.3        #écart-type de la gaussienne
    y=1/(sigma*np.sqrt(2*np.pi))*\
    np.exp(-t**2/(2*sigma**2))*np.cos(omega*t)
    return y

#choix de l'étude
choix=2

if choix==1:  #deux OPPM
    N=500
    c=2
    f2=5.25
    f1=4.75
    omega1=2*np.pi*f1
    omega2=2*np.pi*f2
    omega0=(omega1+omega2)/2
    deltaomega=omega2-omega1
    lambda1=c/f1
    lambda2=c/f2
    print("Longueur d'onde 1 =",lambda1)
    print("Longueur d'onde 2 =",lambda2)
    
    
    x=np.linspace(-6, 6, N) #N valeurs entre -6 inclus et 6 inclus
    
    t=0
    y=F1(omega1, t-x/c)+F1(omega2, t-x/c)
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, y)
    plt.title("Fonction d'onde à t = 0")
    plt.plot(x,2*np.cos(2*np.pi*x/8),linewidth=4)
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran

    t=0.5
    y2=2*np.cos(deltaomega/2*(t-x/c))
    y=F1(omega1, t-x/c)+F1(omega2, t-x/c)
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, y)
    plt.title("Fonction d'onde à t = 0,5 s")
    plt.plot(x,y2,linewidth=4)
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran
   
   

elif choix==2:  #onde gaussienne
    N=500
    f=5
    omega=2*np.pi*f   
    c=2               #célérité de l'onde    

    x=np.linspace(-1, 6, N) #N valeurs entre -1 inclus et 6 inclus
    t=0
    y0=F2(omega, t-x/c)
    
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, y0)
    plt.title("Fonction d'onde à t = 0")
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran

    t=2
    y1=F2(omega, t-x/c)    
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, y0)
    plt.title("Fonction d'onde à t=0 et à t=2 s")
    plt.plot(x, y1, color='red')
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran


 
elif choix==3:  #paquet d'ondes
    def k(omega):
        omegac=0.7
        c=1
        return np.sqrt(omega**2-omegac**2)/c
    
    def F3(x, t):
        #on intègre entre omega1 et omega2
        #np.cos(omega * t - k (omega) * x) d_omega
        
        #méthode des rectangles
        y=0
        omega0=1 #pulsation centrale
        delta=0.3  #largeur en pulsation
        omega1=omega0-delta/2
        omega2=omega0+delta/2
        n=1000  #nombre de rectangles
        d_omega=(omega2-omega1)/n
        for i in range(n):#i varie entre 0 inclus et n
                   #n rectangles
            omega=omega1+i*d_omega
            y=y+np.cos(omega*t-k(omega)*x)*d_omega*\
            np.exp(-4*(omega-omega0)**2)
        return y
    
    N=500
    x=np.linspace(-30, 300, N)  #N valeurs entre -30 inclus et 300 inclus
    g0=F3(x, 0)
    g1=F3(x, 150)  
    g2=F3(x, 300) 
    
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, g0)
    plt.title("Fonction d'onde à t = 0")
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran


    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    #plt.plot(x, y0)
    plt.title("Fonction d'onde à t = 300 s")
    plt.plot(x[int(0.55*N):int(0.92*N)], g2[int(0.55*N):int(0.92*N)], color='red')
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran
 
 
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, g0)
    plt.plot(x, g1)
    plt.title("Fonction d'onde à t=0, 150 et 300 s")
    plt.plot(x, g2, color='green')
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran


    x1=0
    t=np.linspace(-50, 50, N)
    y3=F3(x1, t)
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(t, y3)
    plt.title("Fonction d'onde pour x ="+str(x1))
    plt.xlabel("t")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran

elif choix==10:  #deux OPPM avec vitesse de phase et vitesse de groupe
    N=500
    F=F1
    vphi=2
    vg=2
    f2=5.25
    f1=4.75
    omega1=2*np.pi*f1
    omega2=2*np.pi*f2
    omega0=(omega1+omega2)/2
    deltaomega=omega2-omega1
    lambda1=vphi/f1
    lambda2=vphi/f2
    print("Longueur d'onde 1 =",lambda1)
    print("Longueur d'onde 2 =",lambda2)
    
    
    x=np.linspace(-6, 6, N)
    
    t=0
    y=F(omega1, t-x/vphi)+F(omega2, t-x/vphi)
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, y)
    plt.title("Fonction d'onde à t = 0")
    plt.plot(x,2*np.cos(2*np.pi*x/8),linewidth=4)
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran

    t=0.5
    y2=2*np.cos(deltaomega/2*(t-x/vg))
    y=F(omega1, t-x/vphi)+F(omega2, t-x/vphi)
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, y)
    plt.title("Fonction d'onde à t = 0,5 s")
    plt.plot(x,y2,linewidth=4)
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran


elif choix==11:  #OPPM
    N=500
    f0=2
    omega0=2*np.pi*f0  
    c=2               #célérité de l'onde
    lambda0=c/f0
    print("Longueur d'onde =",lambda0)
    F=F1
    x=np.linspace(-3, 3, N)
    t=0
    y0=F(omega0, t-x/c)
    
    t=0
    y1=F(omega0, t+x/c)
    
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, y0)
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran
    
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, y0+y1, color='red')
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran


elif choix==12:  #paquet d'ondes TESTS
    def k(omega):
        return np.sqrt(omega)
    
    def F3(x, t):
        #on intègre entre omega1 et omega2
        #np.cos(omega * t - k (omega) * x) d_omega
        
        #méthode des rectangles
        y=0
        omega0=1.4  #pulsation centrale
        delta=0.5   #largeur en pulsation
        omega1=omega0-delta/2
        omega2=omega0+delta/2
        Npts=1001  #1001 points donc 1000 rectangles
        d_omega=(omega2-omega1)/(Npts-1)
        for i in range(Npts-1):
                   #N points et N-1 rectangles
            omega=omega1+i*d_omega
            y=y+np.cos(omega*t-k(omega)*x)*d_omega*\
            1#*np.exp(-20*(omega-omega0)**2)
        return y
    
    N=500
    x=np.linspace(-50, 500, N)  #N valeurs entre -30 inclus et 300 inclus
    g0=F3(x, 0)
    g1=F3(x, 75)  
    g2=F3(x, 180) 
    
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, g0)
    plt.title("Fonction d'onde à t = 0")
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran


    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    #plt.plot(x, y0)
    plt.title("Fonction d'onde à t = 300 s")
    plt.plot(x[int(0.55*N):int(0.95*N)], g2[int(0.55*N):int(0.95*N)], color='red')
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran
 
 
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, g0)
    plt.plot(x, g1)
    plt.title("Fonction d'onde à t=0, 150 et 300 s")
    plt.plot(x, g2, color='green')
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran


    x1=0
    t=np.linspace(-50, 50, N)
    y3=F3(x1, t)
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(t, y3)
    plt.title("Fonction d'onde pour x ="+str(x1))
    plt.xlabel("t")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran

elif choix==13:  #paquet d'ondes TESTS
    def k(omega):
        omegac=0.7
        c=1
        return np.sqrt(omega**2-omegac**2)/c
    
    def F3(x, t):
        #on intègre entre omega1 et omega2
        #np.cos(omega * t - k (omega) * x) d_omega
        
        #méthode des rectangles
        y=0
        omega0=1.0   #pulsation centrale
        delta=0.5  #largeur en pulsation
        omega1=omega0-delta/2
        omega2=omega0+delta/2
        Npts=1001  #1001 points donc 1000 rectangles
        d_omega=(omega2-omega1)/(Npts-1)
        for i in range(Npts-1):
                   #N points et N-1 rectangles
            omega=omega1+i*d_omega
            y=y+np.cos(omega*t-k(omega)*x)*d_omega*\
            np.exp(-1*(omega-omega0)**2)
        return y
    
    N=500
    x=np.linspace(-30, 300, N)  #N valeurs entre -30 inclus et 300 inclus
    g0=F3(x, 0)
    g1=F3(x, 150)  
    g2=F3(x, 180) 
    
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, g0)
    plt.title("Fonction d'onde à t = 0")
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran


    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    #plt.plot(x, y0)
    plt.title("Fonction d'onde à t = 150 s")
    plt.plot(x[int(0.35*N):int(0.65*N)], g1[int(0.35*N):int(0.65*N)], color='orange')
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran
    

    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    #plt.plot(x, y0)
    plt.title("Fonction d'onde à t = 180 s")
    plt.plot(x[int(0.45*N):int(0.75*N)], g2[int(0.45*N):int(0.75*N)], color='red')
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran
 
 
    plt.figure(figsize=(8, 8)) #nouvelle fenêtre graphique
    plt.plot(x, g0)
    plt.plot(x, g1)
    plt.title("Fonction d'onde à t=0, 150 et 300 s")
    plt.plot(x, g2, color='green')
    plt.xlabel("x")
    plt.grid()                 #affichage de la grille
    plt.show()                 #affiche la figure à l'écran


