当前位置: 首页 > article >正文

用Python复现地震波走时计算:从SPM到SPFSM,手把手教你实现射线追踪(附完整代码)

Python实现地震波走时计算从SPM到SPFSM的算法演进与代码实战地震波走时计算是地球物理勘探中的基础问题无论是油气资源勘探还是地下结构成像都需要精确计算地震波从震源到接收点的传播时间。传统的最短路径法SPM虽然稳定可靠但计算效率较低。而快速扫描法FSM虽然速度快但在复杂介质中的精度有限。本文将带你用Python实现一种融合两者优势的最短路径快速扫描法SPFSM并通过可视化展示算法效果。1. 算法原理与演进历程地震波走时计算的核心是求解程函方程Eikonal equation。这个非线性偏微分方程描述了波前传播的规律|∇T(x)| s(x)其中T(x)是走时场s(x)是慢度场速度的倒数。传统SPM算法将地下介质离散为网格通过Dijkstra算法寻找最短路径其计算复杂度为O(N log N)N为网格点数。SPFSM算法的创新点在于扫描顺序优化采用交替的四个扫描方向左上→右下、右上→左下等替代堆排序次级网格技术在主网格间插入次级网格点增加射线传播方向的选择全局最小走时保证通过多次扫描确保获得全局最小走时而非局部最优算法性能对比算法时间复杂度精度实现难度适用场景SPMO(N log N)高中等复杂介质FSMO(N)低简单均匀介质SPFSMO(N)高中等通用场景2. Python实现基础框架我们先搭建算法的基础框架。完整代码需要以下核心组件import numpy as np import matplotlib.pyplot as plt from heapq import heappush, heappop class TravelTimeCalculator: def __init__(self, velocity_model, dx10, dz10, subgrid5): 初始化走时计算器 :param velocity_model: 速度模型矩阵(m/s) :param dx: x方向网格间距(m) :param dz: z方向网格间距(m) :param subgrid: 次级网格划分数 self.v velocity_model self.s 1.0 / velocity_model # 慢度模型 self.dx dx self.dz dz self.subgrid subgrid self.nx, self.nz velocity_model.shape次级网格的处理是精度提升的关键。我们创建一个扩展的走时场矩阵def init_subgrid(self): 初始化次级网格走时场 sg self.subgrid # 扩展后的网格尺寸 ext_nx sg * self.nx - (sg - 1) ext_nz sg * self.nz - (sg - 1) self.T np.full((ext_nx, ext_nz), np.inf) # 主网格点对应的次级网格索引 self.main_grid_idx [(i*sg, j*sg) for i in range(self.nx) for j in range(self.nz)]3. 核心算法实现SPFSM的核心在于四次不同方向的扫描更新。以下是第一次扫描左上→右下的实现def sweep_1(self): 第一次扫描从左上到右下 sg self.subgrid for i in range(1, self.T.shape[0]): for j in range(1, self.T.shape[1]): # 获取当前点的慢度需要考虑混合网格的情况 s self.get_slowness(i, j) # 可能的来源点 candidates [] if i 0: dt self.dx/sg * s candidates.append(self.T[i-1,j] dt) if j 0: dt self.dz/sg * s candidates.append(self.T[i,j-1] dt) if i 0 and j 0: dt np.sqrt((self.dx/sg)**2 (self.dz/sg)**2) * s candidates.append(self.T[i-1,j-1] dt) # 更新当前点走时 if candidates: new_T min(candidates) self.T[i,j] min(self.T[i,j], new_T)完整的四次扫描需要实现其他三个方向的类似逻辑。每次扫描后走时场会逐步收敛到全局最小解。4. 射线路径回溯技术获得走时场后我们需要从接收点回溯射线路径。根据Fermat原理射线总是沿走时最小的路径传播def trace_ray(self, receiver_pos): 从接收点回溯射线路径 :param receiver_pos: 接收点位置(主网格坐标) :return: 射线路径坐标列表 sg self.subgrid rx, rz receiver_pos[0]*sg, receiver_pos[1]*sg path [(rx, rz)] while not self.is_source_nearby(rx, rz): # 获取当前点周围3×3邻域 neighbors self.get_neighbors(rx, rz) # 找出使走时最小的下一个点 min_T np.inf next_pos None for (ni, nj), dist in neighbors: if self.T[ni, nj] min_T: min_T self.T[ni, nj] next_pos (ni, nj) if next_pos is None: break path.append(next_pos) rx, rz next_pos return path5. 可视化与性能优化可视化是验证算法正确性的重要手段。我们使用Matplotlib实现走时场和射线路径的可视化def plot_results(self, ray_pathsNone): 可视化走时场和射线路径 plt.figure(figsize(12, 6)) # 走时场等值线 X, Z np.meshgrid(np.arange(self.nx), np.arange(self.nz)) plt.contourf(X, Z, self.T[::self.subgrid, ::self.subgrid].T, 20, cmapviridis) plt.colorbar(labelTravel Time (s)) # 射线路径 if ray_paths: for path in ray_paths: x [p[0]/self.subgrid for p in path] z [p[1]/self.subgrid for p in path] plt.plot(x, z, r-, linewidth1) plt.xlabel(X Position (grid)) plt.ylabel(Z Position (grid)) plt.title(Travel Time Field with Ray Paths) plt.show()性能优化技巧使用Numpy向量化运算替代循环对慢度场进行预计算和缓存采用多级网格技术加速收敛使用Numba进行即时编译加速from numba import jit jit(nopythonTrue) def fast_sweep(T, s, dx, dz, subgrid): 使用Numba加速的扫描函数 # 实现代码... return updated_T6. 实际应用案例我们用一个三层速度模型测试算法效果# 构建三层速度模型 nx, nz 100, 100 v_model np.ones((nx, nz)) * 1500 v_model[:, 30:60] 2000 # 中间层 v_model[:, 60:] 2500 # 底层 # 初始化计算器 ttc TravelTimeCalculator(v_model, subgrid5) # 设置震源位置 source_pos (50, 5) ttc.set_source(source_pos) # 计算走时场 ttc.compute_travel_time() # 回溯多条射线路径 receivers [(10, 95), (30, 95), (70, 95), (90, 95)] ray_paths [ttc.trace_ray(r) for r in receivers] # 可视化 ttc.plot_results(ray_paths)在Marmousi复杂模型上的测试表明SPFSM计算得到的走时场与波动方程模拟结果吻合良好验证了算法的准确性。7. 算法扩展与进阶方向基础实现后可以考虑以下扩展方向各向异性介质支持def anisotropic_update(self, i, j): 各向异性介质中的走时更新 # 需要考虑速度随方向变化 pass三维扩展扫描方向增加到8个次级网格扩展到三维回溯算法考虑空间邻域GPU加速使用CuPy替代NumPy将核心算法移植到GPU执行并行计算from multiprocessing import Pool def parallel_sweeps(self): 并行执行多个扫描方向 with Pool(4) as p: results p.map(self._sweep, [uldr, urdl, dlur, drul]) # 合并结果...实际项目中算法的选择需要权衡精度需求和计算资源。对于实时处理场景可能需要牺牲一定精度换取速度而对于精细成像则应该采用更高精度的算法配置。

相关文章:

用Python复现地震波走时计算:从SPM到SPFSM,手把手教你实现射线追踪(附完整代码)

Python实现地震波走时计算:从SPM到SPFSM的算法演进与代码实战 地震波走时计算是地球物理勘探中的基础问题,无论是油气资源勘探还是地下结构成像,都需要精确计算地震波从震源到接收点的传播时间。传统的最短路径法(SPM)…...

Kafka 事务机制 跨分区 + 跨会话 通俗讲解 + 可运行代码示例

Kafka 事务机制 跨分区 跨会话 通俗讲解 可运行代码示例 一、先白话定义 1. 跨分区写入 一次业务,需要往多个分区 / 多个主题发送多条消息。 事务保证:多条消息要么全部提交消费者可见,要么全部回滚一条都看不见,不会中间成功一…...

终极RPG Maker MV/MZ插件集合:500+免费插件打造专业级游戏开发体验

终极RPG Maker MV/MZ插件集合:500免费插件打造专业级游戏开发体验 【免费下载链接】RPGMakerMV RPGツクールMV、MZで動作するプラグインです。 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerMV 你是否曾为RPG Maker有限的游戏机制而苦恼&#xff1f…...

LRCGET:离线音乐库批量歌词下载与同步的智能解决方案

LRCGET:离线音乐库批量歌词下载与同步的智能解决方案 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 你是否曾为海量离线音乐文件寻找同步歌…...

突破网盘下载限制:智能直链解析工具助你告别龟速下载

突破网盘下载限制:智能直链解析工具助你告别龟速下载 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…...

一文读懂 Graphify 知识图谱

Graphify 是一款开源、本地优先的多模态知识图谱构建工具,主打 “一条命令把任意文件夹(代码 / 文档 / 图片 / PDF 等)转成可查询、持久化的知识图谱”,2026 年 4 月由开发者 Safi Shamsi 发布,短时间内获得高人气。它…...

分布式水文模型学习进展

swat模型及分布式水文模型使用与开发简介问题记录简介 这是swat及其他分布式水文模型的使用及开发过程中遇到的问题及解决方法的记录,目前仅为暂时的、非完整、非体系化的记录,待日后完善。 问题记录 什么都对但结果数量级不对 : 分几种情…...

创业公司如何利用 Taotoken 管理多个 AI 模型的调用成本

创业公司如何利用 Taotoken 管理多个 AI 模型的调用成本 1. 多模型统一接入的价值 对于资源有限的创业团队而言,产品开发过程中往往需要尝试多种大模型能力。传统方式需要为每个供应商单独注册账号、管理多个 API Key,不仅增加运维负担,也难…...

PCIe 5.0测试入门:手把手教你用示波器和VNA完成发射机(Tx)与接收机(Rx)一致性测试

PCIe 5.0测试实战指南:从设备校准到信号分析的完整流程 实验室的灯光下,一台搭载PCIe 5.0接口的显卡正在测试台上静静等待验证。32GT/s的数据传输速率对硬件设计提出了前所未有的挑战,而精确的测试流程则是确保产品可靠性的关键防线。本文将带…...

告别龟速!手把手教你将Jetson Xavier NX系统迁移到NVMe固态硬盘(附rootOnNVMe脚本详解)

Jetson Xavier NX系统迁移至NVMe固态硬盘实战指南 1. 为什么需要将系统迁移到NVMe固态硬盘? Jetson Xavier NX作为NVIDIA推出的边缘计算设备,默认配置的EMMC存储虽然稳定,但在实际AI应用场景中往往成为性能瓶颈。当运行计算机视觉模型或处理高…...

鸣潮自动化工具OK-WW:解放双手的智能后台战斗完整指南

鸣潮自动化工具OK-WW:解放双手的智能后台战斗完整指南 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 《鸣潮》&#x…...

go语言使用互斥锁进行同步

我们可以利用互斥锁来保护代码中的关键部分,从而确保每次只能有一个goroutine访问共享资源。这样一来,就能避免竞争条件的问题。几乎所有支持并发编程的语言中,都使用了类似互斥锁的机制。在本章中,我们首先会了解互斥锁的功能。之…...

Windows 笔记本低功耗优化指南:从系统配置到 BIOS 底层,根治关机跑电

三步根治关机掉电快、合盖耗电异常,从系统到 BIOS 彻底解决!很多 Windows 11 笔记本用户都遇到过这种情况:明明正常关机,第二天开机电池掉电 10%;合盖放包里,半天就掉电 20%,甚至直接关机。这种…...

使用 Python 快速接入 Taotoken 并调用多模型 API 的完整步骤

使用 Python 快速接入 Taotoken 并调用多模型 API 的完整步骤 1. 准备工作 在开始编写代码之前,您需要完成几个简单的准备工作。首先确保您拥有一个 Taotoken 账户,并在控制台中创建了 API Key。登录 Taotoken 平台后,可以在「API 密钥管理…...

为什么你的网盘下载总是卡在“蜗牛模式“?LinkSwift用JavaScript重新定义文件下载体验

为什么你的网盘下载总是卡在"蜗牛模式"?LinkSwift用JavaScript重新定义文件下载体验 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度…...

秒言输入法 | 毫秒级极速响应 懂你的AI语音输入法

链接:https://pan.quark.cn/s/88b1a0f87060依靠强大的 AI 模型,秒言能自动整理口语中的碎片化语言,修正语病,输出你真正想表达的文字。...

Chrome二维码插件:3分钟掌握跨设备分享的终极指南

Chrome二维码插件:3分钟掌握跨设备分享的终极指南 【免费下载链接】chrome-qrcode :zap: A Chrome plugin to Genrate QRCode of URL / Text, or Decode the QRcode in website. 一个Chrome浏览器插件,用于生成当前URL或者选中内容的二维码,同…...

SSD Booster.NET(SSD驱动器优化工具)

链接:https://pan.quark.cn/s/9d0ee0442715SSD Booster.NET是一款旨在优化和调整Windows系统以适配固态硬盘(SSD)的工具,目的是提升SSD的效率并维持其高性能。它为用户提供了一个便捷的方式来调整SSD驱动的重要设置。紧凑的用户界面:拥有复古…...

3步解决经典游戏联机难题:IPXWrapper让老游戏重获新生

3步解决经典游戏联机难题:IPXWrapper让老游戏重获新生 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 还在为《星际争霸》《红色警戒2》《魔兽争霸2》等经典游戏无法在现代Windows系统上联机而烦恼吗?IPX…...

不懂这个,一人企业必死

一人企业必死局:搞不懂这个核心死穴,做代运营、智能体服务,轻则白干重则负债 作者:智能体架构师卢成 | Agent Architect | 意图工程卢成 今天不讲风口、不讲变现,只给所有做一人企业、做To B代运营、做智能体企业服务的…...

用 AI 智能体自动写代码、自动测代码、自动部署,全程零手动操作

前言 以前写代码:自己构思→敲代码→本地调试→改 Bug→打包→传服务器→配置环境→上线部署,一套流程耗几小时。 现在AI Agent 智能体可以做到:你只说需求一句话,智能体自动:需求分析 → 生成完整代码 → 自动写单元…...

Python 爬虫反爬突破:JS 逆向混淆与加密参数破解实战

前言 在前五篇反爬专栏中,完整覆盖了浏览器指纹、硬件特征、无头伪装、访问频率等环境层反爬对抗方案,而前端 JS 加密与代码混淆,是现阶段企业级站点最高频、最难绕过的核心反爬手段。主流平台不再单纯依赖环境检测拦截爬虫,而是…...

AI Agent 零基础入门,5 分钟搭建自己的数字员工

前言 2026 年是AI Agent(智能体)爆发元年,它不再是高深的技术名词,而是能自主思考、拆解任务、调用工具、自动执行的数字员工 —— 能帮你自动写周报、整理资料、监控数据、回复消息,甚至部署项目、运维服务器。 本文…...

Android 13 WMS源码解析:手把手带你画DisplayArea层级树(附避坑指南)

Android 13 WMS深度解析:从源码到可视化理解DisplayArea层级构建 在Android窗口系统的核心架构中,DisplayArea的层级树扮演着至关重要的角色。作为窗口管理的骨架,这棵树的构建过程直接决定了各类窗口的显示优先级和交互逻辑。本文将带您深入…...

uni-app项目里用Leaflet.js加载天地图,搞定安卓App兼容(附完整代码)

uni-app集成Leaflet.js加载天地图的安卓兼容方案实战 最近在开发一个需要集成天地图功能的uni-app项目时,发现官方map组件对天地图的支持有限,特别是在安卓端遇到了不少兼容性问题。经过一番摸索和实践,最终通过Leaflet.js结合renderjs的方案…...

Anno 1800 Mod Loader:游戏模组加载器深度解析与实战应用

Anno 1800 Mod Loader:游戏模组加载器深度解析与实战应用 【免费下载链接】anno1800-mod-loader The one and only mod loader for Anno 1800, supports loading of unpacked RDA files, XML merging and Python mods. 项目地址: https://gitcode.com/gh_mirrors/…...

三月七小助手:星穹铁道智能自动化终极指南,解放你的游戏时间

三月七小助手:星穹铁道智能自动化终极指南,解放你的游戏时间 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 还在为《崩坏:星穹铁…...

CAT架构:跨模态Transformer在语音技术中的实践

1. CAT架构概述:音频与语言的Transformer桥梁 在语音技术领域,传统流水线式系统通常将语音识别(ASR)、自然语言处理(NLP)和语音合成(TTS)作为独立模块串联实现。这种架构存在误差累积…...

在Windows上轻松安装安卓应用:APK Installer完全指南

在Windows上轻松安装安卓应用:APK Installer完全指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 让我们探索一种全新的Windows安卓应用安装方式——APK…...

3步掌握Bili2text:B站视频转文字终极指南,让学习效率翻倍!

3步掌握Bili2text:B站视频转文字终极指南,让学习效率翻倍! 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 在信息爆炸的时…...