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\) :
ou de sa longueur d'onde \(\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

- 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\).