Simuler la propagation d'une onde

Programme de première générale - Enseignement de spécialité - 2019

"Simuler à l’aide d’un langage de programmation, la propagation d’une onde périodique".

Principe

Le but est de simuler la propagation d'une onde sinusoïdale dans le sens des \(x\) croissants à partir de sa célérité \(c\) :

\[s(x, t) = A \cdot \cos[\dfrac{2\pi}{T} (t-\dfrac{x}{c})]\]

ou de sa longueur d'onde \(\lambda\) :

\[s(x, t) = A \cdot \cos[2\pi (\dfrac{t}{T}-\dfrac{x}{\lambda})]\]

Y mettre en évidence :

  • la période temporelle \(T\) ;

  • la période spatiale \(\lambda\) ;

  • la célérité \(c = \dfrac{\lambda}{T}\).

Exemple : animation avec pause par un clic de la souris

Cet exemple propose une animation de la propagation d'un onde sinusoïdal à partir de sa période temporelle \(T\) et de sa célérité \(c\).

Un clic de la souris sur la figure permet de stopper ou de reprendre l'animation.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from math import pi

# PARAMETRES DE L'ONDE A MODIFIER
T = 1     # (s)   Période
c = 1     # (m/s) Célérité
A = 2     # (m)   Amplitude

# PARAMETRES DU TRACÉ
nb_t = 1000  # Nombre de valeurs de temps
Dt = 0.01    # Pas d'incrémentation du temps

nb_x = 200   # Nombre de valeurs de x
x_max = 4    # Valeur maximale de x

# TABLEAU DE VALEURS DE x
x = np.linspace(0, x_max, nb_x)

# PAUSE/LECTURE DE L'ANIMATION (clic de la souris sur la courbe)
pause = True
def onClick(event):
   global pause
   if pause:
      ani.event_source.stop()
      pause = False
   else:
      ani.event_source.start()
      pause = True

# FONTION D'ANIMATION : calcul du signal sinusoïdal
def actualise_onde(i):
   t = i * Dt                                      # Calcul de l'instant t en cours
   y = A * np.sin(2*np.pi/T*(t - x/c))             # Calcul de l'onde en fonction de x à l'instant t en cours
   courbe.set_data(x, y)                           # Actualise le tracé de la courbe
   text.set_text("t = " + str(round(t,1)) + " s")  # Actualise l'affichage du temps
   return courbe, text

# FIGURE
fig, ax = plt.subplots()                              # Initialise une figure et récupère le repère (ax)
fig.canvas.mpl_connect('button_press_event', onClick) # Activation de la gestion du clic de la souris
text = fig.text(0.5,0.90, "")                         # Zone de text pour afficher le temps

courbe, = plt.plot([],[])                             # Initialise un tracé vide et récupère la référence de la courbe.

plt.grid()              # Affiche la grille
plt.xlim(0, x_max)      # Echelle sur l'axe des x
plt.xlabel("x (m)")     # Légende sur l'axe des x
plt.ylim(-1.2*A, 1.2*A) # Echelle sur l'axe des y
plt.ylabel("y (m)")     # Légende sur l'axe des y

ani = animation.FuncAnimation(fig, actualise_onde, frames=nb_t, interval=10, repeat=False) # Active l'animation

plt.show()  # Affiche la courbe
Résultats

Animation propagation onde
Questionnement

  • Déterminer la longueur d'onde \(\lambda\).

  • Est-elle en accord avec les paramètres du programme ?

  • Modifier le programme pour une animation à partir de la fréquence \(f\) plutôt que la période \(T\).