bostick反演

1.bostick反演的基本公式

H = ρ a ω μ H = \sqrt{\frac{\rho_a}{\omega\mu}} H=ωμρa

ρ ( H ) = ρ a ( ω ) ( π 2 φ ( ω ) − 1 ) \rho(H) = \rho_a(\omega)(\frac{\pi}{2\varphi(\omega)}-1) ρ(H)=ρa(ω)(2φ(ω)π1)

2.代码实现
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# 设置中文显示
font = {'family':'SimHei'}
plt.rcParams["axes.unicode_minus"] = False

# 定义正演函数
def mt1d_fwd(rho, h):
    mu = (4e-7)*np.pi
    T = np.logspace(-3, 4, 40)
    m = len(rho) # 层数
    
    k = np.zeros((len(rho), len(T)), dtype = np.complex)
    for i in range(len(rho)):
        k[i] = np.sqrt((-1j*2*np.pi*mu)/(T*rho[i]))
        
    Z = -(2j*mu*np.pi)/(T*k[m-1]) # python 的索引从 0 开始
    layer = np.arange(m-1, 0, -1) # np.arange() 不包含 stop 参数
    for n in layer:
        A = -(1j*mu*2*np.pi)/(T*k[n-1])
        B = np.exp(-2*k[n-1]*h[n-1])
        Z = A*(A*(1-B)+Z*(1+B))/(A*(1+B)+Z*(1-B))
    
    rho_a = (T/(mu*2*np.pi))*(np.abs(Z)**2)
    phase = -np.arctan(Z.imag/Z.real)*180/np.pi
    return [rho_a, phase]

# 定义 bostick 反演函数
def bostick(rho_a, ph):
    mu = np.pi*(4e-7)
    T = np.logspace(-3, 4, 40)
    D = np.sqrt((rho_a*T)/(2*np.pi*mu))
    rho_h = rho_a*(180/(2*ph)-1)
    return D, rho_h

# 设置理论模型
T = np.logspace(-3, 4, 40)
depth = np.array([1, 500, 2000, 100000])
rho = [10, 200, 10, 10]
# 使用正演得出的反演计算的原始数据
rho_a, ph = mt1d_fwd([10, 200, 10], [500, 2000])

# 反演计算
D, rho_h = bostick(rho_a, ph)

# 绘制反演结果图
plt.figure()
plt.plot(depth/1000, rho, drawstyle = 'steps-post',
        label = '原始模型')
plt.plot(D/1000, rho_h, drawstyle = 'steps-post',
        label = '反演模型')
plt.legend(prop = font)
plt.xlabel('深度(km)', font)
plt.ylabel(r'电阻率($\Omega\cdot m$)', font)
plt.loglog()
plt.savefig('反演结果.png', dpi = 300)

#绘制反演对比图
plt.figure()
h = np.diff(D)  #计算出bostick反演的层厚度
rho_a1, ph1 = mt1d_fwd(rho_h, h) # 将反演结果进行正演
# 绘制电阻率响应模型
plt.subplot(211)
plt.plot(T, rho_a, '*', label = '原始模型响应')
plt.plot(T, rho_a1, label = '反演模型响应')
plt.xlabel('T(s)')
plt.ylabel(r'$\rho_a(\Omega\cdot m)$')
plt.semilogx()
plt.legend(prop = font)
# 绘制相位响应模型
plt.subplot(212)
plt.plot(T, ph, '*', label = '原始模型响应')
plt.plot(T, ph1, label = '反演模型响应')
plt.xlabel('T(s)')
plt.ylabel('Phase(°)')
plt.semilogx()
plt.legend(prop = font, loc=4)
plt.savefig('反演响应数据对比')

plt.show()
3.反演结果

反演结果:

20200620220234

反演数据对比

20200620220300

参考资料:柳建新,童孝忠,MATLAB在地球物理中的应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值