python库ttcrpy中有三种射线追踪算法,他们是:FSM(快速扫描算法)、SPM(最短路径算法)、DSPM(动节点最短路径算法)。本内容为对比这三种算法。
速度分布图如上所示,异常体速度为2000 m/s,背景速度为4000 m/s。
在导入的ttcrpy库中,将python代码的method改为FSM,即采用快速扫描算法追踪最短路径。运行结果如下:
从1、2、3可以看出,三种方法追踪得到的射线路径有较大区别,将三种方法计算得到的走时进行对比,如下:
理论上这三种射线追踪方法得到的走时应该接近,但是为何会出现这么大的差异?至少,当最短路径法内插节点数足够多的时候,SPM与FSM计算得到的走时是非常接近的,误差能够在0.5%以内。由于我们建立的模型是低速异常体,射线理论对低速异常体不敏感,换一个高速异常体模型进行试验。
高速异常体速度为4000 m/s,背景速度为2000 m/s。
运行FSM方法(快速扫描法)时,出现了bug,如下图所示,错误显示为‘分配不当’,此时,无法实现得到FSM结果。
运行SPM(最短路径法),射线路径如下:
运行DSPM(动节点最短路径法),射线路径如下:
SPM走时曲线像是均匀模型模拟得到的结果,DSPM走时曲线也很离谱。估算一下,收发点距为9m,速度为2000m/s,时间 = 9/2000 = 0.0045 s,时间差不太多。可能ttcrpy中还有其他参数我没有考虑到,后续继续研究一下。
源代码一字不漏的复制如下,欢迎交流学习。
# -*- coding: utf-8 -*-
"""
Created on Mon May 2 13:46:40 2022
@author: 86159
"""
import numpy as np
import matplotlib.pyplot as plt
# data1 = np.loadtxt('FSM.txt')
data1 = np.loadtxt('G_SPM.txt')
data2 = np.loadtxt('G_DSPM.txt')
fig, ax = plt.subplots()
cs = ax.plot(data1, 'r',
data2, 'g')
# data3, 'b')
miloc = plt.MultipleLocator(1)
ax.xaxis.set_minor_locator(miloc)
plt.grid(linestyle = ':', color = 'black',which = 'both')
plt.xlabel('Number')
plt.ylabel('Time(s)')
plt.legend( ['SPM', 'DSPM'])
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 27 15:37:28 2022
@author: 86159
"""
import ttcrpy.rgrid as rg
import numpy as np
import matplotlib.pyplot as plt
import time
# 创建网格
x = np.arange(1,11.0)
z = np.arange(1,12.0)
# 创建速度模型
v = 2000*np.ones((x.size,z.size))
v1 = 4000*np.ones((4, 4))
# index = [2,3]
# v[5:7,5:8] = v1
v[2:6,2:6] = v1
fig, ax = plt.subplots()
cs = plt.pcolor(v,cmap='jet')
fig.colorbar(cs)
plt.show()
# 给定发射点和接收点的坐标
srcs = np.array([[1,1.5],
[1,2.5],
[1,3.5],
[1,4.5],
[1,5.5],
[1,6.5],
[1,7.5],
[1,8.5]])
# src = np.array([[1,1.5]])
rcv = np.array([[10,1.5],
[10,2.5],
[10,3.5],
[10,4.5],
[10,5.5],
[10,6.5],
[10,7.5],
[10,8.5]])
# 离散网格
grid = rg.Grid2d(x, z, cell_slowness=False, method = 'FSM')
# 速度转换为慢度
slowness = 1./v
tt_all = np.empty(0)
rays_all = list()
for s in srcs:
src = np.array([s])
tt, rays = grid.raytrace(src, rcv, slowness, return_rays=True)
tt_all = np.append(tt_all,tt)
rays_all = rays_all + rays
# print(src)
# print(rcv)
# tt, rays = grid.raytrace(src, rcv, slowness, return_rays=True)
# 绘制走时图
plt.figure(2)
plt.plot(tt_all, 'r-o')
plt.show()
# 保存走时
np.savetxt('G_FSM.txt', tt_all)
plt.figure(3)
# 绘制射线路径图
for r in rays_all:
plt.plot(r[:,0],r[:,1],'r-s')
# plt.show()
# plt.hold(true)
ax = plt.gca()
miloc = plt.MultipleLocator(1)
ax.xaxis.set_minor_locator(miloc)
plt.grid(linestyle = ':', color = 'black',which = 'both')
plt.xlim(0,10)
plt.ylim(0,9)
plt.show()