# -*- coding: Latin-1 -*- # Programme de résolution de l'équation d'Alembert # par différences finies # Dominique Lefebvre pour TangenteX.com # 20 novembre 2016 # # importation des librairies from scipy import meshgrid,zeros,linspace,dot, sin, pi import matplotlib.pyplot as plt import matplotlib.animation as animation # Routine de construction de la matrice tridiagonale A def MatDiag(n): M = zeros((n+1,n+1),float) for i in range(1,n): M[i,i-1], M[i,i], M[i,i+1] = 1,-2,1 # coefficients diagonaux M = Alpha*M return M # Fonctions de définition de la configuration initiale de l'onde # la fonction fixant les conditions initiale est arbitraire, ici un sin(x) def Uzero(): U0 = sin(2*pi*X/4.0) return U0 # fonction de définition de la vitesse initiale de l'onde (la dérivée de Uzero) def dUzero(): U1 = zeros(Nx+1) U0 = Uzero() for i in range(1,Nx): U1[i] = U0[i] + (Alpha/2.)*(U0[i+1] - 2*U0[i] + U0[i-1]) U1[0] = U1[Nx] = 0.0 return U1 # Paramètres physiques de la simulation c = 1.0 # célérité de l'onde # Définition du maillage spatial - indice i L = 4.0 # la cavité est dimensionnée pour un mode = 2 dx = 1.0e-2 Nx = int(L/dx) X = linspace(0,L,Nx+1) # Définition du maillage temporel en respectant CFL = 1 - indice j duree = 2*pi dt = dx/c # application du CFL = 1 Nt = int(duree/dt) T = linspace(0,duree,Nt+1) # Paramètres de calcul Alpha = (c*dt/dx)**2 # Construction de la matrice diagonale du système avec les conditions # aux limites (valeurs aux bords nulles) A = MatDiag(Nx) # Définition de la matrice U U = zeros((Nx+1,Nt+1),float) # Définition des conditions initiales U[:,0] = Uzero() U[:,1] = dUzero() # Calcul de la matrice U résultante for t in range(1,Nt): U[:,t+1] = dot(A,U[:,t]) + 2*U[:,t] - U[:,t-1] # Affichage de la solution fig = plt.figure(figsize=(14,8)) ax = fig.add_subplot(111) ax.set_xlabel('abscisse', fontsize = 16) ax.set_ylabel('amplitude', fontsize = 16) plt.ylim(-1.0,1.0) # préparation de l'animation lines = [] plt.hold("off") for i in range(Nt): p, = plt.plot(X,U[:,i],'k') lines.append([p]) ani = animation.ArtistAnimation(fig,lines,interval=10,blit=True) plt.show()