mcpField
S
simpeg

simpeg

github.com/steadfastasart数据与数据库7361 次安装6 周前更新
代码仓库

关于 simpeg

simpeg 是用于地球物理模拟与反演的 Python 技能,面向研究人员,涵盖网格、测量配置、正演和反演流程,并支持多种地球物理方法。

主要功能

  1. 01TensorMesh 与 TreeMesh 网格离散
  2. 02测量与模拟配置
  3. 03正演建模
  4. 04数据失配与正则化
  5. 05反演流程指导

适用场景

  1. 01构建直流电阻率测量模型
  2. 02反演观测地球物理数据
  3. 03设置自定义正演建模
  4. 04联合反演多组数据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/steadfastasart/geoscience-skills --skill simpeg

安装后在 Claude Code 中输入/simpeg确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
mesh_types.md
survey_types.md
scripts/
dc_inversion.py

详细介绍

SimPEG - 地球物理模拟与反演

快速参考

from discretize import TensorMesh
from simpeg.electromagnetics.static import resistivity as dc
from simpeg import maps, data_misfit, regularization, optimization
from simpeg import inverse_problem, inversion, directives
import numpy as np

# Create mesh
hx, hz = np.ones(100) * 10, np.ones(50) * 5
mesh = TensorMesh([hx, hz], origin='CN')

# Forward model
simulation = dc.Simulation2DNodal(mesh, survey=survey, sigmaMap=maps.ExpMap(mesh))
dpred = simulation.dpred(model)

# Inversion
dmis = data_misfit.L2DataMisfit(data=data, simulation=simulation)
reg = regularization.WeightedLeastSquares(mesh)
opt = optimization.InexactGaussNewton(maxIter=20)
inv_prob = inverse_problem.BaseInvProblem(dmis, reg, opt)
inv = inversion.BaseInversion(inv_prob, directiveList=[...])
mrec = inv.run(m0)

关键类

类用途
TensorMesh, TreeMesh离散化(规则网格、自适应八叉树)
Survey数据采集几何结构
Simulation正演建模引擎
Data观测数据/预测数据容器
InvProblem组合失配、正则化和优化

基本操作

创建网格
from discretize import TensorMesh

# 2D mesh (x, z) - centered in x, top at z=0
hx, hz = np.ones(100) * 20, np.ones(50) * 10
mesh = TensorMesh([hx, hz], origin='CN')

# 3D mesh
mesh = TensorMesh([np.ones(50)*25, np.ones(50)*25, np.ones(30)*10], origin='CCN')
直流电阻率测量
from simpeg.electromagnetics.static import resistivity as dc

elec_locs = np.c_[np.linspace(-95, 95, 20), np.zeros(20)]
source_list = []
for i in range(17):  # dipole-dipole
    rx = dc.receivers.Dipole(elec_locs[[i+2]], elec_locs[[i+3]])
    src = dc.sources.Dipole([rx], elec_locs[i], elec_locs[i+1])
    source_list.append(src)
survey = dc.Survey(source_list)
正演模型
model = np.ones(mesh.nC) * 100  # 100 ohm-m
simulation = dc.Simulation2DNodal(mesh, survey=survey, sigmaMap=maps.ExpMap(mesh))
dpred = simulation.dpred(np.log(1/model))  # input: log(conductivity)
反演
from simpeg import data_misfit, regularization, optimization
from simpeg import inverse_problem, inversion, directives, data

obs_data = data.Data(survey, dobs=dobs, standard_deviation=0.05*np.abs(dobs))
dmis = data_misfit.L2DataMisfit(data=obs_data, simulation=simulation)
reg = regularization.WeightedLeastSquares(mesh, alpha_s=1e-4, alpha_x=1, alpha_z=1)
opt = optimization.InexactGaussNewton(maxIter=20)
inv_prob = inverse_problem.BaseInvProblem(dmis, reg, opt)
dir_list = [directives.BetaSchedule(coolingFactor=2), directives.TargetMisfit()]
inv = inversion.BaseInversion(inv_prob, directiveList=dir_list)
mrec = inv.run(m0)

常用映射

映射描述使用场景
IdentityMap不进行变换磁化率、密度
ExpMapexp(m)对数参数化的电导率
ReciprocalMap1/m电阻率转换为电导率
Wires拆分模型联合反演

物性范围

物性典型范围单位
电阻率1 - 10000ohm-m
电导率0.0001 - 1S/m
磁化率0 - 0.1SI
密度差-1 to 1g/cc

何时使用及替代方案

场景建议
多方法地球物理反演(直流电、磁法、重力、电磁法)SimPEG - 方法覆盖面最广
使用标准阵列的近地表 ERTpyGIMLi - API 更简单,内置阵列支持
专注于 ERT 且需要 GUI 导出功能的反演pyGIMLi - ERT 专用工具更完善
使用灵活物理模型的自定义正演建模SimPEG - 模块化设计,易于扩展
多种地球物理数据集的联合反演SimPEG - 通过 Wires 映射内置支持
商业 ERT 处理Res2DInv / Res3DInv - 行业标准

选择 SimPEG 的情况:需要适用于多种地球物理方法的统一框架、自定义正演算子或研究级灵活性。其模块化设计(网格 + 测量 + 模拟 + 反演)适合复杂和非标准问题。

避免使用 SimPEG 的情况:只需要标准 ERT 反演(pyGIMLi 的配置速度更快),或需要开箱即用的商业解决方案。

常见工作流

根据测量数据进行直流电阻率反演
  • 定义电极位置,并构建偶极-偶极(或其他)测量几何结构
  • 使用适当的单元尺寸创建 TensorMesh 或 TreeMesh
  • 使用网格、测量和 ExpMap 设置 dc.Simulation2DNodal
  • 将观测数据及标准差载入 data.Data
  • 配置 L2DataMisfit、WeightedLeastSquares 正则化和优化器
  • 设置指令:BetaSchedule、TargetMisfit
  • 构建 BaseInvProblem 和 BaseInversion
  • 使用均匀初始模型运行反演:inv.run(m0)
  • 绘制恢复模型,并比较观测数据与预测数据
  • 检查数据失配的收敛情况(目标卡方值约为 1)

提示

  1. 使用对数参数表示正值物性(电阻率、磁化率)
  2. 从粗网格开始,并在初步测试后细化
  3. 检查数据拟合情况:绘制观测数据与预测数据
  4. 调整正则化,平衡数据拟合和模型平滑度
  5. 在三维问题中使用 TreeMesh,以提高效率

参考资料

脚本

评论

支持 Markdown