IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 基于ttcrpy的跨孔CT高斯牛顿算法及python代码分享(2) -> 正文阅读

[人工智能]基于ttcrpy的跨孔CT高斯牛顿算法及python代码分享(2)

作者:2_136

基于ttcrpy的跨孔CT高斯牛顿算法及python代码分享(2)

ttcrpy是加拿大学者伯纳德·吉鲁(Bernard Giroux)于2021年发布的开源python库,详见(https://github.com/groupeLIAMG),参考文献(Giroux B. 2021. ttcrpy: A Python package for traveltime computation and raytracing.
SoftwareX, vol. 16, 100834. doi:10.1016/j.softx.2021.100834
)。

ttcrpy库包含了三种射线追踪方法:快速扫描算法(FSM)、最短路径法(SPM)、动节点最短路径法(DSPM)。包含其二维与三维的实现。

ttcrpy库中给出了2D矩形网格和三角形网格、3D正六面体与四面体网格等网格剖分形式,对于非规则网格,要利用python中的vtk库和pygmsh库生成。

本博文借助ttcrpy中射线追踪算法,实现跨孔CT的高斯牛顿反演算法,并实现拉普拉斯算子约束的高斯牛顿算法。

一、ttcrpy正演

建立速度模型,利用python中ttcrpy进行正演。

1、模型一

速度模型如下:
在这里插入图片描述
正演结果如下:
在这里插入图片描述
在这里插入图片描述

1.2 模型二

速度模型如下:
在这里插入图片描述
ttcrpy正演结果如下:
在这里插入图片描述
在这里插入图片描述

二、ttcrpy反演

拉普拉斯算子(Laplace Operator)是n维欧几里德空间中的一个二阶微分算子,定义为梯度(▽f)的散度(▽·f)。拉普拉斯算子也可以推广为定义在黎曼流形上的椭圆型算子,称为拉普拉斯-贝尔特拉米算子。

作为一个二阶微分算子,拉普拉斯算子把C函数映射到C函数,对于k≥2时成立。算子Δ :C? →C?,或更一般地,定义了一个算子Δ :C(Ω) →C(Ω),对于任何开集Ω时成立。

在反演中加入拉普拉斯算子可以使反演解更加收敛,得到的结果接近真实模型,结果更光滑。

1、模型一反演结果

1.1 普通高斯牛顿法反演结果
在这里插入图片描述
1.2 拉普拉斯算子约束的高斯牛顿算法反演结果
在这里插入图片描述

2、模型二反演结果

2.1 普通高斯牛顿法反演结果
在这里插入图片描述
2.2 拉普拉斯约束的高斯牛顿反演结果
在这里插入图片描述

3、收敛性对比

将两种反演结果的百分误差绘制成如下图:
在这里插入图片描述
由图可见,带约束的高斯牛顿法反演收敛性更好,反演效果更好。

三、python代码分享

1、ttcrpy正演代码

# -*- coding: utf-8 -*-
"""
Created on Sat Sep 10 20:15:20 2022

@author: Shang'xiang

Stay Hungry Stay Foolish
"""

'''
此程序用于走时CT的正演
'''

import ttcrpy.rgrid as rg
import numpy as np
import matplotlib.pyplot as plt

# 创建网格
x = np.arange(0,31.0)
y = np.arange(0,21.0)

# 创建速度模型
v = 2000*np.ones((x.size-1,y.size-1))
v1 = 4000*np.ones((4, 4))

v[8:12,4:8] = v1
v[18:22,4:8] = v1

# 画模型图
fig, ax = plt.subplots()

cs = plt.pcolor(v,cmap='jet',edgecolor='w')
plt.colorbar()
plt.show()

# 给定发射点和接收点的坐标
nsrc = 30
nrcv = 30
srcs = np.ones(shape=(nsrc,2))
rcvs = 19*np.ones(shape=(nrcv,2))
for i in range(nsrc):
    xsrc = 0.5 + 1*i
    xrcv = 0.5 + 1*i
    srcs[i][0] = xsrc
    rcvs[i][0] = xrcv
    
# 离散网格
grid = rg.Grid2d(x, y, cell_slowness=True, method = 'SPM')

# 速度转换为慢度
slowness = 1./v

# tt_all = np.empty(0)
data_all = np.empty([900,5])
rays_all = list()
n = 0
for s in srcs:
    src = np.array([s])
    tt, rays = grid.raytrace(src, rcvs, slowness, return_rays=True)
    data_all[30*n:30*(n+1),0:2] = np.repeat(src,30,axis = 0)
    data_all[30*n:30*(n+1),2:4] = rcvs
    data_all[30*n:30*(n+1),4] = tt
    rays_all = rays_all + rays
    n = n + 1


# 绘制走时图
plt.figure(2)
plt.plot(data_all[:,4], 'r-o')
plt.show()

# 保存走时
np.savetxt('G03_FSM.txt', data_all)

plt.figure(3)
# 绘制射线路径图
for r in rays_all:
    plt.plot(r[:,1],r[:,0],'b-',linewidth=0.25)

ax = plt.gca()
miloc = plt.MultipleLocator(1)
ax.xaxis.set_minor_locator(miloc)
plt.grid(linestyle = ':', color = 'black',which = 'both')
plt.xlim(0,20)
plt.ylim(0,31)
plt.show()

2、高斯牛顿反演代码

# -*- coding: utf-8 -*-
"""
Created on Mon Sep 12 13:48:33 2022

@author: Shang'xiang

Stay Hungry Stay Foolish
"""

'''
此程序用于走时CT的GN反演
'''

# 初始化,读取数据
import ttcrpy.rgrid as rg
import numpy as np
from scipy.sparse.linalg import cg

import matplotlib.pyplot as plt

data = np.loadtxt('G03_FSM.txt')

srcs = data[:,0:2]
rcvs = data[:,2:4]
tobs = data[:,4]

# 给定初始模型
# 创建网格
x = np.arange(0,31.0)
y = np.arange(0,21.0)

# 创建速度模型
v = 2000*np.ones((x.size-1,y.size-1))


# 离散网格
grid = rg.Grid2d(x, y, cell_slowness=True, method = 'SPM')

# 速度转换为慢度
slowness = 1./v

# =============================================================================
# # tcal,LL = grid.raytrace(srcs, rcvs, slowness, compute_L = True)
# 
# # A = LL.todense()
# 
# # I = np.eye(600)
# 
# # zuo = A.T*A + 0.618*I
# # deltat = tobs - tcal
# # you = A.T.dot(deltat)
# # you = you.T
# 
# # deltam,info = cg(zuo,you)
# =============================================================================
I = np.eye(600)
=============================================================================
# # CT正演
# =============================================================================
def ctforward(slowness):
    tcal,LL = grid.raytrace(srcs, rcvs, slowness, compute_L = True)
    A = LL.todense()
    # zuo = A.T*A + 0.618*I
    zuo = A.T*A + 0.618*C
    deltat = tobs - tcal
    you = A.T.dot(deltat)
    you = you.T
    deltam,info = cg(zuo,you)
    return deltam

# =============================================================================
# # 第一次计算
# # 计算模型修改量
deltam = ctforward(slowness)
deltam = deltam.reshape(30,20)
# 
# # 修改慢度
slowness = slowness + deltam
# =============================================================================

# 开始循环
for i in range(10):
    deltam = ctforward(slowness)
    deltam = deltam.reshape(30,20)
    slowness = slowness + deltam
    v = 1./slowness
    # 画模型图
    fig, ax = plt.subplots()
    cs = plt.pcolor(v,cmap='jet',edgecolor='w')
    plt.colorbar()
    plt.show()

注:此代码在 python spyder环境中运行。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:15:05  更:2022-09-13 11:20:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:54:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码