基于python的三维射线追踪库-ttcrpy详解(4)

基于python的三维射线追踪库-ttcrpy详解(4)

python库ttcrpy中有三种射线追踪算法,他们是:FSM(快速扫描算法)、SPM(最短路径算法)、DSPM(动节点最短路径算法)。本内容为对比这三种算法。

文章目录

  • 基于python的三维射线追踪库-ttcrpy详解(4)
    • 1、模型一:低速异常体
    • 1、FSM(快速扫描算法)
    • 2、SPM(最短路径法)
    • 3、DSPM(动节点最短路径算法)
    • 4、三种方法追踪得到的走时对比
    • 5、模型二、高速异常体
    • 6、SPM与DSPM计算时间对比
    • 7、python代码
  • 搬砖不易,走过路过,点个赞支持一下,抱拳。

1、模型一:低速异常体

基于python的三维射线追踪库-ttcrpy详解(4)_第1张图片
速度分布图如上所示,异常体速度为2000 m/s,背景速度为4000 m/s。

1、FSM(快速扫描算法)

在导入的ttcrpy库中,将python代码的method改为FSM,即采用快速扫描算法追踪最短路径。运行结果如下:

基于python的三维射线追踪库-ttcrpy详解(4)_第2张图片

2、SPM(最短路径法)

将method改为spm,射线追踪路径如下:
基于python的三维射线追踪库-ttcrpy详解(4)_第3张图片

3、DSPM(动节点最短路径算法)

将射线追踪方法改为动节点最短路径法,结果如下:
基于python的三维射线追踪库-ttcrpy详解(4)_第4张图片

4、三种方法追踪得到的走时对比

从1、2、3可以看出,三种方法追踪得到的射线路径有较大区别,将三种方法计算得到的走时进行对比,如下:
基于python的三维射线追踪库-ttcrpy详解(4)_第5张图片
理论上这三种射线追踪方法得到的走时应该接近,但是为何会出现这么大的差异?至少,当最短路径法内插节点数足够多的时候,SPM与FSM计算得到的走时是非常接近的,误差能够在0.5%以内。由于我们建立的模型是低速异常体,射线理论对低速异常体不敏感,换一个高速异常体模型进行试验。

5、模型二、高速异常体

基于python的三维射线追踪库-ttcrpy详解(4)_第6张图片
高速异常体速度为4000 m/s,背景速度为2000 m/s。

运行FSM方法(快速扫描法)时,出现了bug,如下图所示,错误显示为‘分配不当’,此时,无法实现得到FSM结果。
基于python的三维射线追踪库-ttcrpy详解(4)_第7张图片
运行SPM(最短路径法),射线路径如下:
基于python的三维射线追踪库-ttcrpy详解(4)_第8张图片
运行DSPM(动节点最短路径法),射线路径如下:
基于python的三维射线追踪库-ttcrpy详解(4)_第9张图片

6、SPM与DSPM计算时间对比

基于python的三维射线追踪库-ttcrpy详解(4)_第10张图片
SPM走时曲线像是均匀模型模拟得到的结果,DSPM走时曲线也很离谱。估算一下,收发点距为9m,速度为2000m/s,时间 = 9/2000 = 0.0045 s,时间差不太多。可能ttcrpy中还有其他参数我没有考虑到,后续继续研究一下。

7、python代码

源代码一字不漏的复制如下,欢迎交流学习。

# -*- 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()

搬砖不易,走过路过,点个赞支持一下,抱拳。

你可能感兴趣的:(射线追踪,python,射线追踪,ttcrpy,CT)