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

MATLAB实现直流电法和大地电磁法的一维正演计算

MATLAB实现直流电法和大地电磁法的一维正演计算。这两种方法是地球物理勘探中常用的电法勘探技术。

直流电法一维正演

%% 直流电法一维正演计算
function dc_1d_forward()clear; close all; clc;fprintf('=== 直流电法一维正演计算 ===\n\n');% 模型参数设置model = set_model_parameters();% 计算理论视电阻率[ab2, apparent_resistivity] = calculate_dc_response(model);% 显示结果display_results(model, ab2, apparent_resistivity);% 绘制结果plot_results(model, ab2, apparent_resistivity);
end%% 设置模型参数
function model = set_model_parameters()% 层参数: [厚度(m), 电阻率(Ω·m)]% 最后一层厚度设为Inf(半无限空间)model.layers = [10, 100;    % 第一层: 厚度10m, 电阻率100 Ω·m20, 500;    % 第二层: 厚度20m, 电阻率500 Ω·mInf, 50     % 第三层: 基岩, 电阻率50 Ω·m];% 测量装置参数model.electrode_type = 'Wenner';  % 装置类型: 'Wenner', 'Schlumberger', 'DipoleDipole'model.min_ab = 1;                 % 最小AB/2距离 (m)model.max_ab = 100;               % 最大AB/2距离 (m)model.num_measurements = 20;      % 测点数fprintf('模型参数设置:\n');fprintf('层数: %d\n', size(model.layers, 1));for i = 1:size(model.layers, 1)if isinf(model.layers(i, 1))fprintf('  第%d层: 基岩, 电阻率 = %.1f Ω·m\n', i, model.layers(i, 2));elsefprintf('  第%d层: 厚度 = %.1f m, 电阻率 = %.1f Ω·m\n', i, model.layers(i, 1), model.layers(i, 2));endendfprintf('装置类型: %s\n', model.electrode_type);
end%% 计算直流电法响应
function [ab2, apparent_resistivity] = calculate_dc_response(model)% 生成AB/2距离(对数均匀分布)ab2 = logspace(log10(model.min_ab), log10(model.max_ab), model.num_measurements)';apparent_resistivity = zeros(size(ab2));for i = 1:length(ab2)switch model.electrode_typecase 'Wenner'% 温纳装置apparent_resistivity(i) = wenner_apparent_resistivity(model, ab2(i));case 'Schlumberger'% 施伦贝谢装置apparent_resistivity(i) = schlumberger_apparent_resistivity(model, ab2(i));case 'DipoleDipole'% 偶极-偶极装置apparent_resistivity(i) = dipole_dipole_apparent_resistivity(model, ab2(i));endend
end%% 温纳装置视电阻率计算
function rho_a = wenner_apparent_resistivity(model, AB2)% 温纳装置: AM = MN = NB = AB/3AM = AB2 / 3;rho_a = calculate_potential(model, AM) * 2 * pi * AM;
end%% 施伦贝谢装置视电阻率计算
function rho_a = schlumberger_apparent_resistivity(model, AB2)% 施伦贝谢装置: MN << ABMN = AB2 / 50;  % MN远小于ABAM = (AB2 - MN) / 2;potential_diff = calculate_potential(model, AM) - calculate_potential(model, AM + MN);rho_a = pi * AM * (AM + MN) * potential_diff / MN;
end%% 偶极-偶极装置视电阻率计算
function rho_a = dipole_dipole_apparent_resistivity(model, AB2)% 偶极-偶极装置r = AB2;  % 偶极中心距离rho_a = calculate_potential(model, r) * pi * r^3 / (1 * 1);  % 假设偶极矩为1
end%% 计算电位
function potential = calculate_potential(model, r)% 使用线性滤波法计算层状介质中的电位% 这里使用简化算法,实际应用中可能需要更复杂的数值方法n_layers = size(model.layers, 1);resistivities = model.layers(:, 2);thicknesses = model.layers(1:end-1, 1);% 计算反射系数序列reflection_coeffs = calculate_reflection_coefficients(resistivities);% 计算核函数kernel = calculate_kernel_function(r, thicknesses, reflection_coeffs);potential = kernel / (2 * pi * resistivities(1));
end%% 计算反射系数
function R = calculate_reflection_coefficients(resistivities)n = length(resistivities);R = zeros(n-1, 1);for i = 1:n-1k_i = (resistivities(i+1) - resistivities(i)) / (resistivities(i+1) + resistivities(i));R(i) = k_i;end
end%% 计算核函数(简化版本)
function kernel = calculate_kernel_function(r, thicknesses, reflection_coeffs)% 简化的一维核函数计算% 实际应用中可能需要使用线性滤波法或数值积分kernel = 1/r;  % 均匀半空间项% 添加层状介质修正(简化处理)for i = 1:length(reflection_coeffs)depth = sum(thicknesses(1:i));kernel = kernel + reflection_coeffs(i) / sqrt(r^2 + (2*depth)^2);end
end%% 显示结果
function display_results(model, ab2, apparent_resistivity)fprintf('\n=== 计算结果 ===\n');fprintf('AB/2(m)\t视电阻率(Ω·m)\n');fprintf('-------------------\n');for i = 1:length(ab2)fprintf('%.1f\t%.1f\n', ab2(i), apparent_resistivity(i));end
end%% 绘制结果
function plot_results(model, ab2, apparent_resistivity)figure('Position', [100, 100, 1200, 500]);% 子图1: 理论模型subplot(1, 2, 1);plot_model(model);title('一维地电模型');% 子图2: 视电阻率曲线subplot(1, 2, 2);semilogx(ab2, apparent_resistivity, 'b-o', 'LineWidth', 2, 'MarkerSize', 4);xlabel('AB/2 (m)');ylabel('视电阻率 (\Omega\cdotm)');title([model.electrode_type '装置视电阻率曲线']);grid on;% 添加真实电阻率参考线hold on;colors = ['r', 'g', 'b', 'm', 'c'];for i = 1:size(model.layers, 1)yline(model.layers(i, 2), '--', ...sprintf('第%d层: %.1f Ω·m', i, model.layers(i, 2)), ...'Color', colors(mod(i-1, length(colors))+1));endlegend('视电阻率', 'Location', 'best');
end%% 绘制地电模型
function plot_model(model)depth = 0;max_resistivity = max(model.layers(:, 2));for i = 1:size(model.layers, 1)if i == size(model.layers, 1)% 最后一层rectangle('Position', [0, depth, max_resistivity*1.2, 50], ...'FaceColor', [0.8 0.8 1], 'EdgeColor', 'k');text(max_resistivity*0.6, depth+25, ...sprintf('电阻率: %.1f Ω·m', model.layers(i, 2)), ...'HorizontalAlignment', 'center');else% 中间层rectangle('Position', [0, depth, max_resistivity*1.2, model.layers(i, 1)], ...'FaceColor', [0.8 0.8 1], 'EdgeColor', 'k');text(max_resistivity*0.6, depth+model.layers(i, 1)/2, ...sprintf('厚度: %.1f m\n电阻率: %.1f Ω·m', ...model.layers(i, 1), model.layers(i, 2)), ...'HorizontalAlignment', 'center');depth = depth + model.layers(i, 1);endendset(gca, 'YDir', 'reverse');xlabel('电阻率 (\Omega\cdotm)');ylabel('深度 (m)');xlim([0, max_resistivity*1.2]);ylim([0, depth+50]);
end

大地电磁法一维正演

%% 大地电磁法一维正演计算
function mt_1d_forward()clear; close all; clc;fprintf('=== 大地电磁法一维正演计算 ===\n\n');% 模型参数设置model = set_mt_model_parameters();% 计算MT响应[periods, apparent_resistivity, phase] = calculate_mt_response(model);% 显示结果display_mt_results(model, periods, apparent_resistivity, phase);% 绘制结果plot_mt_results(model, periods, apparent_resistivity, phase);
end%% 设置MT模型参数
function model = set_mt_model_parameters()% 层参数: [厚度(m), 电阻率(Ω·m)]model.layers = [1000, 100;   % 第一层: 沉积层5000, 10;    % 第二层: 低阻层Inf, 1000    % 第三层: 高阻基底];% 频率范围 (Hz)model.min_freq = 1e-4;   % 0.0001 Hzmodel.max_freq = 1e3;    % 1000 Hzmodel.num_periods = 30;  % 周期点数fprintf('MT模型参数设置:\n');fprintf('层数: %d\n', size(model.layers, 1));for i = 1:size(model.layers, 1)if isinf(model.layers(i, 1))fprintf('  第%d层: 基底, 电阻率 = %.1f Ω·m\n', i, model.layers(i, 2));elsefprintf('  第%d层: 厚度 = %.1f m, 电阻率 = %.1f Ω·m\n', i, model.layers(i, 1), model.layers(i, 2));endend
end%% 计算MT响应
function [periods, apparent_resistivity, phase] = calculate_mt_response(model)% 生成周期序列(对数均匀分布)frequencies = logspace(log10(model.max_freq), log10(model.min_freq), model.num_periods);periods = 1 ./ frequencies;apparent_resistivity = zeros(size(periods));phase = zeros(size(periods));for i = 1:length(periods)[apparent_resistivity(i), phase(i)] = calculate_impedance(model, periods(i));end
end%% 计算阻抗
function [apparent_resistivity, phase] = calculate_impedance(model, T)% 使用递推算法计算层状介质中的MT阻抗omega = 2 * pi / T;  % 角频率mu0 = 4 * pi * 1e-7; % 真空磁导率n_layers = size(model.layers, 1);resistivities = model.layers(:, 2);thicknesses = model.layers(1:end-1, 1);% 从最底层开始递推Z = sqrt(1i * omega * mu0 * resistivities(end));for k = n_layers-1:-1:1rho_k = resistivities(k);h_k = thicknesses(k);% 波数k_k = sqrt(1i * omega * mu0 / rho_k);% 层阻抗Z_k = sqrt(1i * omega * mu0 * rho_k);% 递推公式Z = Z_k * (Z * cosh(k_k * h_k) + Z_k * sinh(k_k * h_k)) / ...(Z_k * cosh(k_k * h_k) + Z * sinh(k_k * h_k));end% 计算视电阻率和相位apparent_resistivity = (abs(Z)^2) / (omega * mu0);phase = atan2(imag(Z), real(Z)) * 180 / pi;
end%% 显示MT结果
function display_mt_results(model, periods, apparent_resistivity, phase)fprintf('\n=== MT计算结果 ===\n');fprintf('周期(s)\t视电阻率(Ω·m)\t相位(°)\n');fprintf('--------------------------------\n');for i = 1:length(periods)fprintf('%.2e\t%.1f\t\t%.1f\n', periods(i), apparent_resistivity(i), phase(i));end
end%% 绘制MT结果
function plot_mt_results(model, periods, apparent_resistivity, phase)figure('Position', [100, 100, 1200, 800]);% 子图1: 理论模型subplot(2, 2, 1);plot_mt_model(model);title('一维MT地电模型');% 子图2: 视电阻率曲线subplot(2, 2, 2);loglog(periods, apparent_resistivity, 'b-o', 'LineWidth', 2, 'MarkerSize', 4);xlabel('周期 (s)');ylabel('视电阻率 (\Omega\cdotm)');title('MT视电阻率曲线');grid on;% 子图3: 相位曲线subplot(2, 2, 3);semilogx(periods, phase, 'r-s', 'LineWidth', 2, 'MarkerSize', 4);xlabel('周期 (s)');ylabel('相位 (°)');title('MT相位曲线');grid on;% 子图4: 视电阻率和相位的联合图subplot(2, 2, 4);yyaxis left;loglog(periods, apparent_resistivity, 'b-o', 'LineWidth', 2);ylabel('视电阻率 (\Omega\cdotm)');yyaxis right;semilogx(periods, phase, 'r-s', 'LineWidth', 2);ylabel('相位 (°)');xlabel('周期 (s)');title('MT响应曲线');grid on;legend('视电阻率', '相位', 'Location', 'best');
end%% 绘制MT地电模型
function plot_mt_model(model)depth = 0;max_resistivity = max(model.layers(:, 2));for i = 1:size(model.layers, 1)if i == size(model.layers, 1)% 最后一层rectangle('Position', [0, depth, max_resistivity*1.2, max(1000, depth*0.2)], ...'FaceColor', [1 0.8 0.8], 'EdgeColor', 'k');text(max_resistivity*0.6, depth+max(1000, depth*0.2)/2, ...sprintf('电阻率: %.1f Ω·m', model.layers(i, 2)), ...'HorizontalAlignment', 'center');else% 中间层rectangle('Position', [0, depth, max_resistivity*1.2, model.layers(i, 1)], ...'FaceColor', [1 0.8 0.8], 'EdgeColor', 'k');text(max_resistivity*0.6, depth+model.layers(i, 1)/2, ...sprintf('厚度: %.1f m\n电阻率: %.1f Ω·m', ...model.layers(i, 1), model.layers(i, 2)), ...'HorizontalAlignment', 'center');depth = depth + model.layers(i, 1);endendset(gca, 'YDir', 'reverse');xlabel('电阻率 (\Omega\cdotm)');ylabel('深度 (m)');xlim([0, max_resistivity*1.2]);
end%% 主程序 - 运行两个正演计算
function main()fprintf('地球物理电法一维正演计算程序\n\n');% 运行直流电法正演dc_1d_forward();fprintf('\n\n');% 运行大地电磁法正演mt_1d_forward();
end% 运行主程序
main();

特点:

直流电法部分:

  1. 支持多种装置:温纳、施伦贝谢、偶极-偶极
  2. 层状模型:可定义多层地电结构
  3. 可视化:显示地电模型和视电阻率曲线
  4. 理论计算:基于反射系数法的简化正演

大地电磁法部分:

  1. 频域响应:计算不同周期的MT响应
  2. 阻抗计算:使用递推算法计算层状介质阻抗
  3. 完整参数:输出视电阻率和相位
  4. 多图显示:分别显示模型、视电阻率、相位曲线

参考代码

使用:

  1. 修改模型参数:在set_model_parameters函数中调整层参数
  2. 选择装置类型:直流电法支持三种常用装置
  3. 调整测量参数:设置合适的测量范围和点数
  4. 运行分析:程序会自动计算并显示结果

扩展:

  1. 添加数据反演功能
  2. 支持更复杂的二维、三维模型
  3. 添加噪声模拟和数据处理
  4. 集成实际野外数据导入

参考

  • 直流电测深正演报告. 百度文库, 2023. wenku.baidu.com/view/f9f53fc8adf8941ea76e58fafab069dc51224775.html

  • 代码 直流电法和大地电磁一维正演计算 www.youwenfan.com/contentcsi/65321.html

  • 大地电磁一维正演理论. 中国知网, 2025.

http://www.dtcms.com/a/469536.html

相关文章:

  • IBM 开源轻量级多模态文档理解模型 Granite-Docling:258M 参数,精准还原 PDF、截图中的公式、表格与代码
  • Python PDF文档加密与保护:确保你的文件安全
  • 【Conda】Conda虚拟环境配置系统环境变量,Jupter可使用
  • 网站网页和网址的关系湘潭seo
  • 对象集合里的id用逗号拼装几种方式
  • 框架--MybatisPlus
  • Coze源码分析-资源库-编辑数据库-前端源码-核心逻辑与接口
  • TikTok SDE OA 2025 真题解析与秋招趋势
  • idea 中 mapper.xml黄线警告怎么去掉
  • NXP - MDK460的调试设置
  • 15.UE-游戏逆向-DumpUE struct
  • 百度统计api兰州企业网站排名优化
  • 网站右下角悬浮窗口js代码 兼容各浏览器页面置换算法课程设计
  • NeurIPS 2025 | 华中科大小米等提出语义提示扩散Transformer,实现精准深度估计新范式!
  • Ansible-playbook剧本
  • Mata Summon - Transform text prompts or photos into dynamic.
  • Arbess从入门到实战(11) - 使用Arbess+GitLab实现C++项目自动化部署
  • 做视频网站版权怎么解决企业建站费用情况
  • AICC2025 智算中心与算力服务论坛顺利举办
  • 卷积神经网络CNN(五): 标准CNN神经网络
  • Python 实现 Excel 文件加密与保护
  • 如何查找网站死链网站建设服务费属于
  • 容器编排大王Kubernetes——介绍与部署(1)
  • Python3 中级练习:简易库存管理系统
  • Centos 7/8 安装 Redis
  • 高通平台蓝牙学习--揭秘 WCN Split A2DP(终章)
  • 工业设计网站哪家好包头建设工程安全监督站网站
  • 云原生-k8s
  • 大型手游可以在云手机中流畅运行吗
  • 移动端云手机的优势都有哪些?