解析解二维标量波动方程在柱坐标数值实现中

计算科学 Python 数值分析 麻木的 波传播
2021-12-19 20:38:36

我试图将标量(或简单声学)波动方程的有限差分解与解析解进行比较。

为此,我使用旧论文Accuracy of the Finite-Difference Modeling of the Accuracy - Geophysics 1974 - RM Alford 等旧论文中提出的以下解析解。_

该论文中等式 (9) 的解,对于等速介质,在柱坐标中由下式给出:

us(ρ,ϕ,t)=12π{iπH0(2)(k|σσs|)F(ω)eiωtdω}
(一种)

H0(2)是零阶的第二类汉克尔函数。

|σσs|是从源到观察点的距离。

k=ωC0来自C0转换为傅立叶域的介质速度,在原始标量波动方程中定义为:

[21C022t2]u(ρ,ϕ,t)=4πδ(ρρs)δ(ϕϕs)f(t)ρ

(ρs,ϕs)定义源位置ϕXρ飞机。

F(ω)来自源函数f(t)

问题:

  • 当以数字方式实现A时,我没有得到有意义的结果。使用A获得的速度与C0用作输入

我的代码示例如下所示,我正在使用 python 评估Asolution0我在零处和距离 D=8000 处计算解solutionD然后我使用全局最大值来计算速度的近似值C0

可能这是我正在做的一个非常简单的错误。如果有人可以为我指出。我得到的速度表明方程(9)可能是错误的,或者我错误地执行它(我认为是这种情况)。

from scipy.special import hankel2
import numpy as np

# a simple source function f(t) gauss derivative normalized
def gaussource(time, wlength, delay=None):
        if delay == None: # enough delay time
            delay = 3*wlength
        t = time - delay
        return ((2*np.sqrt(np.e)/(wlength))
               *t*np.exp(-2*(t**2)/(wlength**2)))

# analytic solution equation (A) paper
def waves(source, distance, c):
    n = len(source)
    sourcew = np.fft.fft(source) # source in the frequency domain
    hnk_factor = distance/c # distance to source divided by velocity
    if not distance == 0.0:
        hankelshift = np.complex(0,-np.pi)*np.array([hankel2(0,hnk_factor*omega) for omega in xrange(n)])
        hankelshift[0] = 0. # i infinity in limit
        return np.real(np.fft.ifft(hankelshift*sourcew))
    return source

c = 4000.
fc = 5.0
dt = 0.01
t = np.arange(0., 2., dt) # 2 seconds to evaluate the solution
source = gaussource(t, 1./fc) # source
solution0 = waves(source, 0., c) # solution at zero source (source itself)
solutionD = waves(source, 8000., c) #solution at certain distance D=8000 metres e.g.   
t0 = solution0.argmax(); # get max index time at zero
tD = solutionD.argmax(); # get max index time at distance
print "phase velocity aproximation ", 8000./((tD-t0)*dt) 
1个回答

几个星期后,没有人找到我的问题的答案。我发现自己的错误和解决方案。为了帮助社区,我正在分享它(元建议)。

这确实是一个非常简单的错误。

真正基本的采样定理,基于采样率的最大频率是:

fmax=1/Δt

或使用ω

ωmax=2π/Δt

我更改了def waves(source, distance, c):函数定义。我用了 Δt计算Δω以频率对溶液进行采样。由于源是解决方案本身,因此还删除了零距离处的计算。

# analytic solution equation (A) paper
def waves(source, distance, c, dt):
    n = len(source)
    sourcew = np.fft.fft(source) # source in the frequency domain
    hnk_factor = distance/c # distance to source divided by velocity
    dw = np.pi*2.0*(1./dt)*1/n
    hankelshift = np.complex(0,-np.pi)*np.array([hankel2(0.0,hnk_factor*k*dw) for k in xrange(n)])
    hankelshift[0] = 0. # i infinity in limit
    return np.real(np.fft.ifft(hankelshift*sourcew))

t = np.arange(0., 3.5, dt) # 3.5 seconds to evaluate the solution
source = gaussource(t, 1./fc) # source and solution at 0
solutionD = waves(source, 8000., c, dt) # solution at certain distance     D=8000 metres e.g.   
t0 = source.argmax(); # get max index time at zero
tD = solutionD.argmax(); # get max index time at distance

我还将解决时间垃圾邮件增加到 3.5 秒。

下面是它的工作原理,它甚至可以通过改变采样率给出更接近的结果。

相速度近似 3883.49514563

在此处输入图像描述