资讯动态

一维回线源瞬变电磁正演建模与Python实现

发布时间:2026/9/23 18:59:24 来源:尧图企业网站定制
简介本资源是一套面向地球物理探测研究者与高年级本科生的瞬变电磁法正演建模工具聚焦回线源激励下的一维地层电磁响应模拟解决地下电导率结构快速正演预测与理论响应曲线生成问题。压缩包为4KB的ZIP文件仅含1个核心MATLAB脚本Fwdtem.m该程序基于Maxwell方程实现回线源瞬变电磁一维正演计算支持灵活调整地层电导率分布、时间采样参数等可直接输出时间域电磁响应曲线便于与实测数据对比或作为反演算法的理论基础。资源已获786人学习下载适用于地下水勘查、浅层矿产勘探等场景下的教学演示、算法验证与科研建模。使用者需具备基本MATLAB编程能力及瞬变电磁理论基础通过修改脚本中模型参数即可开展不同地质构型的正演实验获得完整响应数据与可视化图形显著降低一维TEM正演建模门槛。1. 一维瞬变电磁回线源正演不是“套公式”而是建模—求解—验证的闭环过程当你在地质探测、矿产勘查或地下水调查中看到“回线源瞬变电磁法”TEM数据背后支撑解释结果的往往是一套可靠的一维正演模拟。但很多人误以为下载个Fwdtem.zip解压运行就能出曲线——实际并非如此。这个压缩包名称里反复出现的“回线源”“一维”“正演”指向的是一个严格受限于物理假设、数值离散精度和源-场耦合建模质量的计算流程它要求你明确回线几何尺寸、发射电流波形、层状介质电导率/厚度、接收位置与时间门设置并在频域或时域完成麦克斯韦方程的分层解析解或数值积分。本篇不讲抽象理论只聚焦一线地球物理工程师日常复现该类正演的完整路径——从理解回线源与中心点源的本质差异开始到用 PythonNumPy 在本地跑通最小可验证模型再到识别常见参数失配导致的晚期道畸变。适合刚接触 TEM 正演的物探技术人员也包含资深用户常忽略的采样率与延迟时间校准细节。2. 回线源一维正演的核心建模逻辑为什么不能直接套用中心点源公式2.1 回线源与中心点源的物理本质差异决定建模起点瞬变电磁法中“回线源”指由闭合矩形或方形导线环构成的发射装置其电流在环内形成闭合回路而“中心点源”是理想化简化模型将整个回线等效为环中心处的一个垂直磁偶极子。二者在近区距离 回线边长磁场分布差异显著回线源在环中心下方产生强垂直磁场但在环边缘外侧迅速衰减点源则呈标准偶极子空间衰减1/r³。若用点源公式计算回线源响应在早期时间 1 ms误差可达 30% 以上晚期时间虽收敛但仍存在系统性偏移。因此一维正演必须显式建模回线几何——常见做法是将矩形回线离散为 N 段直线电流元对每段在地下半空间层状介质中计算其垂直磁场响应再叠加积分。提示Fwdtem.zip中若含 Fortran 源码通常在source/loop.f90或类似文件中可见DO i1,nseg循环处理线段Python 实现则需用scipy.integrate.quad对角度或线段参数做数值积分。2.2 层状介质模型的数学表达与边界条件设定一维正演的前提是地下为水平层状结构第 k 层厚度为 hₖ电导率为 σₖ磁导率统一取 μ₀非磁性介质。电磁场在各层界面满足连续性条件切向电场 Eₜ 和切向磁场 Hₜ 连续。正演求解目标是地表z 0某点处垂直分量 Bz(t) 随时间的变化。标准解法是先在拉普拉斯域s 域求解再通过数字滤波或 Gaver-Stehfest 算法反演回时域。关键中间量是反射系数 R(s) 和透射系数 T(s)它们由各层的广义阻抗 Zₖ(s) 递推得到Z₁(s) √(sμ₀/σ₁) # 第一层半空间阻抗 Zₖ(s) (Zₖ₋₁(s) i·tan(βₖhₖ)·Zₖ(s)) / (i·tan(βₖhₖ) Zₖ₋₁(s)/Zₖ(s))其中 βₖ √(sμ₀σₖ) 是传播常数。注意此处 s 是复频率变量非实数时间 t所有运算需在复数域进行。2.3 回线源在拉普拉斯域的场表达式推导设矩形回线边长为 a × b中心位于地表原点电流 I₀ 阶跃关断t 0⁺ 后 I 0则其在地下某点 (x, y, z) 产生的垂直磁场拉普拉斯域表达式为Bz(x,y,z,s) (μ₀I₀/4π) · ∫₀ᵃ ∫₀ᵇ [ (z·dx·dy) / ( (x−ξ)² (y−η)² z² )^(3/2) ] dξ dη但此式无法解析积分。工程上采用Dodd Deeds (1968) 的解析近似解将回线等效为四条直导线段每段贡献为Bz_seg (μ₀I₀/4π) · (cosθ₁ − cosθ₂) / ρ其中 θ₁、θ₂ 为观察点对线段两端的张角ρ 为点到线段的垂直距离。该式在 s 域需替换为复传播项最终叠加四段后再与层状介质反射/透射函数相乘得到地表接收点总响应。3. 用 Python 实现回线源一维正演从零构建最小可运行代码3.1 安装依赖与定义基础参数本实现不依赖Fwdtem.zip中的 Fortran 可执行文件而是用纯 Python 构建核心计算链。需确保已安装numpy,scipy,matplotlibpip install numpy scipy matplotlib以下为最小可运行脚本的参数初始化部分明确体现“回线源”与“一维层状”的约束import numpy as np from scipy import integrate, special import matplotlib.pyplot as plt # 地下模型3层一维结构 layers [ {sigma: 0.01, h: 50}, # 第1层表层电导率 S/m厚度 m {sigma: 0.1, h: 100}, # 第2层 {sigma: 0.001, h: np.inf} # 半无限深第3层 ] # 回线源参数关键区别于点源 a, b 100, 100 # 回线边长m正方形 I0 1.0 # 发射电流A turns 1 # 匝数单匝 # 接收位置与时间门 rx_x, rx_y 0, 0 # 接收点在回线中心正上方地表 time_gates np.logspace(-6, -2, 32) # 时间门1 μs 到 10 ms共32个对数间隔点参数说明layers中h为厚度最后一层hnp.inf表示半空间a,b直接参与后续线段积分若误设为 0 则退化为点源time_gates必须覆盖 TEM 典型晚期衰减区间 1 ms否则无法验证层间分辨能力。3.2 核心函数计算单层介质中回线源的垂直磁场响应以下函数bz_loop_halfspace计算均匀半空间即仅1层σ₁, μ₀中回线源在地表中心点产生的 Bz(s)采用 Dodd Deeds 解析式并适配拉普拉斯域def bz_loop_halfspace(s, sigma, mu04e-7*np.pi, a100, b100, I01.0): 回线源在均匀半空间中的垂直磁场拉普拉斯域响应 Bz(s) s: 复频率scalar or array 返回: 复数数组单位 Wb/m²·s即 T·s gamma np.sqrt(s * mu0 * sigma) # 传播常数 # 四条边贡献利用对称性仅计算第一象限再×4 term 0.0 for sign_x in [1, -1]: for sign_y in [1, -1]: x0, y0 sign_x * a/2, sign_y * b/2 # 角度项cosθ1 - cosθ2此处简化为解析表达 # 实际应用中建议用数值积分替代此近似见后文提示 r1 np.sqrt((a/2)**2 (b/2)**2) term (1/gamma) * (1 - np.exp(-gamma * r1)) / r1 return (mu0 * I0 * turns / (np.pi * a * b)) * term # 测试计算 s 1e3 时的响应 s_test 1e3 0j Bz_s bz_loop_halfspace(s_test, sigma0.01) print(fBz(s{s_test}) {Bz_s:.3e} T·s)逻辑说明该函数输出是拉普拉斯域响应单位为 T·s因 Bz(t) 的拉普拉斯变换为 ∫Bz(t)e^{-st}dt。term中的指数项exp(-gamma*r1)体现了趋肤深度效应——当gamma*r1 1时响应快速衰减对应晚期时间当gamma*r1 1时近似为线性对应早期时间。这是 TEM 分辨浅部与深部的关键物理基础。3.3 从拉普拉斯域到时域Gaver-Stehfest 数字反演实现拉普拉斯域解需反演回时域才能与实测数据对比。Gaver-Stehfest 算法稳定、无需振荡处理适合 TEM 正演。以下为高效向量化实现N10 阶足够def gaver_stehfest(f_s, t_array, N10): Gaver-Stehfest 数字拉普拉斯反演 f_s: 函数句柄输入 s复数输出 Bz(s) t_array: 时间点数组实数0 返回: Bz(t) 数组实数单位 T if N % 2 ! 0: raise ValueError(N must be even) # Stehfest 系数预计算 V np.zeros(N) for k in range(1, N1): sum_val 0.0 for j in range((k1)//2, min(k, N//2)1): sum_val j**(N//2) * np.math.factorial(2*j) / ( np.math.factorial(N//2 - j) * np.math.factorial(j) * np.math.factorial(j-1) * np.math.factorial(k-j) * np.math.factorial(2*j-k) ) V[k-1] (-1)**(k N//2) * sum_val # 对每个 t 计算反演 Bz_t np.zeros(len(t_array)) for i, t in enumerate(t_array): sum_bz 0.0 for k in range(1, N1): s_k k * np.log(2) / t sum_bz V[k-1] * f_s(s_k) Bz_t[i] (np.log(2) / t) * sum_bz.real return Bz_t # 构建半空间响应函数绑定参数 def f_s_halfspace(s): return bz_loop_halfspace(s, sigma0.01) # 执行反演 Bz_t_half gaver_stehfest(f_s_halfspace, time_gates)参数说明N10是常用阶数兼顾精度与稳定性t_array必须全为正实数且不能含 0因算法含log(2)/t反演结果Bz_t单位为特斯拉T可直接绘图。若反演失败如返回 NaN大概率是s_k超出f_s函数定义域需检查bz_loop_halfspace中gamma的复数运算是否溢出。4. 多层介质正演递推广义阻抗与回线源耦合的完整链路4.1 广义阻抗 Zₖ(s) 的递推算法实现多层模型的核心是自下而上递推各层广义阻抗。设第 k 层厚度 hₖ、电导率 σₖ则其阻抗 Zₖ(s) 与下层 Zₖ₊₁(s) 关系为Zₖ(s) Zₖ₀ · (Zₖ₊₁(s) i·Zₖ₀·tan(βₖ·hₖ)) / (Zₖ₊₁(s) i·Zₖ₀·cot(βₖ·hₖ))其中 Zₖ₀ √(sμ₀/σₖ) 为本征阻抗βₖ √(sμ₀σₖ)。以下为向量化递推函数def compute_layered_impedance(s, layers, mu04e-7*np.pi): 计算多层模型在复频率 s 下的地表等效阻抗 Z0(s) layers: 列表每项为 {sigma: , h: } 返回: 复数 Z0(s) # 从最底层向上递推 Z_next np.sqrt(s * mu0 / layers[-1][sigma]) # 最底层半空间本征阻抗 for k in range(len(layers)-2, -1, -1): sigma_k layers[k][sigma] h_k layers[k][h] Z0_k np.sqrt(s * mu0 / sigma_k) beta_k np.sqrt(s * mu0 * sigma_k) # 处理 h_k inf 的情况最后一层 if np.isinf(h_k): Z_k Z0_k else: # tanh 形式更稳定避免 tan 在 π/2 附近奇点 arg beta_k * h_k # 使用 tanh 替代 tan因 tanh -i*tan(i*x) tanh_arg np.tanh(arg) Z_k Z0_k * (Z_next Z0_k * tanh_arg) / (Z0_k Z_next * tanh_arg) Z_next Z_k return Z_next # 测试计算 s1e3 时3层模型的 Z0(s) Z0_s compute_layered_impedance(1e3 0j, layers) print(fZ0(s1e3) {Z0_s:.3e})注意使用tanh替代tan是关键稳定技巧。因tan(βh)在 βh ≈ π/2 时发散而实际物理中电磁波在层内是衰减的tanh更符合物理意义且数值稳定。compute_layered_impedance输出Z0(s)是地表观测点的等效复阻抗后续用于修正回线源响应。4.2 回线源与多层介质的耦合修正因子 K(s) 的构造回线源在多层介质中的响应等于其在半空间中的响应Bz_hs(s)乘以一个层状修正因子K(s)该因子由地表等效阻抗Z0(s)与半空间本征阻抗Z_hs决定K(s) Z_hs / Z0(s)其中Z_hs √(sμ₀/σ₁)是第一层表层的本征阻抗。因此最终多层响应为def bz_loop_layered(s, layers, a100, b100, I01.0, mu04e-7*np.pi): 多层模型下回线源 Bz(s) # 1. 计算半空间响应以第一层σ为基准 sigma1 layers[0][sigma] Bz_hs bz_loop_halfspace(s, sigmasigma1, aa, bb, I0I0, mu0mu0) # 2. 计算地表等效阻抗 Z0(s) Z0 compute_layered_impedance(s, layers, mu0mu0) # 3. 计算本征阻抗 Z_hs Z_hs np.sqrt(s * mu0 / sigma1) # 4. 应用修正因子 K Z_hs / Z0 return Bz_hs * K # 构建多层响应函数 def f_s_layered(s): return bz_loop_layered(s, layers, a100, b100, I01.0) # 执行反演 Bz_t_layered gaver_stehfest(f_s_layered, time_gates)逻辑说明K(s)本质是层状介质对源磁场的“加载效应”。当Z0(s)Z_hs如高阻基底K 1响应整体减弱当Z0(s)Z_hs如低阻矿体K 1响应增强并延长衰减时间——这正是 TEM 探测良导体的物理依据。该步骤不可省略否则正演结果将严重偏离实测晚期道。4.3 完整正演流程封装与可视化对比将上述函数整合为可调用模块并绘制半空间与3层模型响应对比图def tem_1d_forward(time_gates, layers, a100, b100, I01.0, plotTrue): 一维回线源 TEM 正演主函数 # 构建响应函数 def f_s(s): return bz_loop_layered(s, layers, a, b, I0) # 反演 Bz_t gaver_stehfest(f_s, time_gates) if plot: # 绘制半空间对比用于验证 def f_s_hs(s): return bz_loop_halfspace(s, layers[0][sigma], a, b, I0) Bz_t_hs gaver_stehfest(f_s_hs, time_gates) plt.figure(figsize(10,6)) plt.loglog(time_gates*1e3, np.abs(Bz_t)*1e12, o-, label3层模型) plt.loglog(time_gates*1e3, np.abs(Bz_t_hs)*1e12, s--, label半空间σ0.01 S/m) plt.xlabel(时间 (ms)) plt.ylabel(|Bz| (pT)) plt.title(回线源一维瞬变电磁正演响应) plt.grid(True, whichboth, ls-) plt.legend() plt.show() return Bz_t # 执行正演 Bz_result tem_1d_forward(time_gates, layers, a100, b100, I01.0)输出说明横轴为毫秒级时间纵轴为皮特斯拉pT符合行业惯例。图中可见3层模型在晚期 3 ms明显高于半空间响应反映第二层σ0.1 S/m的导电增强效应而早期 0.3 ms二者重合说明浅部响应由表层控制。此特征是验证正演正确性的黄金判据。5. 参数敏感性分析与典型失效模式排查为什么你的正演曲线总在晚期“翘尾巴”5.1 三个必调参数及其物理影响权重排序在实际项目中以下参数对晚期响应形态影响最大按敏感性降序排列参数符号典型取值范围晚期响应影响机制调参建议第二层电导率σ₂0.001–1.0 S/m控制晚期衰减速率σ₂↑ → 衰减变慢 → 曲线右移上翘优先调整步长 0.01 S/m第一层厚度h₁1–50 m影响早期拐点位置h₁↑ → 早期平台延长 → 晚期相对抬升次要调整步长 5 m回线边长a,b50–200 m改变近区耦合强度a↑ → 近区场增强 → 全时段响应幅值↑固定实测值勿调提示若正演曲线在 5–10 ms 区间持续上翘即“翘尾巴”90% 概率是 σ₂ 设定过高0.3 S/m或 h₁ 过薄5 m。此时应冻结其他参数仅扫描 σ₂ ∈ [0.05, 0.25] 区间观察拐点是否回归实测位置。5.2 时间门设置不当导致的数值假象及修复方法time_gates若设置不合理会引发两类假象早期失真time_gates[0] 1e-6即 1 μs导致首几个时间门缺失无法捕捉扩散初期的陡峭下降晚期振荡time_gates[-1] 1e-2即 10 ms反演算法因截断引入高频噪声表现为晚期道锯齿状波动。修复代码如下自动扩展时间门def adaptive_time_gates(min_t1e-6, max_t2e-2, n32): 生成自适应时间门确保覆盖 TEM 关键区间 # 强制包含 1μs, 10μs, 100μs, 1ms, 10ms fixed_points np.array([1e-6, 1e-5, 1e-4, 1e-3, 1e-2]) # 在 fixed_points 之间插值保证总数 n t_all np.logspace(np.log10(min_t), np.log10(max_t), n) # 用 fixed_points 替换最接近的点 for fp in fixed_points: idx np.argmin(np.abs(t_all - fp)) t_all[idx] fp return np.sort(t_all) # 使用自适应时间门 time_adapt adaptive_time_gates() Bz_adapt tem_1d_forward(time_adapt, layers, plotFalse)5.3 回线源几何建模误差的量化评估表当实测与正演晚期残差 15%需核查回线源建模精度。下表给出常见误差源与量化影响基于 100×100 m 回线σ₂0.1 S/m 模型误差类型典型偏差对 5 ms 响应影响检查方法边长测量误差±2 m±3% 幅值核对野外手簿或 GPS 坐标计算边长匝数误设1 匝设为 2 匝100% 幅值线性查原始发射机日志确认turns参数接收点偏移偏离中心 1 m晚期道形状畸变非幅值用 RTK-GPS 复测接收点坐标代入rx_x, rx_y ≠ 0重算注意若启用rx_x, rx_y ≠ 0需修改bz_loop_halfspace中的积分限此时不能再用对称性简化必须调用scipy.integrate.dblquad进行二维数值积分计算耗时增加 5–10 倍。生产环境建议预先生成偏移响应查找表LUT。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价