[Calcul scientifique / technique par Python] Solution numérique d'équations d'ondes unidimensionnelles et bidimensionnelles par méthode FTCS (méthode explicite), équations aux dérivées partielles bi-courbes

introduction

La vibration transmise à travers la substance / l'espace lui-même (le milieu) qui se propage dans l'espace est généralement appelée mouvement d'onde ou d'onde [1]. Les ondes élastiques et le mouvement des fluides correspondent aux ondes mécaniques et les ondes électromagnétiques correspondent aux ondes électromagnétiques. L'équation satisfaite par la quantité physique $ u (x, y, z, t) $ qui vibre dans le milieu est l'équation d'onde.

** Dans cet article, Python est utilisé pour créer une équation d'onde bidimensionnelle (équation différentielle partielle bicurvée) ** $\frac{1}{c^2}\frac{\partial^2 u}{\partial t^2} = \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} $

Résolution ** par la méthode FTCS (Forward in Time and Centered Difference method) [Addendum], qui est un schéma de différence de la méthode explicite **

Notez qu'en dérivant la dynamique de cette équation, on suppose l'hypothèse d'une vibration infime et l'uniformité et la nature isotrope du milieu qui transmet l'onde (la vitesse de phase c est une constante).

Contenu

(1) Équation d'onde bidimensionnelle

Résolvez l'équation d'onde bidimensionnelle par la méthode FTCS, qui est un schéma de différence explicite. Les conditions de calcul sont les suivantes.

De plus, le calcul nécessite des informations sur la vague $ u $ dans le pas t = 1. Dans cette simulation, la condition initiale 2 a été évaluée en utilisant le résultat obtenu par différence de centre [4].

d.png Figure 1. Comme condition initiale, la gaussienne est installée au centre du carré.


(2) Équation d'onde unidimensionnelle

$\frac{1}{c^2}\frac{\partial^2 u}{\partial t^2} = \frac{\partial^2 u}{\partial x^2} $ Résolvez avec la méthode FTCS.

La condition aux limites est $ u = 0 $ (extrémité fixe) au point final. La condition initiale est $ \ frac {\ partial u} {\ partial t} = 0 \ (t = 0) $ (la vitesse initiale est 0).

Les conditions initiales de la forme d'onde sont indiquées dans la figure ci-dessous.

ini.png

Figure 2. Forme d'onde initiale


Code de calcul (1) Équation d'onde bidimensionnelle

#%matplotlib nbagg
"""
2D Wave Equation
Milieu uniforme:La vitesse de phase est constante dans le temps et dans l'espace
Méthode FTCS
"""

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import ArtistAnimation #Importer des méthodes pour créer des animations


c=1
print ("c=",c)
Lx = 1 #longueur[m]
Ly = 1
t_max = 0.5

Nx = 41
Ny =41

delta_x = Lx/Nx
delta_y = Ly/Ny
delta_t=(1/(1/delta_x+1/delta_y))/c*0.5 #Largeur du pas de temps. Prenez-le petit, cependant.

print("delta_t=",delta_t)

Nt = int(t_max/delta_t)
 

print("Nt=",Nt)

stx=delta_x/delta_t
sty=delta_y/delta_t



u =  np.empty((Nx,Ny,Nt),dtype=float)

#condition limite
u[0,:,:], u[-1,:,:] , u[:,0,:] , u[:,-1,:] = 0, 0, 0, 0

#Conditions initiales
for i in range (Nx) :
    for ii in range(Ny):
        u[i,ii,0]  = (np.exp(-((i*delta_x-Lx/2)**2+(ii*delta_y-Ly/2)**2)/0.01))  #Conditions initiales. Installation de la fonction de distribution gaussienne.

#Hado u[i,ii,1]Calcul à faire. Il est obtenu en centrant la condition initiale 2.
for i in range(1,Nx-1): 
    for ii in range(1,Ny-1):
        u[i,ii,1]= u[i,ii,0]+0.5*((delta_t/delta_x)**2)*(c**2)*(u[i+1,ii, 0]+u[i-1, ii,0]-2*u[i,ii,0])\
+0.5*((delta_t/delta_y)**2)*(c**2)*(u[i,ii+1, 0]+u[i,ii-1, 0]-2*u[i,ii,0])


# #Boucle pour le développement temporel du mouvement des vagues
for j in range(1,Nt-1):
    for i in range(1,Nx-1):
        for ii in range(1,Ny-1):
            u[i,ii, j+1] = 2*u[i,ii,j]-u[i,ii,j-1]+((c/stx)**2)* (u[i+1,ii,j]+u[i-1,ii,j]\
-2*u[i,ii,j])+((c/sty)**2)* (u[i,ii+1,j]+u[i,ii-1,j]-2*u[i,ii,j]) 
       

Le code suivant est utilisé pour visualiser la fonction d'onde obtenue u [x, y, t]. Il est tracé dans l'affichage filaire [3] et le résultat est animé.

#Programme de visualisation

%matplotlib nbagg 
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as animation #Importer des méthodes pour créer des animations

fig = plt.figure(figsize = (8, 6))
ax = fig.gca(projection='3d')

x=list(range(Nx))
y=list(range(Ny))
X, Y = np.meshgrid(x,y)

def update(i,u,fig_title):
    if i != 0:
        ax.clear()
    ax.view_init(elev=60., azim=60.) #Réglage de l'angle
    #ax.plot_surface(X,Y,u[X,Y,i],rstride=1,cstride=1,cmap='Greys',linewidth=0.3) #Tracé de surface
    ax.plot_wireframe(X,Y,u[X,Y,i],rstride=1,cstride=1,color='blue',linewidth=0.3) #Affichage de trame de fil
    
    ax.set_title(fig_title + 'i=' + str(i))
    ax.set_zlim(-0.4,0.4) #Spécification de la plage de dessin de z
    ax.set_xlabel('X') #étiquette
    ax.set_ylabel('Y')
    ax.set_zlabel('U')


    
    return ax


ani = animation.FuncAnimation(fig,update,fargs = (u,'Wave motion: time step='), interval =1, frames = Nt,blit=False)
fig.show()

ani.save("output.gif", writer="imagemagick")

Résultat (1)

Affiche le résultat animé. On peut voir que l'onde générée en position centrale se propage autour.

output_surface.gif


Code de calcul (2): équation d'onde unidimensionnelle


%matplotlib nbagg
"""
1D Wave Equation
Méthode FTCS

"""

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import ArtistAnimation #Importer des méthodes pour créer des animations


T=40 #tension[N]
rho=0.01 #densité[Kg/m]
c = np.sqrt(T/rho) #Vitesse de phase

print ("c=",c)
Lx = 1 #longueur[m]
t_max = 0.1

Nx = 100

delta_x = Lx/Nx

delta_t=delta_x/c   #Pas de temps maximum qui satisfait la condition de stabilité
#print("delta_t=",delta_t)

Nt = int(t_max/delta_t)
st=delta_x/delta_t 
print("c-st=",c-st) #Vérification des conditions de stabilité(Instable si négatif)

u =  np.zeros([Nx,Nt])

#condition limite
u[0,:] = 0
u[-1,:] = 0

#Conditions initiales
for i in range (Nx) :
    if i <= 0.8*Nx :
        u[i,0]=1.25*i/Nx
    
    else :  
        u[i,0] = 5.0*(1-i/Nx)

for i in range(1,Nx-1): # u[:,1]paramètres de
    u[i,1]  = u[i,0]+0.5*((delta_t/delta_x)**2)*(c**2)*(u[i+1,0]+u[i-1,0]-2*u[i,0])

for j in range(Nt-1):
    for i in range(1,Nx-1):
        u[i,j+1] = 2*u[i,j]-u[i,j-1]+(c**2/st**2)* (u[i+1,j]+u[i-1,j]-2*u[i,j])
        

x=list(range(Nx))
y=list(range(Nt))

X, Y = np.meshgrid(x,y)

def functz(u):
    z=u[X,Y]
    return z

Z = functz(u)
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X,Y,Z, color='r')
ax.set_xlabel('x')
ax.set_ylabel('t')
ax.set_zlabel('U')

plt.show()

Résultat (2) Équation d'onde unidimensionnelle

r1.png Figure 3. Solution d'une équation d'onde unidimensionnelle

Ensuite, le résultat est illustré par une animation.

%matplotlib nbagg 
from matplotlib.animation import ArtistAnimation #Importer des méthodes pour créer des animations

fig = plt.figure()

anim = [] #Une liste pour stocker les données du diagramme para-para dessiné pour l'animation

for i in range(Nt):
    U=list(u[:,i])
    x=list(range(Nx))
    if i % int(Nt*0.01) ==0: 
        im=plt.plot(x,U, '-', color='red',markersize=10, linewidth = 2, aa=True)
        anim.append(im)

anim = ArtistAnimation(fig, anim) #Création d'animation
plt.xlabel('x')
plt.ylabel('U')

fig.show() 
anim.save("t.gif", writer='imagemagick')   #Animation.Enregistrez-le en tant que gif et créez un fichier d'animation gif.

t.gif

Animation de la solution de l'équation d'onde unidimensionnelle


Addenda

(1) Méthode FTCS

La ** méthode FTCS (méthode Forward in Time and Centered Difference) [2] ** dans l'équation différentielle partielle est un schéma simple qui prend la différence directe pour le différentiel temporel et la différence centrale pour le différentiel spatial. ** Facile à mettre en œuvre, mais doit être minuté pour éviter l'instabilité numérique **

(2) La simulation traitée ici ne prend pas en compte l'effet d'amortissement. De plus, la dépendance temps / espace de la vitesse de phase n'est pas prise en compte. Les références [4] en fournissent une explication rudimentaire.


Les références

[1] Yosuke Nagaoka, ["Vibration and Waves"](https://www.amazon.co.jp/%E6%8C%AF%E5%8B%95%E3%81%A8%E6%B3%A2 -% E9% 95% B7% E5% B2% A1-% E6% B4% 8B% E4% BB% 8B / dp / 4785320451) [2] William H. Press, ["Recette numérique en version japonaise de la mer-Recette pour le calcul numérique en langage C"](https://www.amazon.co.jp/%E3%83%8B% E3% 83% A5% E3% 83% BC% E3% 83% A1% E3% 83% AA% E3% 82% AB% E3% 83% AB% E3% 83% AC% E3% 82% B7% E3% 83% 94-% E3% 82% A4% E3% 83% B3-% E3% 82% B7% E3% 83% BC-% E6% 97% A5% E6% 9C% AC% E8% AA% 9E% E7 % 89% 88-C% E8% A8% 80% E8% AA% 9E% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E6% 95% B0% E5% 80% A4% E8 % A8% 88% E7% AE% 97% E3% 81% AE% E3% 83% AC% E3% 82% B7% E3% 83% 94-Press-William-H / dp / 4874085601 / ref = sr_1_1? S = livres & ie = UTF8 & qid = 15039997535 & sr = 1-1 & mots-clés =% E3% 83% 8B% E3% 83% A5% E3% 83% BC% E3% 83% A1% E3% 83% AA% E3% 82% AB% E3% 83% AB% E3% 83% AC% E3% 82% B7% E3% 83% 94) [3] Article Qiita: [Calcul scientifique / technique par Python] Dessin et visualisation de lignes de contour 2D (couleur), etc., matplotlib [4] Rubin H. Landau, ["Computational Physics Application" (traduction)](https://www.amazon.co.jp/%E8%A8%88%E7%AE%97%E7%89% A9% E7% 90% 86% E5% AD% A6-% E5% BF% 9C% E7% 94% A8% E7% B7% A8-Landau-Rubin-H / dp / 4254130872 / ref = sr_1_2? S = livres & ie = UTF8 & qid = 15039997611 & sr = 1-2 & keywords = Landau + calcul + physique)

Recommended Posts

[Calcul scientifique / technique par Python] Solution numérique d'équations d'ondes unidimensionnelles et bidimensionnelles par méthode FTCS (méthode explicite), équations aux dérivées partielles bi-courbes
[Calcul scientifique / technique par Python] Solution numérique d'une équation de conduction thermique non stationnaire unidimensionnelle par méthode Crank-Nicholson (méthode implicite) et méthode FTCS (méthode de solution positive)
[Calcul scientifique / technique par Python] Solution numérique d'une équation différentielle ordinaire du second ordre, problème de valeur initiale, calcul numérique
[Calcul scientifique / technique par Python] Solution numérique d'un problème d'oscillateur harmonique unidimensionnel par vitesse Méthode de Berle
[Calcul scientifique / technique par Python] Solution numérique de l'équation de Laplace-Poisson bidimensionnelle pour la position électrostatique par la méthode Jacobi, équation aux dérivées partielles elliptiques, problème des valeurs aux limites
[Calcul scientifique / technique par Python] Résolution de l'équation différentielle ordinaire du second ordre par la méthode Numerov, calcul numérique
[Calcul scientifique / technique par Python] Solution numérique d'équations différentielles ordinaires du premier ordre, problème de valeur initiale, calcul numérique
[Calcul scientifique / technique par Python] Solution numérique du problème des valeurs propres de la matrice par multiplication de puissance, algèbre linéaire numérique
[Calcul scientifique / technique par Python] Calcul numérique pour trouver la valeur de la dérivée (différentielle)
[Calcul scientifique / technique par Python] Résolution du problème de la valeur aux limites des équations différentielles ordinaires au format matriciel, calcul numérique
[Méthode de calcul numérique, python] Résolution d'équations différentielles ordinaires par la méthode Eular
[Calcul scientifique / technique par Python] Résolution d'équations linéaires simultanées, calcul numérique, numpy
[Calcul scientifique / technique par Python] Calcul de somme, calcul numérique
[Calcul scientifique / technique par Python] Résolution d'équations différentielles ordinaires, formules mathématiques, sympy
[Calcul scientifique / technique par Python] Interpolation de Lagrange, calcul numérique
[Calcul scientifique / technique par Python] Dérivation de solutions analytiques pour équations quadratiques et cubiques, formules, sympy
[Calcul scientifique / technique par Python] Comparaison des vitesses de convergence de la méthode SOR, de la méthode Gauss-Seidel et de la méthode Jacobi pour l'équation de Laplace, équation différentielle partielle, problème des valeurs aux limites
[Calcul scientifique / technique par Python] Solution analytique sympa pour résoudre des équations
[Calcul scientifique / technique par Python] Résolution de l'équation de Newton unidimensionnelle par la méthode Runge-Kutta du 4ème ordre
[Python] Calcul numérique d'une équation de diffusion thermique bidimensionnelle par méthode ADI (méthode implicite de direction alternative)
[Calcul scientifique / technique par Python] Fonctionnement de base du tableau, numpy
[Calcul scientifique / technique par Python] Intégration Monte Carlo, calcul numérique, numpy
[Calcul scientifique / technique par Python] Liste des matrices qui apparaissent dans Hinpan en algèbre linéaire numérique
[Calcul scientifique et technique par Python] Dessin de figures fractales [Triangle de Shelpinsky, fougère de Bernsley, arbre fractal]
[Calcul scientifique / technique par Python] Vague "gémissement" et vitesse de groupe, superposition des vagues, visualisation, physique du lycée
[Calcul scientifique / technique par Python] Intégration numérique, loi trapézoïdale / Simpson, calcul numérique, scipy
[Calcul scientifique / technique par Python] Marche aléatoire 2D (problème de marche ivre), calcul numérique
[Calcul scientifique / technique par Python] Simulation de Monte Carlo par la méthode metropolis de la thermodynamique du système de spin ascendant 2D
[Calcul scientifique / technique par Python] différentiel (biaisé), formule mathématique, sympy
Calcul scientifique / technique avec Python] Dessin et visualisation d'isoplans 3D et de leurs vues en coupe à l'aide de mayavi
[Calcul scientifique / technique par Python] Ajustement par fonction non linéaire, équation d'état, scipy
[Calcul scientifique / technique par Python] Calcul du produit de la matrice par l'opérateur @, python3.5 ou supérieur, numpy
L'histoire du calcul numérique des équations différentielles avec TensorFlow 2.0
[Calcul scientifique / technique par Python] Résolution de l'équation de Schrödinger unidimensionnelle à l'état stationnaire par méthode de tir (1), potentiel de type puits, mécanique quantique
[Calcul scientifique / technique par Python] Dessin d'animation de mouvement parabolique avec locus, matplotlib
[Calcul scientifique / technique par Python] Dessin de surface courbe 3D, surface, fil de fer, visualisation, matplotlib
[Calcul scientifique / technique par Python] Calcul de matrice inverse, numpy
[Calcul scientifique / technique par Python] histogramme, visualisation, matplotlib
Calcul des indicateurs techniques par TA-Lib et pandas
[Calcul scientifique / technique par Python] Résolution d'une équation de Schrödinger unidimensionnelle en régime permanent par méthode de tir (2), potentiel d'oscillateur harmonique, mécanique quantique
[Calcul scientifique / technique par Python] Tracé, visualisation, matplotlib de données 2D lues à partir d'un fichier
Calcul numérique du fluide compressible par la méthode des volumes finis
[Calcul scientifique / technique par Python] Graphique logistique, visualisation, matplotlib
Résolution d'une équation d'onde unidimensionnelle par la méthode de la différence (Python)
[Calcul scientifique / technique par Python] Graphique de coordonnées polaires, visualisation, matplotlib
[Calcul scientifique / technique par Python] Liste des utilisations des fonctions (spéciales) utilisées en physique en utilisant scipy
[Calcul scientifique / technique par Python] Interpolation spline de troisième ordre, scipy
Python - Solution numérique d'équation différentielle Méthode d'Euler et méthode de différence centrale et méthode Rungekutta