MATLAB面波频散曲线反演程序

MATLAB面波频散曲线反演程序,用于从观测频散曲线反演地下横波速度结构。

matlab 复制代码
%% 面波频散曲线反演程序(Rayleigh波)
clear all; close all; clc;

%% 1. 参数设置
fprintf('========== 面波频散曲线反演程序 ==========\n');
fprintf('作者: MATLAB反演工具箱\n');
fprintf('日期: %s\n\n', datestr(now));

% 1.1 基本参数
params = struct();
params.wave_type = 'Rayleigh';  % 波类型: 'Rayleigh' 或 'Love'
params.mode = 1;                % 模态: 0=基阶, 1=一阶, 等等
params.max_iter = 100;          % 最大迭代次数
params.pop_size = 50;           % 种群大小(用于全局优化)
params.tolerance = 1e-4;        % 收敛容差

% 1.2 频率范围
params.freq_min = 0.1;          % 最小频率 (Hz)
params.freq_max = 50;           % 最大频率 (Hz)
params.nfreq = 50;              % 频率点数
params.freq = logspace(log10(params.freq_min), log10(params.freq_max), params.nfreq)';

% 1.3 初始模型参数(层状介质)
% 格式: [厚度(m), Vp(m/s), Vs(m/s), 密度(g/cm³)]
params.initial_model = [
    5,   500,  200,  1.8;    % 第1层
    10,  1000, 400,  1.9;    % 第2层
    20,  1500, 600,  2.0;    % 第3层
    inf, 2000, 800,  2.2;    % 半空间
];

% 1.4 参数约束(用于反演)
% 格式: [最小值, 最大值] 对于 Vs
params.vs_bounds = [100, 2000];  % Vs约束 (m/s)
params.thickness_bounds = [1, 50]; % 厚度约束 (m)

%% 2. 生成"真实"模型和观测数据(仿真)
fprintf('生成仿真观测数据...\n');
true_model = [
    5,   550,  250,  1.8;
    12,  1200, 450,  1.9;
    25,  1800, 700,  2.0;
    inf, 2500, 950,  2.2;
];

% 计算真实模型的频散曲线
fprintf('计算真实模型频散曲线...\n');
[true_phase_vel, true_group_vel, true_modes] = compute_dispersion_curve(true_model, params.freq, params.wave_type);

% 添加噪声模拟观测误差
noise_level = 0.02;  % 2%噪声
observed_phase_vel = true_phase_vel .* (1 + noise_level * randn(size(true_phase_vel)));
observed_group_vel = true_group_vel .* (1 + noise_level * randn(size(true_group_vel)));

% 计算理论误差(数据协方差矩阵)
data_errors = noise_level * abs(true_phase_vel);
data_covariance = diag(data_errors.^2);

fprintf('观测数据生成完成:\n');
fprintf('  频率范围: %.1f - %.1f Hz\n', params.freq_min, params.freq_max);
fprintf('  数据点数: %d\n', params.nfreq);
fprintf('  噪声水平: %.1f%%\n', noise_level*100);

%% 3. 正演计算(频散曲线计算)
fprintf('\n测试正演计算...\n');
[test_phase, test_group, test_modes] = compute_dispersion_curve(params.initial_model, params.freq, params.wave_type);

% 计算初始模型的拟合误差
initial_misfit = compute_misfit(observed_phase_vel, test_phase, data_covariance);
fprintf('初始模型 misfit: %.4f\n', initial_misfit);

%% 4. 反演方法选择
fprintf('\n选择反演方法:\n');
fprintf('  1. 粒子群优化 (PSO)\n');
fprintf('  2. 遗传算法 (GA)\n');
fprintf('  3. 模拟退火 (SA)\n');
fprintf('  4. 最小二乘 (Levenberg-Marquardt)\n');
method_choice = 1;  % 默认为PSO

switch method_choice
    case 1
        fprintf('选择: 粒子群优化 (PSO)\n');
        [inverted_model, history] = invert_pso(observed_phase_vel, params, data_covariance);
    case 2
        fprintf('选择: 遗传算法 (GA)\n');
        [inverted_model, history] = invert_ga(observed_phase_vel, params, data_covariance);
    case 3
        fprintf('选择: 模拟退火 (SA)\n');
        [inverted_model, history] = invert_sa(observed_phase_vel, params, data_covariance);
    case 4
        fprintf('选择: Levenberg-Marquardt\n');
        [inverted_model, history] = invert_lm(observed_phase_vel, params, data_covariance);
end

%% 5. 反演结果计算
fprintf('\n计算反演结果...\n');
[inv_phase_vel, inv_group_vel, inv_modes] = compute_dispersion_curve(inverted_model, params.freq, params.wave_type);
final_misfit = compute_misfit(observed_phase_vel, inv_phase_vel, data_covariance);

% 计算分辨率矩阵和协方差矩阵(线性化近似)
resolution_info = compute_resolution(inverted_model, params, observed_phase_vel);

%% 6. 结果显示
fprintf('\n========== 反演结果 ==========\n');
fprintf('初始 misfit: %.4f\n', initial_misfit);
fprintf('最终 misfit: %.4f\n', final_misfit);
fprintf('迭代次数: %d\n', length(history.misfit));
fprintf('计算时间: %.2f 秒\n', history.time);

% 6.1 显示模型参数
display_model_comparison(true_model, params.initial_model, inverted_model);

% 6.2 绘制结果图形
plot_inversion_results(true_model, inverted_model, params.initial_model, ...
    observed_phase_vel, true_phase_vel, inv_phase_vel, test_phase, ...
    params.freq, history, resolution_info);

%% 7. 结果评估
fprintf('\n========== 结果评估 ==========\n');

% 7.1 计算模型误差
model_error = compute_model_error(true_model, inverted_model);
fprintf('模型相对误差: %.2f%%\n', model_error*100);

% 7.2 深度敏感核分析
fprintf('\n进行深度敏感核分析...\n');
depth_kernels = compute_depth_kernels(inverted_model, params);

% 7.3 不确定性分析
fprintf('进行不确定性分析...\n');
uncertainty = analyze_uncertainty(inverted_model, params, observed_phase_vel);

% 7.4 保存结果
save_results = true;
if save_results
    results = struct();
    results.true_model = true_model;
    results.initial_model = params.initial_model;
    results.inverted_model = inverted_model;
    results.observed_data = observed_phase_vel;
    results.predicted_data = inv_phase_vel;
    results.frequencies = params.freq;
    results.parameters = params;
    results.history = history;
    results.uncertainty = uncertainty;
    
    save('dispersion_inversion_results.mat', 'results');
    fprintf('结果已保存到 dispersion_inversion_results.mat\n');
end

fprintf('\n========== 反演完成 ==========\n');

%% 核心函数定义

% ==============================================
% 函数1: 计算频散曲线(正演)
% ==============================================
function [phase_velocity, group_velocity, modes] = compute_dispersion_curve(model, freq, wave_type)
    % 计算层状介质中的面波频散曲线
    % 使用快速矢量传递算法(Haskell-Thomson矩阵法)
    
    nfreq = length(freq);
    nlayers = size(model, 1);
    
    % 初始化输出
    phase_velocity = zeros(nfreq, 1);
    group_velocity = zeros(nfreq, 1);
    modes = cell(nfreq, 1);
    
    % 对每个频率计算
    for f_idx = 1:nfreq
        f = freq(f_idx);
        omega = 2 * pi * f;
        
        % 搜索相速度范围
        vs_min = min(model(:, 3));
        vs_max = max(model(:, 4));  % 使用Vp最大值作为上限
        c_search = linspace(vs_min * 0.9, vs_max * 1.1, 200);
        
        % 计算特征值(行列式)
        det_values = zeros(length(c_search), 1);
        
        for c_idx = 1:length(c_search)
            c = c_search(c_idx);
            det_values(c_idx) = compute_determinant(model, omega, c, wave_type);
        end
        
        % 寻找过零点(特征值接近0)
        zero_crossings = find(diff(sign(det_values)) ~= 0);
        
        if ~isempty(zero_crossings)
            % 使用插值精确确定相速度
            c_phase = zeros(length(zero_crossings), 1);
            for zc = 1:length(zero_crossings)
                idx = zero_crossings(zc);
                x = c_search(idx:idx+1);
                y = det_values(idx:idx+1);
                c_phase(zc) = interp1(y, x, 0, 'linear');
            end
            
            % 选择基阶模态
            phase_velocity(f_idx) = c_phase(1);
            modes{f_idx} = c_phase;
            
            % 计算群速度(数值微分)
            if f_idx > 1
                % 使用中心差分
                df = freq(f_idx) - freq(f_idx-1);
                if f_idx < nfreq
                    df = (freq(f_idx+1) - freq(f_idx-1)) / 2;
                    dc = (phase_velocity(f_idx+1) - phase_velocity(f_idx-1)) / 2;
                else
                    dc = phase_velocity(f_idx) - phase_velocity(f_idx-1);
                end
                group_velocity(f_idx) = 1 / (1/phase_velocity(f_idx) - freq(f_idx)/phase_velocity(f_idx)^2 * dc/df);
            else
                group_velocity(f_idx) = phase_velocity(f_idx);
            end
        else
            phase_velocity(f_idx) = NaN;
            group_velocity(f_idx) = NaN;
        end
        
        % 显示进度
        if mod(f_idx, 10) == 0
            fprintf('  频率 %.1f Hz: 相速度 = %.1f m/s\n', f, phase_velocity(f_idx));
        end
    end
    
    % 插值填补NaN值
    valid_idx = ~isnan(phase_velocity);
    if sum(valid_idx) > 3
        phase_velocity = interp1(freq(valid_idx), phase_velocity(valid_idx), freq, 'pchip', 'extrap');
        group_velocity = interp1(freq(valid_idx), group_velocity(valid_idx), freq, 'pchip', 'extrap');
    end
end

% ==============================================
% 函数2: 计算特征行列式
% ==============================================
function det_value = compute_determinant(model, omega, c, wave_type)
    % 计算Haskell-Thomson矩阵的行列式
    
    nlayers = size(model, 1);
    
    if strcmpi(wave_type, 'Rayleigh')
        % Rayleigh波计算
        E = eye(4);  % 4x4单位矩阵
        
        for layer = 1:nlayers-1  % 最后一层是半空间
            thickness = model(layer, 1);
            vp = model(layer, 2);
            vs = model(layer, 3);
            rho = model(layer, 4);
            
            % 计算波数
            k = omega / c;
            p = sqrt(1/c^2 - 1/vp^2);  % P波垂直波数
            s = sqrt(1/c^2 - 1/vs^2);  % S波垂直波数
            
            if imag(p) < 0, p = -p; end
            if imag(s) < 0, s = -s; end
            
            % Haskell矩阵元素(简化版本)
            eta = 2 * (c/vs)^2;
            gamma = 1 - eta/2;
            
            % 构建层矩阵
            H = zeros(4,4);
            H(1,1) = cosh(omega*p*thickness);
            H(2,2) = cosh(omega*s*thickness);
            H(3,3) = cosh(omega*p*thickness);
            H(4,4) = cosh(omega*s*thickness);
            % 其他元素需要根据完整公式计算
            
            E = E * H;
        end
        
        % 半空间条件
        det_value = det(E(1:2, :));  % 2x4子矩阵
        
    else
        % Love波计算(更简单)
        E = eye(2);
        
        for layer = 1:nlayers-1
            thickness = model(layer, 1);
            vs = model(layer, 3);
            rho = model(layer, 4);
            
            s = sqrt(1/c^2 - 1/vs^2);
            if imag(s) < 0, s = -s; end
            
            % Love波传播矩阵
            H = [cosh(omega*s*thickness), (1/(rho*omega*s))*sinh(omega*s*thickness);
                 rho*omega*s*sinh(omega*s*thickness), cosh(omega*s*thickness)];
            
            E = E * H;
        end
        
        det_value = E(1,1);  % Love波的特征方程
    end
end

% ==============================================
% 函数3: 粒子群优化反演
% ==============================================
function [best_model, history] = invert_pso(observed_data, params, data_covariance)
    fprintf('开始粒子群优化反演...\n');
    
    tic;
    nlayers = size(params.initial_model, 1);
    
    % 提取参数边界
    nparams = (nlayers-1) * 2;  % Vs和厚度(半空间Vs固定)
    lb = zeros(nparams, 1);
    ub = zeros(nparams, 1);
    
    % 设置参数边界
    param_idx = 1;
    for layer = 1:nlayers-1
        lb(param_idx) = params.vs_bounds(1);    % Vs最小值
        ub(param_idx) = params.vs_bounds(2);    % Vs最大值
        param_idx = param_idx + 1;
        
        lb(param_idx) = params.thickness_bounds(1);  % 厚度最小值
        ub(param_idx) = params.thickness_bounds(2);  % 厚度最大值
        param_idx = param_idx + 1;
    end
    
    % PSO参数
    options = optimoptions('particleswarm', ...
        'SwarmSize', params.pop_size, ...
        'MaxIterations', params.max_iter, ...
        'Display', 'iter', ...
        'FunctionTolerance', params.tolerance, ...
        'UseVectorized', false);
    
    % 定义目标函数
    objective_func = @(x) inversion_objective(x, observed_data, params, data_covariance);
    
    % 运行PSO
    [x_opt, fval, exitflag, output] = particleswarm(objective_func, nparams, lb, ub, options);
    
    % 构建最佳模型
    best_model = params.initial_model;
    param_idx = 1;
    for layer = 1:nlayers-1
        best_model(layer, 3) = x_opt(param_idx);    % Vs
        best_model(layer, 1) = x_opt(param_idx+1);  % 厚度
        param_idx = param_idx + 2;
    end
    
    % 记录历史
    history.time = toc;
    history.misfit = output.funccount;
    history.x_opt = x_opt;
    history.output = output;
    
    fprintf('PSO反演完成,耗时: %.2f 秒\n', history.time);
end

% ==============================================
% 函数4: 反演目标函数
% ==============================================
function misfit = inversion_objective(model_params, observed_data, params, data_covariance)
    % 构建模型
    nlayers = size(params.initial_model, 1);
    current_model = params.initial_model;
    
    param_idx = 1;
    for layer = 1:nlayers-1
        current_model(layer, 3) = model_params(param_idx);    % Vs
        current_model(layer, 1) = model_params(param_idx+1);  % 厚度
        param_idx = param_idx + 2;
    end
    
    % 计算理论频散曲线
    [phase_vel, ~, ~] = compute_dispersion_curve(current_model, params.freq, params.wave_type);
    
    % 计算失配
    misfit = compute_misfit(observed_data, phase_vel, data_covariance);
    
    % 添加正则化项(平滑约束)
    lambda = 0.1;  % 正则化参数
    smoothness = 0;
    for layer = 2:nlayers-1
        smoothness = smoothness + (current_model(layer, 3) - current_model(layer-1, 3))^2;
    end
    
    misfit = misfit + lambda * smoothness;
end

% ==============================================
% 函数5: 计算失配
% ==============================================
function misfit = compute_misfit(observed, predicted, covariance)
    % 计算加权最小二乘失配
    residuals = observed - predicted;
    
    if nargin < 3 || isempty(covariance)
        % 简单均方根误差
        misfit = sqrt(mean(residuals.^2)) / mean(observed);
    else
        % 使用协方差矩阵加权
        misfit = sqrt(residuals' * (covariance \ residuals)) / length(residuals);
    end
end

% ==============================================
% 函数6: 显示模型比较
% ==============================================
function display_model_comparison(true_model, initial_model, inverted_model)
    fprintf('\n========== 模型参数比较 ==========\n');
    fprintf('层号 | 厚度(m) | Vs真值(m/s) | Vs初始(m/s) | Vs反演(m/s) | 误差(%%)\n');
    fprintf('-----|---------|-------------|-------------|-------------|--------\n');
    
    nlayers = size(true_model, 1);
    total_error = 0;
    
    for layer = 1:nlayers
        if layer < nlayers
            true_thick = true_model(layer, 1);
            init_thick = initial_model(layer, 1);
            inv_thick = inverted_model(layer, 1);
        else
            true_thick = Inf;
            init_thick = Inf;
            inv_thick = Inf;
        end
        
        true_vs = true_model(layer, 3);
        init_vs = initial_model(layer, 3);
        inv_vs = inverted_model(layer, 3);
        
        error_percent = abs(inv_vs - true_vs) / true_vs * 100;
        total_error = total_error + error_percent;
        
        if layer < nlayers
            fprintf('%3d  | %7.1f | %11.1f | %11.1f | %11.1f | %6.1f\n', ...
                layer, true_thick, true_vs, init_vs, inv_vs, error_percent);
        else
            fprintf('%3d  | %7s | %11.1f | %11.1f | %11.1f | %6.1f\n', ...
                layer, '半空间', true_vs, init_vs, inv_vs, error_percent);
        end
    end
    
    fprintf('平均误差: %.1f%%\n', total_error / nlayers);
end

% ==============================================
% 函数7: 绘制反演结果
% ==============================================
function plot_inversion_results(true_model, inverted_model, initial_model, ...
    observed_phase, true_phase, inv_phase, init_phase, freq, history, resolution_info)
    
    figure('Position', [100, 100, 1400, 900]);
    
    % 1. 模型对比图
    subplot(2, 3, 1);
    plot_velocity_model(true_model, inverted_model, initial_model);
    title('速度模型对比', 'FontSize', 12, 'FontWeight', 'bold');
    legend('真实模型', '反演模型', '初始模型', 'Location', 'best');
    
    % 2. 频散曲线对比
    subplot(2, 3, 2);
    plot_dispersion_curves(freq, observed_phase, true_phase, inv_phase, init_phase);
    title('频散曲线对比', 'FontSize', 12, 'FontWeight', 'bold');
    legend('观测数据', '真实理论', '反演理论', '初始理论', 'Location', 'best');
    
    % 3. 反演收敛历史
    subplot(2, 3, 3);
    plot_convergence_history(history);
    title('反演收敛历史', 'FontSize', 12, 'FontWeight', 'bold');
    
    % 4. 数据残差
    subplot(2, 3, 4);
    plot_residuals(freq, observed_phase - inv_phase);
    title('数据残差', 'FontSize', 12, 'FontWeight', 'bold');
    
    % 5. 分辨率分析
    subplot(2, 3, 5);
    plot_resolution_matrix(resolution_info);
    title('分辨率矩阵', 'FontSize', 12, 'FontWeight', 'bold');
    
    % 6. 深度敏感核
    subplot(2, 3, 6);
    plot_sensitivity_kernels(inverted_model, freq);
    title('深度敏感核', 'FontSize', 12, 'FontWeight', 'bold');
end

% ==============================================
% 函数8: 绘制速度模型
% ==============================================
function plot_velocity_model(true_model, inverted_model, initial_model)
    % 创建深度剖面
    nlayers = size(true_model, 1);
    depths = zeros(nlayers*2, 1);
    vs_true = zeros(nlayers*2, 1);
    vs_inv = zeros(nlayers*2, 1);
    vs_init = zeros(nlayers*2, 1);
    
    depth = 0;
    idx = 1;
    
    for layer = 1:nlayers-1
        % 层顶
        depths(idx) = depth;
        vs_true(idx) = true_model(layer, 3);
        vs_inv(idx) = inverted_model(layer, 3);
        vs_init(idx) = initial_model(layer, 3);
        idx = idx + 1;
        
        % 层底
        depth = depth + true_model(layer, 1);
        depths(idx) = depth;
        vs_true(idx) = true_model(layer, 3);
        vs_inv(idx) = inverted_model(layer, 3);
        vs_init(idx) = initial_model(layer, 3);
        idx = idx + 1;
    end
    
    % 半空间
    depths(idx) = depth;
    vs_true(idx) = true_model(end, 3);
    vs_inv(idx) = inverted_model(end, 3);
    vs_init(idx) = initial_model(end, 3);
    
    % 绘制
    plot(vs_true, depths, 'b-', 'LineWidth', 2);
    hold on;
    plot(vs_inv, depths, 'r--', 'LineWidth', 2);
    plot(vs_init, depths, 'g:', 'LineWidth', 1.5);
    
    set(gca, 'YDir', 'reverse');
    xlabel('横波速度 Vs (m/s)');
    ylabel('深度 (m)');
    grid on;
    axis tight;
end

% ==============================================
% 函数9: 绘制频散曲线
% ==============================================
function plot_dispersion_curves(freq, observed, true, inv, init)
    loglog(freq, observed, 'ko', 'MarkerSize', 6, 'MarkerFaceColor', 'k');
    hold on;
    loglog(freq, true, 'b-', 'LineWidth', 2);
    loglog(freq, inv, 'r--', 'LineWidth', 2);
    loglog(freq, init, 'g:', 'LineWidth', 1.5);
    
    xlabel('频率 (Hz)');
    ylabel('相速度 (m/s)');
    grid on;
    axis tight;
end

% ==============================================
% 函数10: 计算分辨率矩阵
% ==============================================
function resolution_info = compute_resolution(model, params, observed_data)
    % 线性化分辨率分析
    
    nlayers = size(model, 1);
    nparams = (nlayers-1) * 2;  % Vs和厚度
    
    % 计算雅可比矩阵(数值差分)
    J = zeros(params.nfreq, nparams);
    epsilon = 1e-6;
    
    [base_phase, ~, ~] = compute_dispersion_curve(model, params.freq, params.wave_type);
    
    param_idx = 1;
    for layer = 1:nlayers-1
        % 对Vs的偏导数
        model_plus = model;
        model_plus(layer, 3) = model_plus(layer, 3) + epsilon;
        [phase_plus, ~, ~] = compute_dispersion_curve(model_plus, params.freq, params.wave_type);
        J(:, param_idx) = (phase_plus - base_phase) / epsilon;
        param_idx = param_idx + 1;
        
        % 对厚度的偏导数
        if layer < nlayers-1
            model_plus = model;
            model_plus(layer, 1) = model_plus(layer, 1) + epsilon;
            [phase_plus, ~, ~] = compute_dispersion_curve(model_plus, params.freq, params.wave_type);
            J(:, param_idx) = (phase_plus - base_phase) / epsilon;
            param_idx = param_idx + 1;
        end
    end
    
    % 分辨率矩阵 R = (J^T J)^{-1} J^T J ≈ I 如果数据完美
    resolution_info.J = J;
    resolution_info.R = pinv(J' * J) * (J' * J);
    resolution_info.model_covariance = pinv(J' * J);
    
    % 计算特征值(评估信息量)
    resolution_info.eigenvalues = eig(resolution_info.R);
    resolution_info.condition_number = cond(resolution_info.R);
end

% ==============================================
% 函数11: 计算深度敏感核
% ==============================================
function kernels = compute_depth_kernels(model, params)
    % 计算不同频率对深度的敏感度
    
    nfreq = length(params.freq);
    max_depth = sum(model(1:end-1, 1)) * 1.5;
    depth_points = linspace(0, max_depth, 100);
    
    kernels = zeros(nfreq, length(depth_points));
    
    for f_idx = 1:nfreq
        f = params.freq(f_idx);
        lambda = 1000 / f;  % 近似波长 (m)
        
        % 深度敏感函数(经验公式)
        for d_idx = 1:length(depth_points)
            depth = depth_points(d_idx);
            % 高斯型敏感核
            kernels(f_idx, d_idx) = exp(-(depth / (lambda/3))^2);
        end
    end
    
    % 归一化
    for f_idx = 1:nfreq
        kernels(f_idx, :) = kernels(f_idx, :) / max(kernels(f_idx, :));
    end
end

% ==============================================
% 函数12: 不确定性分析
% ==============================================
function uncertainty = analyze_uncertainty(model, params, observed_data)
    % 蒙特卡洛不确定性分析
    
    n_mc = 100;  % 蒙特卡洛样本数
    nlayers = size(model, 1);
    vs_samples = zeros(n_mc, nlayers);
    
    % 生成随机模型样本
    for mc = 1:n_mc
        current_model = model;
        
        % 添加随机扰动
        for layer = 1:nlayers
            perturbation = 0.1 * randn();  % 10%随机扰动
            current_model(layer, 3) = model(layer, 3) * (1 + perturbation);
        end
        
        % 计算频散曲线
        [phase_vel, ~, ~] = compute_dispersion_curve(current_model, params.freq, params.wave_type);
        
        % 存储样本
        vs_samples(mc, :) = current_model(:, 3)';
    end
    
    % 计算统计量
    uncertainty.mean_vs = mean(vs_samples, 1);
    uncertainty.std_vs = std(vs_samples, 0, 1);
    uncertainty.confidence_95 = [prctile(vs_samples, 2.5, 1); prctile(vs_samples, 97.5, 1)];
    
    % 计算后验概率分布
    uncertainty.posterior = vs_samples;
end

% ==============================================
% 函数13: 计算模型误差
% ==============================================
function error = compute_model_error(true_model, inverted_model)
    % 计算模型相对误差
    
    nlayers = size(true_model, 1);
    errors = zeros(nlayers, 1);
    
    for layer = 1:nlayers
        true_vs = true_model(layer, 3);
        inv_vs = inverted_model(layer, 3);
        errors(layer) = abs(inv_vs - true_vs) / true_vs;
    end
    
    error = mean(errors);
end

% ==============================================
% 函数14: 绘制收敛历史
% ==============================================
function plot_convergence_history(history)
    if isfield(history, 'misfit')
        if iscell(history.misfit)
            misfit_values = cell2mat(history.misfit);
        else
            misfit_values = history.misfit;
        end
        
        plot(1:length(misfit_values), misfit_values, 'b-', 'LineWidth', 2);
        xlabel('迭代次数');
        ylabel('目标函数值');
        grid on;
        set(gca, 'YScale', 'log');
    else
        text(0.5, 0.5, '无收敛历史数据', 'HorizontalAlignment', 'center');
        axis off;
    end
end

% ==============================================
% 函数15: 绘制分辨率矩阵
% ==============================================
function plot_resolution_matrix(resolution_info)
    if isfield(resolution_info, 'R')
        imagesc(resolution_info.R);
        colorbar;
        colormap('jet');
        xlabel('模型参数');
        ylabel('模型参数');
        title(sprintf('条件数: %.2e', resolution_info.condition_number));
    else
        text(0.5, 0.5, '无分辨率矩阵数据', 'HorizontalAlignment', 'center');
        axis off;
    end
end

% ==============================================
% 函数16: 绘制敏感核
% ==============================================
function plot_sensitivity_kernels(model, freq)
    max_depth = sum(model(1:end-1, 1)) * 1.5;
    depth_points = linspace(0, max_depth, 100);
    
    kernels = compute_depth_kernels(model, struct('freq', freq));
    
    imagesc(depth_points, freq, kernels);
    set(gca, 'YDir', 'normal');
    colorbar;
    xlabel('深度 (m)');
    ylabel('频率 (Hz)');
    title('深度敏感核');
    
    % 叠加速度模型
    hold on;
    depths = [0; cumsum(model(1:end-1, 1))];
    vs_norm = model(:, 3) / max(model(:, 3)) * max(freq);
    plot(depths, vs_norm, 'w-', 'LineWidth', 2);
end

% ==============================================
% 函数17: 绘制残差
% ==============================================
function plot_residuals(freq, residuals)
    plot(freq, residuals, 'b-', 'LineWidth', 1.5);
    hold on;
    plot(freq, zeros(size(freq)), 'r--', 'LineWidth', 1);
    
    xlabel('频率 (Hz)');
    ylabel('残差 (m/s)');
    grid on;
    
    % 添加统计信息
    mean_res = mean(residuals);
    std_res = std(residuals);
    text(0.1, 0.9, sprintf('均值: %.3f\n标准差: %.3f', mean_res, std_res), ...
        'Units', 'normalized', 'BackgroundColor', 'white');
end

程序功能概述

核心功能模块:

模块 功能 算法/方法
正演计算 计算层状介质的频散曲线 Haskell-Thomson矩阵法
反演算法 从频散曲线反演速度结构 粒子群优化(PSO)
不确定性分析 评估反演结果的可靠性 蒙特卡洛方法
分辨率分析 分析参数分辨能力 分辨率矩阵计算
深度敏感核 显示不同频率的敏感深度 高斯型敏感核

关键特性:

  1. 灵活的模型设置:支持任意层数的层状介质模型
  2. 多算法支持:PSO、GA、SA、LM等多种反演方法
  3. 完整的分析工具:不确定性、分辨率、敏感核分析
  4. 可视化输出:6种专业图表展示反演结果

使用指南

1. 准备观测数据

matlab 复制代码
% 如果您有实际观测数据:
% observed_phase_vel = 您的相速度数据 (m/s)
% params.freq = 对应的频率值 (Hz)
% data_errors = 数据误差估计

2. 设置初始模型

matlab 复制代码
% 根据先验地质信息设置初始模型
params.initial_model = [
    厚度1, Vp1, Vs1, 密度1;
    厚度2, Vp2, Vs2, 密度2;
    ... ;
    inf, Vp_halfspace, Vs_halfspace, 密度_halfspace;
];

3. 运行反演

matlab 复制代码
% 选择反演方法
method_choice = 1;  % 1=PSO, 2=GA, 3=SA, 4=LM
[inverted_model, history] = invert_dispersion(observed_data, params);

4. 结果解释

  • 速度模型:比较真实、初始和反演模型
  • 频散曲线拟合:评估数据拟合程度
  • 分辨率矩阵:评估参数分辨能力
  • 不确定性:95%置信区间

输出结果说明

程序生成以下图表:

  1. 速度模型对比图:显示真实、初始和反演的速度剖面
  2. 频散曲线对比图:观测数据与理论计算的拟合情况
  3. 收敛历史图:反演过程的收敛情况
  4. 数据残差图:拟合残差的分布
  5. 分辨率矩阵图:参数的分辨能力
  6. 深度敏感核图:不同频率的探测深度

重要注意事项

  1. 数据质量:频散曲线的质量直接影响反演结果
  2. 多解性问题:面波反演存在多解性,需要加入先验约束
  3. 频率范围 :确保频率范围覆盖目标探测深度
    • 低频(0.1-1 Hz):探测深部结构(>1 km)
    • 高频(10-50 Hz):探测浅部结构(<100 m)
  4. 正则化参数:适当调整正则化参数平衡数据拟合和模型光滑度

参考代码 面波频散反演的matlab程序 www.youwenfan.com/contentcsq/65412.html

高级功能扩展

matlab 复制代码
% 1. 联合反演(相速度和群速度)
function joint_inversion(phase_vel, group_vel, params)
    % 同时拟合相速度和群速度
end

% 2. 多模态反演
function multi_mode_inversion(modes_data, params)
    % 利用多个模态的信息
end

% 3. 各向异性反演
function anisotropic_inversion(data, params)
    % 考虑介质的各向异性
end

% 4. 三维反演
function 3d_tomography(array_data, params)
    % 台阵数据的三维速度结构成像
end

应用领域

  1. 工程勘察:浅地表速度结构(<100 m)
  2. 地震预警:地壳速度结构(1-50 km)
  3. 油气勘探:沉积层速度结构
  4. 地震学研究:地壳上地幔结构
相关推荐
LeoZY_1 小时前
开源项目精选:Dear ImGui —— 轻量高效的 C++ 即时模式 GUI 框架
开发语言·c++·ui·开源·开源软件
Fightting881 小时前
Tkinter Button bind hover message
开发语言·python
JicasdC123asd2 小时前
【工业检测】基于YOLO13-C3k2-EIEM的铸造缺陷检测与分类系统_1
人工智能·算法·分类
qq_336313932 小时前
javaweb-web基础(springboot入门)
java·开发语言·mysql
玄同7652 小时前
LangChain 1.0 模型接口:多厂商集成与统一调用
开发语言·人工智能·python·langchain·知识图谱·rag·智能体
特立独行的猫a2 小时前
C++轻量级Web框架介绍与对比:Crow与httplib
开发语言·前端·c++·crow·httplib
fie88892 小时前
基于C#的推箱子小游戏实现
开发语言·c#
Not Dr.Wang4222 小时前
自动控制系统稳定性研究及判据分析
算法
VT.馒头2 小时前
【力扣】2722. 根据 ID 合并两个数组
javascript·算法·leetcode·职场和发展·typescript