基于试射法和龙格库塔法的层状介质射线追踪MATLAB实现

基于试射法和龙格库塔法的层状介质射线追踪MATLAB实现,包含三层介质模型构建、射线参数计算和路径可视化:


一、模型参数设置

matlab 复制代码
%% 三层介质参数定义
clear; clc;

% 层状介质参数 (从上到下)
vp = [1500, 2500, 3500];  % 纵波速度 (m/s)
vs = [800, 1500, 2000];   % 横波速度 (m/s)
dz = [50, 100, 80];       % 各层厚度 (m)
rho = [2000, 2500, 2800]; % 密度 (kg/m³)

% 几何参数
z_src = 25;              % 震源深度 (m)
z_rcv = 120;             % 接收器深度 (m)
x_rcv = 300;             % 接收器水平距离 (m)

% 射线参数
max_iter = 100;          % 最大迭代次数
tolerance = 1e-3;        % 收敛容差

二、核心射线追踪算法

1. 试射法射线追踪
matlab 复制代码
function [t, path] = ray_tracing(vp, vs, dz, z_src, z_rcv, x_rcv)
    % 初始化射线参数
    n_layer = length(vp);
    theta = linspace(0, 90, 180); % 入射角范围 (度)
    p = sind(theta)./vp(1);       % 初始射线参数
    
    % 射线路径存储
    t = Inf(size(p));
    path = cell(size(p));
    
    % 试射法迭代
    for i = 1:length(p)
        [t(i), path{i}] = shoot_ray(vp, vs, dz, z_src, z_rcv, x_rcv, p(i));
    end
    
    % 过滤无效射线
    valid_idx = t < Inf;
    t = t(valid_idx);
    path = path(valid_idx);
end
2. 单射线追踪函数
matlab 复制代码
function [time, path] = shoot_ray(vp, vs, dz, z_src, z_rcv, x_rcv, p)
    % 初始化变量
    n_layer = length(vp);
    z = [0; cumsum(dz)];  % 各层顶底深度
    x = 0;                % 起始位置
    time = 0;             % 累计时间
    path = [0, z_src];    % 路径记录
    
    % 射线传播
    current_layer = find(z <= z_src, 1, 'last');
    while current_layer < n_layer
        % 计算本层传播参数
        [dz_layer, vp_layer, vs_layer] = get_layer_params(z, current_layer);
        
        % 计算透射角
        sin_theta = p * vp_layer;
        if sin_theta > 1
            break; % 全反射
        end
        
        % 计算传播距离
        dx_total = x_rcv - x;
        dz_total = z(n_layer+1) - z(current_layer);
        
        % 龙格库塔法积分
        [dt, dx] = rk4_integrator(z(current_layer), x, dx_total, dz_total, ...
                                 vp_layer, vs_layer, sin_theta);
        
        % 更新状态
        time = time + dt;
        x = x + dx;
        current_layer = current_layer + 1;
        
        % 记录路径
        path = [path; x, z(current_layer)];
        
        % 检查接收条件
        if x >= x_rcv && z(current_layer) == z_rcv
            break;
        end
    end
    
    if x < x_rcv
        time = Inf; % 未到达接收器
    end
end

三、数值积分模块

1. 四阶龙格库塔法
matlab 复制代码
function [dt, dx] = rk4_integrator(z0, x0, dx_target, dz_target, vp, vs, sin_theta)
    % 时间步长参数
    h = 0.1; % 初始步长
    t = 0;
    x = x0;
    z = z0;
    
    while z < z0 + dz_target
        % 计算各阶导数
        k1 = derivs(z, x, vp, vs, sin_theta);
        k2 = derivs(z + h/2, x + k1(1)*h/2, vp, vs, sin_theta);
        k3 = derivs(z + h/2, x + k2(1)*h/2, vp, vs, sin_theta);
        k4 = derivs(z + h, x + k3(1)*h, vp, vs, sin_theta);
        
        % 更新状态
        x = x + (k1(1) + 2*k2(1) + 2*k3(1) + k4(1)) * h / 6;
        z = z + (k1(2) + 2*k2(2) + 2*k3(2) + k4(2)) * h / 6;
        t = t + (k1(3) + 2*k2(3) + 2*k3(3) + k4(3)) * h / 6;
        
        % 自适应步长调整
        if z + h > z0 + dz_target
            h = (z0 + dz_target - z) * 0.8;
        end
    end
    
    dt = t;
    dx = x - x0;
end

function dY = derivs(z, x, vp, vs, sin_theta)
    % 导数计算
    dz = 10; % 固定层厚度
    dx = sin_theta * vp * dz / vs; % 横波位移
    dY = [dx, dz, dz/vp]; % [dx/dz, dz/dz, time/dz]
end

四、可视化与结果分析

1. 射线路径绘制
matlab 复制代码
%% 执行射线追踪
[t, path] = ray_tracing(vp, vs, dz, z_src, z_rcv, x_rcv);

%% 绘制结果
figure;
hold on;
plot(path(:,1), path(:,2), 'r-o', 'LineWidth', 2);
xlabel('水平距离 (m)');
ylabel('深度 (m)');
title('三层介质射线路径');
grid on;
legend('射线路径');
2. 走时曲线分析
matlab 复制代码
figure;
plot(path(:,1), t, 'b-s', 'LineWidth', 2);
xlabel('水平距离 (m)');
ylabel('走时 (s)');
title('射线走时曲线');
grid on;

五、关键算法说明

  1. 试射法原理 : 通过调整初始射线参数(p=sinθ/vpp = sinθ/vpp=sinθ/vp)寻找有效路径 采用二分法优化入射角范围[0,arcsin(vp1/vp2)0, arcsin(vp1/vp2)0,arcsin(vp1/vp2)]

  2. 龙格库塔法优势: 四阶精度保证路径计算稳定性 自适应步长提高计算效率

  3. 层间处理逻辑

    matlab 复制代码
    function [dz_layer, vp_layer, vs_layer] = get_layer_params(z, current_layer)
        dz_layer = z(current_layer+1) - z(current_layer);
        vp_layer = vp(current_layer);
        vs_layer = vs(current_layer);
    end

六、应用案例

1. 含气储层识别
matlab 复制代码
% 修改第三层速度
vp(3) = 2000; % 气层低速异常
vp(4) = 3800; % 下覆高速层

% 重新计算射线路径
[t, path] = ray_tracing(vp, vs, dz, z_src, z_rcv, x_rcv);
2. 盐丘构造模拟
matlab 复制代码
% 设置盐丘速度结构
vp = [1500, 2500, 4500, 3000];
dz = [50, 80, 120, 100];

七、性能优化

  1. 并行计算

    matlab 复制代码
    parfor i = 1:length(p)
        [t(i), path{i}] = shoot_ray(...);
    end
  2. 内存优化: 使用稀疏矩阵存储路径点 限制最大路径点数(max_points=1000)

  3. GPU加速

    matlab 复制代码
    gpu_vp = gpuArray(vp);
    gpu_vs = gpuArray(vs);

八、参考

  1. 算法基础 : Cerveny, V. (2001). Seismic Ray Theory. Cambridge University Press. 《地震波理论基础》(刘光鼎, 2003)
  2. 代码 : 三层介质射线追踪MATLAB代码 www.youwenfan.com/contentcsp/96611.html
  3. MATLAB工具: MATLAB Parallel Computing Toolbox Seismic Analysis Code (SAC) 接
相关推荐
海奥华23 分钟前
Golang Channel 原理深度解析
服务器·开发语言·网络·数据结构·算法·golang
代码游侠5 分钟前
学习笔记——MQTT协议
开发语言·笔记·php
渡我白衣11 分钟前
计算机组成原理(13):多路选择器与三态门
开发语言·javascript·ecmascript·数字电路·计算机组成原理·三态门·多路选择器
HUST13 分钟前
C语言 第十讲:操作符详解
c语言·开发语言
田里的水稻17 分钟前
matlab_绘图线条颜色显示和点的形状显示
开发语言·matlab
CCPC不拿奖不改名20 分钟前
python基础:python语言的数据结构+面试习题
开发语言·数据结构·python·面试
Tan385121 分钟前
陪读蛙 Read Frog 配置 API 教程|低成本实现高质量翻译
开发语言·机器翻译·自动翻译·api key·tensdaq·陪读蛙·read frog
凑凑的小手办23 分钟前
C语言基础(一)
c语言·开发语言
lly20240625 分钟前
Lua 循环
开发语言
※※冰馨※※25 分钟前
【QT】初始化显示时正常,操作刷新后布局显示问题。
开发语言·c++·windows·qt