1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| import numpy as np # Boîte à outils numériques
import pylab as py # Boîte à outils graphiques
from matplotlib import animation # Pour l'animation en temps réel
taille=400 # Largeur en pixels de l'image
lim=10 # Largeur maximale de l'image
x=np.linspace(-lim,lim,taille) # L'axe des x
y=x # Le même en y
X,Y=np.meshgrid(x,y,indexing='xy') # La "grille" sur laquelle seront évaluées les fonctions
y1=3 # Position verticale de la première source
y2=-y1 # Position verticale de la seconde source
r1=np.sqrt(X**2+(Y-y1)**2) # Grille des distances à la première source
r2=np.sqrt(X**2+(Y-y2)**2) # Pareil pour la seconde
w=4*np.pi # Pulsation des oscillations
delta_t=0.01 # Intervalle de temps entre deux images
t=0 # Temps initial
k=1.0*np.pi # Nombre d'onde
a1=1 # Amplitude de la première source
a2=2 # Amplitude de la seconde source
# Calcul de l'amplitude résultante (ne prend pas en compte la décroissance en
# 1/r que devrait avoir les ondes)
S1 = a1*np.cos(k*r1-w*t)
S2 = a2*np.cos(k*r2-w*t)
amplitude= S1 + S2
# Préparation des figures
fig=py.figure(figsize=[16,8],facecolor='w') # Taille globale
fig.add_axes([0.5,0.05,0.45,0.9],aspect='equal') # Figure de droite
image=py.imshow(amplitude, extent = [-lim,lim,-lim,lim]) # La superposition
py.plot([0],y1,'wo',markersize=5) # Position source 1
py.plot([0],y2,'wo',markersize=5) # Position source 2
py.axis([-lim,lim,-lim,lim]) # Avec axes gradués
#py.axis('off') # ou sans (au choix)
fig.add_axes([0.05,0.05,0.4,0.4],aspect='equal') # Figure en bas à gauche
image2=py.imshow(S1, extent =[-lim,lim,-lim,lim]) # Action de S1 seule
py.plot([0],y1,'wo',markersize=5) # Position source 1
py.plot([0],y2,'wo',markersize=5) # Position source 2
py.axis([-lim,lim,-lim,lim]) # Avec axes gradués
fig.add_axes([0.05,0.5,0.4,0.4],aspect='equal') # Figure en haut à gauche
image3=py.imshow(S2, extent = [-lim,lim,-lim,lim]) # Action de S2 seule
py.plot([0],y1,'wo',markersize=5) # Position source 1
py.plot([0],y2,'wo',markersize=5) # Position source 2
#py.axis('off') # ou sans
py.axis([-lim,lim,-lim,lim]) # Avec axes gradués
#py.axis('off') # ou sans
#py.savefig('PNG/S03_interferences_figure_init.png')
def animate(i): # Mise à jour des figures à chaque nouvelle frame
t=i*delta_t # Nouveau temps
print(t) # Feedback en cas de sauvegarde
S1 = a1*np.cos(k*r1-w*t) # Source 1
S2 = a2*np.cos(k*r2-w*t) # Source 2
amplitude= S1 + S2 # Superposition
image.set_data(amplitude) # Mise à jour données superposition
py.title('t=%.2f s'%(t)) # Le titre avec l'instant choisi
image2.set_data(S1) # Mise à jour source 1
image3.set_data(S2) # Mise à jour source 2
# L'animation proprement dite
anim = animation.FuncAnimation(fig,animate,frames=int(3/delta_t),interval=20)
# À décommenter pour sauvegarder dans un fichier .mp4
#anim.save('PNG/S03_interferences_animation.mp4', fps=10)
# Sinon, on montre en direct
py.show() |
Partager