Un ejemplo simple de modelado directo de diferencias finitas de la ecuación de onda bidimensional (medio uniforme, sin condiciones de contorno absorbentes y fuente de terremoto)

Importar la configuración del entorno desde el archivo FWI.yml

from IPython.display import Latex
from IPython.display import HTML

Formato de ecuación de onda bidimensional

u t t ( x , y , t ) = u x x ( x , y , t ) + u y y ( x , y , t ) , ( x , y ) ∈ Ω = ( 0 , 1 ) × ( 0 , 1 ) , t ∈ ( 0 , 1.4 ) ( 1 ) u_{tt}(x,y,t)=u_{xx}(x,y,t)+u_{yy}(x,y,t),\quad (x,y) \en\Omega = (0,1)\times(0,1),t\en(0,1.4)\quad(1)entt(x,y,t)=enxx(x,y,t)+enaa(x,y,t),(x,y)Oh=(0,1)×(0,1),t(0,1.4)(1)

u ( x , y , 0 ) = sen ⁡ ( π x ) sen ⁡ ( π y ) , u t ( x , y , 0 ) = 0 , ( x , y ) ∈ ( 0 , 1 ) × ( 0 , 1 ) ( 2 ) u(x,y,0) = \sin(\pi x)\sin(\pi y),\quad u_t(x,y,0) = 0, \quad(x,y)\in( 0,1)\veces(0,1)\quad(2)u(x,y,0)=pecado(πx)sen(πy) ent(x,y,0)=0,(x,y)(0,1)×(0,1)(2)

u ( x , y , t ) = 0 , ( x , y ) ∈ ∂ Ω t ∈ [ 0 , 1.4 ] ( 3 ) u(x,y,t) = 0,\quad(x,y)\in\ parcial \Omega\quad t\in[0,1.4]\quad(3)u(x,y,t)=0,(x,y)Ωt[0,1.4](3)

解析解的 u ( x , y , t ) = cos ⁡ ( 2 π t ) sin ⁡ ( π x ) sin ⁡ ( π y ) u(x,y ,t)=\cos(\sqrt2\pi t)\sin(\pi x)\sin(\pi y) u(x,y,t)=cos(2 πt)pecado(πx)sen(πy)

Principio del algoritmo

Se toma el mallado h = △ x = △ y = 0.01 τ = △ t = 0.1 h h =\triangle x = \triangle y = 0.01\quad \tau = \ Triangle t = 0,1hh=x=y=0,01t=t=0.1h Por lo tanto, espacio vacío y punto N = 1 h = 100 N=\frac {1}{h}=100norte=h1=100, punto de muestreo de tiempo M = 1,4 0,1 h = 1400 M = \frac{1,4}{0,1h}= 1400 METRO=0.1h1.4=1400,令 x i = i h , y j = j h , t k = k τ , i ∈ [ 0 , N ] , j ∈ [ 0 , N ] , k ∈ [ 0 , M ] x_i = ih,y_j =jh,t_k=k\tau,\quad i\in[0,N],j\in[0,N],k\in[ 0,M]Xi=ih,yj=jh,tk=kτ,i[0,N],j[0,N],k[0,M]

(1), (2) y (3) en 1 se pueden discretizar como

tu yo, j k + 1 = r 2 ( tu yo + 1 , j k + tu yo - 1 , j k + tu yo , j + 1 k + tu yo , j - 1 k ) + ( 2 - 4 r 2 ) tu yo , j k - u yo , j k − 1 yo ∈ [ 1 , N − 1 ] , j ∈ [ 1 , N − 1 ] , k ∈ [ 1 , M − 1 ] u_{i,j}^{k+1} = r^2(u_{ i+1,j}^{k} +u_{i-1,j}^{k} +u_{i,j+1}^{k} +u_{i,j-1}^{k} ) +(2-4r^2)u_{i,j}^k -u_{i,j}^{k-1}\quad i\in[1,N-1],j\in[1,N- 1],k\en[1,M-1]eni,jk+1=r2(ui+1,jk+eni-1,jk+eni,j+1k+eni,j1k)+(24r2)ui,jkeni,jk1i[1,norte1],j[1,norte1],k[1,METRO1], r = τ h = 0,1 r=\frac{\tau}{ h}=0,1r=hτ=0.1

u i , j 0 = pecado ⁡ ( π x i ) pecado ⁡ ( π y j ) = pecado ⁡ ( π i h ) pecado ⁡ ( π j h ) , i ∈ [ 0 , N ] , j ∈ [ 0 , N ] u_{i, j}^0 = \sin(\pi x_i)\sin(\pi y_j)=\sin(\pi ih)\sin(\pi jh), \quad i\in[0,N],j\in[ 0,norte]eni,j0=sin(πxi)sen(πyj)=sin(πih)sin(πjh),i[0,N],j[0,N]

tu yo, j 1 = r 2 2 ( tu yo + 1 , j 0 + tu yo - 1 , j 0 + tu yo , j + 1 0 + tu yo , j - 1 0 ) + ( 1 - 2 r 2 ) tu yo , j 0 yo ∈ ( 0 , N ) , j ∈ ( 0 , N ) u_{i,j}^{1} = \frac{r^2}{2}(u_{i+1,j}^{0} +u_ {i-1,j}^{0} +u_{i,j+1}^{0} +u_{i,j-1}^{0} )+(1-2r^2)u_{i, j}^0\quad i\in(0,N),j\in(0,N)eni,j1=2r2(ui+1,j0+eni-1,j0+eni,j+10+eni,j10)+(12r2)ui,j0i0,N,j0,N

tu 0 , 0 k = tu 0 , norte k = tu norte , 0 k = tu norte , norte k = 0 k ∈ [ 0 , M ] u_{0,0}^k=u_{0,N}^k= u_{N,0}^k=u_{N,N}^k=0 \quad k\in[0,M]en0,0k=en0,Nk=enN,0k=enN,Nk=0k[0,M]

La derivación específica es la siguiente.

ecuación de onda discretizada

Al establecer un esquema en diferencias finitas de segundo orden para la ecuación de onda (1), podemos obtener:

tu yo, j k + 1 - 2 tu yo, j k + tu yo, j k - 1 τ 2 = tu yo + 1, j k - 2 tu yo, j k + u yo - 1, j k h 2 + u yo, j + 1 k - 2 u yo, j k + u yo , j − 1 k h 2 ( 4 ) \frac{u_{i,j}^{k+1}-2u_{i,j}^{k}+u_{i,j}^{k-1}}{ \tau^2}=\frac{u_{i+1,j}^k-2u_{i,j}^k+u_{i-1,j}^k}{h^2}+\frac{u_ {i,j+1}^k-2u_{i,j}^k+u_{i,j-1}^k}{h^2}\quad(4)t2eni,jk+1-2ui,jk+ui,jk1=h2eni+1,jk-2ui,jk+ui-1,jk+h2eni,j+1k-2ui,jk+ui,j1k(4)

Disponible después de clasificar:

tu yo, j k + 1 = r 2 ( tu yo + 1 , j k + tu yo - 1 , j k + tu yo , j + 1 k + tu yo , j - 1 k ) + ( 2 - 4 r 2 ) tu yo , j k - u yo , j k − 1 ( 5 ) u_{i,j}^{k+1} = r^2(u_{i+1,j}^{k} +u_{i-1,j}^{k} +u_{ i,j+1}^{k} +u_{i,j-1}^{k} )+(2-4r^2)u_{i,j}^k -u_{i,j}^{k -1}\quad(5)eni,jk+1=r2(ui+1,jk+eni-1,jk+eni,j+1k+eni,j1k)+(24r2)ui,jkeni,jk1(5)

其中, i ∈ [ 1 , N − 1 ] , j ∈ [ 1 , N − 1 ] , k ∈ [ 1 , M − 1 ] i\in[1 ,N-1],j\en[1,N-1],k\en[1,M-1] i[1,norte1],j[1,norte1],k[1,METRO1], r = τ h = 0,1 r=\frac{\tau}{ h}=0,1r=hτ=0.1, el error de la etapa local es o ( h 2 ) o(h^2) o(h2)

Condiciones de valor inicial de discretización.

considere las condiciones u ( x , y , 0 ) = sin ⁡ ( π x ) sin ⁡ ( π y ) , ( x , y ) ∈ ( 0 , 1 ) × ( 0 , 1 ) u(x,y,0) = \sin(\pi x)\sin(\pi y),\quad(x,y)\in(0,1)\times(0, 1 ) u(x,y,0)=pecado(πx)sen(πy) (x,y)(0,1)×(0,1), expresión de caso diferencial 为

u i , j 0 = pecado ⁡ ( π x i ) pecado ⁡ ( π y j ) = pecado ⁡ ( π i h ) pecado ⁡ ( π j h ) , i ∈ [ 0 , N ] , j ∈ [ 0 , N ] ( 6 ) u_ {i,j}^0 = \sin(\pi x_i)\sin(\pi y_j)=\sin(\pi ih)\sin(\pi jh), \quad i\in[0,N],j \en[0,N]\quad(6)eni,j0=sin(πxi)sen(πyj)=sin(πih)sin(πjh),i[0,N],j[0,N](6)

Considerando las condiciones iniciales de la recta u t ( x , y , 0 ) = 0 , ( x , y ) ∈ ( 0 , 1 ) × ( 0 , 1 ) \quad u_t (x,y,0) = 0, \quad(x,y)\in(0,1)\times(0,1) ent(x,y,0)=0,(x,y)(0,1)×(0,1),Usando la aproximación del cociente de diferencias de dos niveles:

tu yo , j 1 − tu yo , j − 1 2 τ = 0 , ( x , y ) ∈ ( 0 , 1 ) × ( 0 , 1 ) ( 7 ) \frac{u_{i,j}^1-u_{i ,j}^{-1}}{2\tau} =0, \quad(x,y)\in(0,1)\times(0,1)\quad(7)2τeni,j1-ui,j-1=0,(x,y)(0,1)×(0,1)(7)

Sustituyendo k=0 en (5), entonces tenemos:

tu yo, j 1 = r 2 ( tu yo + 1 , j 0 + tu yo - 1 , j 0 + tu yo , j + 1 0 + tu yo , j - 1 0 ) + ( 2 - 4 r 2 ) tu yo , j 0 - tu yo , j − 1 ( 8 ) u_{i,j}^{1} = r^2(u_{i+1,j}^{0} +u_{i-1,j}^{0} +u_{ i,j+1}^{0} +u_{i,j-1}^{0} )+(2-4r^2)u_{i,j}^0 -u_{i,j}^{- 1}\quad(8)eni,j1=r2(ui+1,j0+eni-1,j0+eni,j+10+eni,j10)+(24r2)ui,j0eni,j-1(8)

En (7) medio u i , j 1 = u i , j − 1 u_{i,j}^1=u_{i,j}^{-1} < /span>eni,j1=eni,j-1Organizado:

tu yo, j 1 = r 2 2 ( tu yo + 1 , j 0 + tu yo - 1 , j 0 + tu yo , j + 1 0 + tu yo , j - 1 0 ) + ( 1 - 2 r 2 ) tu yo , j 0 ( 9 ) u_{i,j}^{1} = \frac{r^2}{2}(u_{i+1,j}^{0} +u_{i-1,j}^{0} + u_{i,j+1}^{0} +u_{i,j-1}^{0} )+(1-2r^2)u_{i,j}^0\quad(9)eni,j1=2r2(ui+1,j0+eni-1,j0+eni,j+10+eni,j10)+(12r2)ui,j0(9)

condiciones de contorno de discretización

Según la condición de contorno (3), se puede establecer el siguiente formato diferencial;

tu 0 , 0 k = tu 0 , norte k = tu norte , 0 k = tu norte , norte k = 0 ( 10 ) u_{0,0}^k=u_{0,N}^k=u_{N, 0}^k=u_{N,N}^k=0 \quad(10)en0,0k=en0,Nk=enN,0k=enN,Nk=0(10)

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import animation
#定义计算区域
x0 = 0.0
x1 = 1.0
y0 = 0.0
y1 = 1.0
N = 100
ds = (x1 - x0)/N

t0 = 0.0
t1 = 1.4
M = 1400
dt = (t1 - t0)/M
x = np.linspace(x0, x1, N+1)
y = np.linspace(y0, y1, N+1)
t = np.linspace(t0, t1, M+1)

r = dt/ds;
#初始化计算区域
(X, Y, T) = np.meshgrid(x,y,t)
#解析解
uu = np.multiply(np.multiply(np.cos(np.sqrt(2) * np.pi * T),np.sin(np.pi * X)),np.sin(np.pi * Y))
#有限差分求解
#创建差分数组
u = np.zeros((N+1,N+1,M+1))
#加入初始条件1
for i in range(0,N+1):
    for j in range(0,N+1):
        u[i,j,0] = np.sin(np.pi*i*ds) * np.sin(np.pi*j*ds)
#加入初始条件2
for i in range(1,N):
    for j in range(1,N):
        u[i,j,1] = r**2 / 2 * (u[i+1,j,0] + u[i-1,j,0] + u[i,j+1,0] + u[i,j-1,0]) + (1 - 2*r**2) * u[i,j,0] 
#加入边界条件
for k in range(0,M+1):
    u[0,0,k] = u[0,N,k] = u[N,0,k] = u[N,N,k] = 0
#递推求[1,N-1]时刻波场
for k in range(1,M):
    for i in range(1,N):
        for j in range(1,N):
            u[i,j,k+1] = r**2*(u[i+1,j,k]+u[i-1,j,k]+u[i,j+1,k]+u[i,j-1,k]) + (2-4*r**2)*u[i,j,k] -u[i,j,k-1]
(X, Y) = np.meshgrid(x,y)
t = 100

fig = plt.figure(figsize=(20,16))
ax1 = fig.add_subplot(131,projection='3d')
surf1 = ax1.plot_surface(X, Y, uu[:,:,t], cmap='viridis')
fig.colorbar(surf1)
ax1.set_xlabel('X Label')
ax1.set_ylabel('Y Label')
ax1.set_zlabel('Z Label')
ax1.set_title(f"analysis solution at time {
      
      t*dt}")

ax2 = fig.add_subplot(132,projection='3d')
surf2 = ax2.plot_surface(X, Y, u[:,:,t], cmap='viridis')
fig.colorbar(surf2)
ax2.set_xlabel('X Label')
ax2.set_ylabel('Y Label')
ax2.set_zlabel('Z Label')
ax2.set_title(f"FD solution at time {
      
      t*dt}")

ax3 = fig.add_subplot(133,projection='3d')
surf3 = ax3.plot_surface(X, Y, uu[:,:,t]-u[:,:,t], cmap='viridis')
fig.colorbar(surf3)
ax3.set_xlabel('X Label')
ax3.set_ylabel('Y Label')
ax3.set_zlabel('Z Label')
ax3.set_title(f"error at time {
      
      t*dt}")

plt.show()

Por favor agregue la descripción de la imagen.

Generar animación:

# 创建初始数据
data = uu[:, :, 0]

# 创建图形对象
fig, ax = plt.subplots()

# 创建pcolor对象
pc = ax.pcolor(X, Y, data, cmap='rainbow')

# 定义更新函数
def update(i):
    # 生成新的数据
    new_data = u[:, :, i]
    # 更新pcolor对象
    pc.set_array(new_data.ravel())
    ax.set_title(f"{
      
      i*dt} s")
    # 返回更新后的pcolor对象
    return pc,
plt.close()
# 创建动画对象
ani = animation.FuncAnimation(fig, update, frames=range(1, M+1), interval=1, blit=True)

# 显示动画
HTML(ani.to_html5_video())






Próximo objetivo: Realizar el modelado directo de diferencias finitas de la ecuación de onda acústica bidimensional con densidad constante
El formato de diferencia es:< /span>

1 v ( x , z ) 2 ∂ 2 u ∂ t 2 − ( ∂ 2 u ∂ x 2 + ∂ 2 u ∂ y 2 ) = f ( t ) δ ( x − x s ) δ ( z − z s ) \frac{ 1}{v(x,z)^2}\frac{\partial^2u}{\partial t^2}-(\frac{\partial^2u}{\partial x^2}+\frac{\partial ^2u}{\parcial y^2})=f(t)\delta(x-x_s)\delta(z-z_s)v(x,z 21t22u(x22u+y22u)=f(t)δ xXsδzCons

Naka u ( x , z , t ) u(x,z,t) u(x,z,t)mostrar fuerza, v ( x , z ) v(x,z) < /span>v(x,z)velocidad intermedia, f ( t ) f(t) f(t)是震源函数,< /span> ( x s , z s ) (x_s,z_s) (xs,Cons) es la ubicación de la fuente del terremoto.
La ecuación satisface las condiciones iniciales

u ( x , z , t = 0 ) = 0 , ∂ u ∂ t ( x , z , t = 0 ) = 0 , ( x , z ) ∈ ∂ Ω u(x,z,t=0)=0, \frac{\partial u}{\partial t}(x,z,t=0)=0,(x,z)\in \partial \Omegau(x,z,t=0)=0,tu(x,z,t=0)=0,(x,z)Ω

Supongo que te gusta

Origin blog.csdn.net/Reading8/article/details/132685806
Recomendado
Clasificación