基于试射法和龙格库塔法的层状介质射线追踪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;
五、关键算法说明
-
试射法原理 : 通过调整初始射线参数(p=sinθ/vpp = sinθ/vpp=sinθ/vp)寻找有效路径 采用二分法优化入射角范围[0,arcsin(vp1/vp2)0, arcsin(vp1/vp2)0,arcsin(vp1/vp2)]
-
龙格库塔法优势: 四阶精度保证路径计算稳定性 自适应步长提高计算效率
-
层间处理逻辑:
matlabfunction [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];
七、性能优化
-
并行计算:
matlabparfor i = 1:length(p) [t(i), path{i}] = shoot_ray(...); end -
内存优化: 使用稀疏矩阵存储路径点 限制最大路径点数(max_points=1000)
-
GPU加速:
matlabgpu_vp = gpuArray(vp); gpu_vs = gpuArray(vs);
八、参考
- 算法基础 : Cerveny, V. (2001). Seismic Ray Theory. Cambridge University Press. 《地震波理论基础》(刘光鼎, 2003)
- 代码 : 三层介质射线追踪MATLAB代码 www.youwenfan.com/contentcsp/96611.html
- MATLAB工具: MATLAB Parallel Computing Toolbox Seismic Analysis Code (SAC) 接