| 12
 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() |