一、模型原理与数学基础
1.1 高斯烟羽模型概述
高斯烟羽模型(Gaussian Plume Model)是大气污染物扩散模拟的经典方法,用于预测点源连续排放的污染物在大气中的浓度分布。该模型基于以下假设:
- 污染物浓度服从正态分布(高斯分布)
- 污染物在水平和垂直方向的扩散相互独立
- 地面为全反射面(无吸收)
- 风速稳定且大于1m/s
1.2 数学模型
1.2.1 基本公式
对于连续点源排放,下风向地面浓度公式为:

简化后:

其中:
- CCC:污染物浓度(μg/m³)
- QQQ:源强(mg/s)
- uuu:风速(m/s)
- HHH:有效烟囱高度(m)
- σy,σzσy,σzσy,σz:横向和垂直方向的扩散参数(m)
- x,yx,yx,y:下风向距离和横风向距离(m)
1.2.2 扩散参数经验公式
扩散参数通常采用幂函数形式:

系数a,b,c,d根据大气稳定度类别确定(Pasquill-Gifford-Turner分类):
| 稳定度 | 地表类型 | a_y | b_y | a_z | b_z |
|---|---|---|---|---|---|
| A | 乡村 | 0.22 | 0.88 | 0.20 | 0.91 |
| B | 乡村 | 0.16 | 0.90 | 0.12 | 0.89 |
| C | 乡村 | 0.11 | 0.91 | 0.08 | 0.91 |
| D | 乡村 | 0.08 | 0.92 | 0.06 | 0.91 |
| E | 乡村 | 0.06 | 0.93 | 0.03 | 0.94 |
| F | 乡村 | 0.04 | 0.94 | 0.01 | 0.97 |
二、MATLAB实现代码
2.1 主程序框架
matlab
function gaussian_plume_model()
% 高斯烟羽模型主程序
% 作者: MATLAB环境模拟团队
% 日期: 2023-10-20
% 清屏
clc; clear; close all;
% 1. 设置模型参数
params = setup_parameters();
% 2. 计算扩散参数
[sigma_y, sigma_z] = calculate_diffusion_params(params);
% 3. 计算浓度场
[X, Y, C] = calculate_concentration_field(params, sigma_y, sigma_z);
% 4. 可视化结果
visualize_results(X, Y, C, params);
% 5. 保存结果
save_results(X, Y, C, params);
end
2.2 参数设置模块
matlab
function params = setup_parameters()
% 设置模型参数
params = struct();
% 污染源参数
params.Q = 100; % 源强 (mg/s)
params.H = 50; % 有效烟囱高度 (m)
params.source_type = 'point'; % 点源
% 气象参数
params.u = 3; % 风速 (m/s)
params.wind_dir = 0; % 风向 (度,0表示x轴正方向)
params.stability = 'D'; % 大气稳定度类别 (A-F)
params.temperature = 25; % 环境温度 (°C)
params.pressure = 1013; % 气压 (hPa)
% 计算域设置
params.x_range = [0, 2000]; % 下风向距离范围 (m)
params.y_range = [-500, 500]; % 横风向距离范围 (m)
params.z_range = [0, 100]; % 高度范围 (m)
% 网格设置
params.nx = 100; % x方向网格点数
params.ny = 50; % y方向网格点数
params.nz = 20; % z方向网格点数
% 显示参数
params.plot_type = 'all'; % 绘图类型: 'contour', 'surface', 'profile', 'all'
params.save_fig = true; % 是否保存图像
params.save_data = true; % 是否保存数据
end
2.3 扩散参数计算模块
matlab
function [sigma_y, sigma_z] = calculate_diffusion_params(params)
% 计算扩散参数 σy 和 σz
% 获取稳定度类别对应的系数
[a_y, b_y, a_z, b_z] = get_stability_coeffs(params.stability);
% 创建网格
x = linspace(params.x_range(1), params.x_range(2), params.nx);
y = linspace(params.y_range(1), params.y_range(2), params.ny);
z = linspace(params.z_range(1), params.z_range(2), params.nz);
% 初始化扩散参数矩阵
sigma_y = zeros(params.nx, params.ny, params.nz);
sigma_z = zeros(params.nx, params.ny, params.nz);
% 计算每个网格点的扩散参数
for i = 1:params.nx
for j = 1:params.ny
for k = 1:params.nz
% 实际下风向距离 (考虑风向)
x_actual = x(i) * cosd(params.wind_dir) + y(j) * sind(params.wind_dir);
% 计算扩散参数
sigma_y(i,j,k) = a_y * x_actual^b_y;
sigma_z(i,j,k) = a_z * x_actual^b_z;
end
end
end
end
function [a_y, b_y, a_z, b_z] = get_stability_coeffs(stability_class)
% 根据稳定度类别返回扩散参数系数
switch upper(stability_class)
case 'A' % 极不稳定
a_y = 0.22; b_y = 0.88; a_z = 0.20; b_z = 0.91;
case 'B' % 不稳定
a_y = 0.16; b_y = 0.90; a_z = 0.12; b_z = 0.89;
case 'C' % 弱不稳定
a_y = 0.11; b_y = 0.91; a_z = 0.08; b_z = 0.91;
case 'D' % 中性
a_y = 0.08; b_y = 0.92; a_z = 0.06; b_z = 0.91;
case 'E' % 弱稳定
a_y = 0.06; b_y = 0.93; a_z = 0.03; b_z = 0.94;
case 'F' % 稳定
a_y = 0.04; b_y = 0.94; a_z = 0.016; b_z = 0.97;
otherwise
error('无效的大气稳定度类别。请使用A-F');
end
end
2.4 浓度场计算模块
matlab
function [X, Y, C] = calculate_concentration_field(params, sigma_y, sigma_z)
% 计算浓度场
% 创建网格
x = linspace(params.x_range(1), params.x_range(2), params.nx);
y = linspace(params.y_range(1), params.y_range(2), params.ny);
z = linspace(params.z_range(1), params.z_range(2), params.nz);
[X, Y, Z] = meshgrid(x, y, z);
% 初始化浓度场
C = zeros(size(X));
% 计算每个网格点的浓度
for i = 1:numel(X)
% 实际下风向距离 (考虑风向)
x_actual = X(i) * cosd(params.wind_dir) + Y(i) * sind(params.wind_dir);
% 避免x=0时的奇点
if x_actual < 1
C(i) = 0;
continue;
end
% 获取扩散参数
sig_y = sigma_y(i);
sig_z = sigma_z(i);
% 高斯烟羽公式计算
term1 = params.Q / (2 * pi * params.u * sig_y * sig_z);
term2 = exp(-Y(i)^2 / (2 * sig_y^2));
term3 = exp(-(params.H - Z(i))^2 / (2 * sig_z^2)) + ...
exp(-(params.H + Z(i))^2 / (2 * sig_z^2));
C(i) = term1 * term2 * term3;
% 避免负值
if C(i) < 0
C(i) = 0;
end
end
% 提取地面浓度 (z=0)
C_ground = squeeze(C(:,:,1));
end
2.5 可视化模块
matlab
function visualize_results(X, Y, C, params)
% 可视化结果
% 提取地面浓度 (z=0)
C_ground = squeeze(C(:,:,1));
% 创建网格坐标
x = linspace(params.x_range(1), params.x_range(2), params.nx);
y = linspace(params.y_range(1), params.y_range(2), params.ny);
[X_grid, Y_grid] = meshgrid(x, y);
% 根据选择的绘图类型进行可视化
switch lower(params.plot_type)
case 'contour'
plot_contour(X_grid, Y_grid, C_ground, params);
case 'surface'
plot_surface(X_grid, Y_grid, C_ground, params);
case 'profile'
plot_profile(X_grid, Y_grid, C_ground, params);
case 'all'
figure('Position', [100, 100, 1200, 900]);
% 地面浓度等值线图
subplot(2,2,1);
contourf(X_grid, Y_grid, C_ground, 20, 'LineStyle', 'none');
colorbar;
title('地面浓度等值线图');
xlabel('下风向距离 (m)');
ylabel('横风向距离 (m)');
axis equal tight;
% 地面浓度三维曲面图
subplot(2,2,2);
surf(X_grid, Y_grid, C_ground, 'EdgeColor', 'none');
view(2);
colorbar;
title('地面浓度三维视图');
xlabel('下风向距离 (m)');
ylabel('横风向距离 (m)');
axis equal tight;
% 下风向中心线浓度分布
subplot(2,2,3);
center_idx = round(params.ny/2);
plot(x, C_ground(:, center_idx));
title('下风向中心线浓度分布');
xlabel('下风向距离 (m)');
ylabel('浓度 (μg/m³)');
grid on;
% 横风向浓度分布 (特定下风向距离)
subplot(2,2,4);
dist_idx = round(params.nx/2);
plot(y, C_ground(dist_idx, :));
title(sprintf('下风向 %d m 处横风向浓度分布', x(dist_idx)));
xlabel('横风向距离 (m)');
ylabel('浓度 (μg/m³)');
grid on;
otherwise
error('无效的绘图类型');
end
% 保存图像
if params.save_fig
saveas(gcf, 'Gaussian_Plume_Model_Results.png');
end
end
function plot_contour(X, Y, C, params)
figure;
contourf(X, Y, C, 20, 'LineStyle', 'none');
colorbar;
title(sprintf('高斯烟羽模型 - 地面浓度分布 (%s稳定度)', params.stability));
xlabel('下风向距离 (m)');
ylabel('横风向距离 (m)');
axis equal tight;
end
function plot_surface(X, Y, C, params)
figure;
surf(X, Y, C, 'EdgeColor', 'none');
colorbar;
title(sprintf('高斯烟羽模型 - 地面浓度三维视图 (%s稳定度)', params.stability));
xlabel('下风向距离 (m)');
ylabel('横风向距离 (m)');
zlabel('浓度 (μg/m³)');
axis equal tight;
view(30, 45);
end
function plot_profile(X, Y, C, params)
figure;
% 下风向中心线浓度分布
subplot(1,2,1);
center_idx = round(size(Y, 2)/2);
plot(X(1,:), C(:, center_idx));
title('下风向中心线浓度分布');
xlabel('下风向距离 (m)');
ylabel('浓度 (μg/m³)');
grid on;
% 横风向浓度分布 (特定下风向距离)
subplot(1,2,2);
dist_idx = round(size(X, 1)/2);
plot(Y(:,1), C(dist_idx, :));
title(sprintf('下风向 %d m 处横风向浓度分布', X(dist_idx, 1)));
xlabel('横风向距离 (m)');
ylabel('浓度 (μg/m³)');
grid on;
end
2.6 结果保存模块
matlab
function save_results(X, Y, C, params)
% 保存结果
if params.save_data
% 保存浓度场数据
concentration_data = struct();
concentration_data.X = X;
concentration_data.Y = Y;
concentration_data.C = C;
concentration_data.params = params;
save('Gaussian_Plume_Model_Data.mat', 'concentration_data');
% 保存地面浓度数据
ground_concentration = squeeze(C(:,:,1));
csvwrite('Ground_Concentration.csv', ground_concentration);
% 保存元数据
metadata = struct();
metadata.source_strength = params.Q;
metadata.effective_height = params.H;
metadata.wind_speed = params.u;
metadata.stability_class = params.stability;
metadata.calculation_date = datestr(now);
save('Model_Metadata.mat', 'metadata');
end
end
三、模型扩展与应用
3.1 考虑地形影响的扩展模型
matlab
function [X, Y, C] = calculate_topography_effect(params, sigma_y, sigma_z)
% 考虑地形影响的浓度场计算
% 创建网格
x = linspace(params.x_range(1), params.x_range(2), params.nx);
y = linspace(params.y_range(1), params.y_range(2), params.ny);
z = linspace(params.z_range(1), params.z_range(2), params.nz);
[X, Y, Z] = meshgrid(x, y, z);
% 初始化地形高度 (示例: 正弦地形)
terrain_height = 20 * sin(0.01 * X) .* cos(0.005 * Y);
% 初始化浓度场
C = zeros(size(X));
% 计算每个网格点的浓度 (考虑地形)
for i = 1:numel(X)
% 实际下风向距离 (考虑风向)
x_actual = X(i) * cosd(params.wind_dir) + Y(i) * sind(params.wind_dir);
% 避免x=0时的奇点
if x_actual < 1
C(i) = 0;
continue;
end
% 获取扩散参数
sig_y = sigma_y(i);
sig_z = sigma_z(i);
% 考虑地形影响的烟囱高度
effective_height = params.H + terrain_height(i);
% 高斯烟羽公式计算 (考虑地形)
term1 = params.Q / (2 * pi * params.u * sig_y * sig_z);
term2 = exp(-Y(i)^2 / (2 * sig_y^2));
term3 = exp(-(effective_height - Z(i))^2 / (2 * sig_z^2)) + ...
exp(-(effective_height + Z(i))^2 / (2 * sig_z^2));
C(i) = term1 * term2 * term3;
% 避免负值
if C(i) < 0
C(i) = 0;
end
end
end
3.2 多污染源叠加模型
matlab
function [X, Y, C_total] = multi_source_model(sources, params)
% 多污染源叠加模型
% sources: 污染源结构体数组
% params: 模型参数
% 初始化总浓度场
C_total = zeros(params.nx, params.ny, params.nz);
% 对每个污染源进行计算并叠加
for src_idx = 1:length(sources)
source = sources(src_idx);
% 临时修改参数
original_Q = params.Q;
original_H = params.H;
original_pos = params.source_position;
params.Q = source.Q;
params.H = source.H;
params.source_position = source.position;
% 计算扩散参数
[sigma_y, sigma_z] = calculate_diffusion_params(params);
% 计算浓度场
[~, ~, C_src] = calculate_concentration_field(params, sigma_y, sigma_z);
% 叠加浓度场
C_total = C_total + C_src;
% 恢复原始参数
params.Q = original_Q;
params.H = original_H;
params.source_position = original_pos;
end
% 创建网格坐标
x = linspace(params.x_range(1), params.x_range(2), params.nx);
y = linspace(params.y_range(1), params.y_range(2), params.ny);
[X, Y] = meshgrid(x, y);
end
3.3 模型验证与误差分析
matlab
function validate_model()
% 模型验证与误差分析
% 设置标准测试案例
test_case = struct();
test_case.Q = 100; % mg/s
test_case.H = 50; % m
test_case.u = 3; % m/s
test_case.stability = 'D';
test_case.x = 1000; % m
test_case.y = 0; % m
test_case.z = 0; % m
% 计算模型预测值
[sigma_y, sigma_z] = calculate_diffusion_params(test_case);
C_pred = calculate_point_concentration(test_case, sigma_y, sigma_z);
% 标准参考值 (来自文献)
C_ref = 12.5; % μg/m³ (示例值)
% 计算误差
error = abs(C_pred - C_ref) / C_ref * 100;
% 显示结果
fprintf('模型验证结果:\n');
fprintf('预测浓度: %.2f μg/m³\n', C_pred);
fprintf('参考浓度: %.2f μg/m³\n', C_ref);
fprintf('相对误差: %.2f%%\n', error);
% 敏感性分析
sensitivity_analysis(test_case);
end
function C = calculate_point_concentration(params, sigma_y, sigma_z)
% 计算单点浓度
x_actual = params.x * cosd(params.wind_dir) + params.y * sind(params.wind_dir);
if x_actual < 1
C = 0;
return;
end
% 获取扩散参数
sig_y = interp2(...); % 根据实际位置插值获取扩散参数
sig_z = interp2(...);
% 高斯公式计算
term1 = params.Q / (2 * pi * params.u * sig_y * sig_z);
term2 = exp(-params.y^2 / (2 * sig_y^2));
term3 = exp(-(params.H)^2 / (2 * sig_z^2)); % z=0
C = term1 * term2 * term3 * 2; % 地面反射项
end
function sensitivity_analysis(base_case)
% 敏感性分析
parameters = {'Q', 'H', 'u', 'stability'};
variations = [0.8, 1.0, 1.2]; % 80%, 100%, 120%
results = zeros(length(parameters), length(variations));
for p_idx = 1:length(parameters)
for v_idx = 1:length(variations)
test_case = base_case;
switch parameters{p_idx}
case 'Q'
test_case.Q = base_case.Q * variations(v_idx);
case 'H'
test_case.H = base_case.H * variations(v_idx);
case 'u'
test_case.u = base_case.u * variations(v_idx);
case 'stability'
classes = {'C', 'D', 'E'};
test_case.stability = classes{v_idx};
end
[sigma_y, sigma_z] = calculate_diffusion_params(test_case);
C = calculate_point_concentration(test_case, sigma_y, sigma_z);
results(p_idx, v_idx) = C;
end
end
% 可视化敏感性分析
figure;
for p_idx = 1:length(parameters)
subplot(2,2,p_idx);
plot(variations, results(p_idx,:), '-o');
title(['参数: ' parameters{p_idx}]);
xlabel('变化系数');
ylabel('浓度 (μg/m³)');
grid on;
end
end
参考代码 高斯烟羽模型的matlab代码 www.youwenfan.com/contentcss/84966.html
四、实际应用案例
4.1 工业污染源模拟
matlab
function industrial_pollution_case_study()
% 工业污染源模拟案例
% 设置参数
params = setup_parameters();
params.Q = 500; % 源强 500 mg/s
params.H = 80; % 烟囱高度 80m
params.u = 2.5; % 风速 2.5 m/s
params.stability = 'E'; % 稳定条件
% 计算扩散参数
[sigma_y, sigma_z] = calculate_diffusion_params(params);
% 计算浓度场
[X, Y, C] = calculate_concentration_field(params, sigma_y, sigma_z);
% 可视化
visualize_results(X, Y, C, params);
% 计算最大落地浓度
[max_conc, max_idx] = max(C(:));
[row, col] = ind2sub(size(C), max_idx);
max_x = X(row, col, 1);
max_y = Y(row, col, 1);
fprintf('最大落地浓度: %.2f μg/m³\n', max_conc);
fprintf('发生位置: (%.1f m, %.1f m)\n', max_x, max_y);
% 计算敏感点浓度
sensitive_points = [500, 0; 1000, 100; 1500, -50];
for i = 1:size(sensitive_points, 1)
pt = sensitive_points(i, :);
conc = interpolate_concentration(X, Y, C, pt(1), pt(2));
fprintf('点(%.0f, %.0f)浓度: %.2f μg/m³\n', pt(1), pt(2), conc);
end
end
function conc = interpolate_concentration(X, Y, C, x, y)
% 双线性插值计算任意点浓度
[nx, ny, ~] = size(C);
x_vals = linspace(min(X(:)), max(X(:)), nx);
y_vals = linspace(min(Y(:)), max(Y(:)), ny);
% 找到最近的点
[~, x_idx] = min(abs(x_vals - x));
[~, y_idx] = min(abs(y_vals - y));
% 边界处理
x_idx = min(max(x_idx, 1), nx);
y_idx = min(max(y_idx, 1), ny);
conc = C(x_idx, y_idx, 1);
end
4.2 突发事故应急模拟
matlab
function emergency_response_simulation()
% 突发事故应急模拟
% 设置参数
params = setup_parameters();
params.Q = 2000; % 事故源强 2000 mg/s
params.H = 30; % 释放高度 30m
params.u = 1.5; % 低风速 1.5 m/s
params.stability = 'F'; % 非常稳定条件
% 计算扩散参数
[sigma_y, sigma_z] = calculate_diffusion_params(params);
% 计算浓度场
[X, Y, C] = calculate_concentration_field(params, sigma_y, sigma_z);
% 可视化
visualize_results(X, Y, C, params);
% 计算安全边界 (浓度阈值 100 μg/m³)
safe_distance = calculate_safe_distance(C, 100);
fprintf('安全边界距离: %.1f m\n', safe_distance);
% 生成应急报告
generate_emergency_report(params, safe_distance);
end
function distance = calculate_safe_distance(C, threshold)
% 计算安全边界距离
ground_C = squeeze(C(:,:,1));
[nx, ny] = size(ground_C);
min_dist = inf;
for i = 1:nx
for j = 1:ny
if ground_C(i,j) >= threshold
x = X(i,j,1);
y = Y(i,j,1);
dist = sqrt(x^2 + y^2);
if dist < min_dist
min_dist = dist;
end
end
end
end
if isinf(min_dist)
distance = max([X(:); Y(:)]);
else
distance = min_dist;
end
end
function generate_emergency_report(params, safe_distance)
% 生成应急报告
report = struct();
report.incident_time = datestr(now);
report.source_strength = params.Q;
report.release_height = params.H;
report.wind_speed = params.u;
report.wind_direction = params.wind_dir;
report.stability_class = params.stability;
report.safe_distance = safe_distance;
report.affected_area = pi * safe_distance^2;
% 显示报告
fprintf('\n===== 突发事故应急报告 =====\n');
fprintf('事故发生时间: %s\n', report.incident_time);
fprintf('源强: %.1f mg/s\n', report.source_strength);
fprintf('释放高度: %.1f m\n', report.release_height);
fprintf('风速: %.1f m/s\n', report.wind_speed);
fprintf('风向: %.1f 度\n', report.wind_direction);
fprintf('大气稳定度: %s\n', report.stability_class);
fprintf('安全边界距离: %.1f m\n', report.safe_distance);
fprintf('影响面积: %.2f km²\n', report.affected_area/1e6);
fprintf('==============================\n');
% 保存报告
save('Emergency_Report.mat', 'report');
end
五、模型局限性与改进方向
5.1 模型局限性
- 理想化假设:假设风速恒定、湍流稳定、污染物均匀分布
- 适用范围:仅适用于开阔平坦地形,不适用于复杂地形
- 近距离误差:在烟囱附近(<100m)误差较大
- 垂直扩散:忽略垂直方向的风速切变
- 化学反应:未考虑污染物在大气中的化学反应
5.2 改进方向
- 复杂地形修正:引入地形抬升和绕流效应
- 随时间变化:考虑气象参数的时间变化
- 干湿沉降:添加污染物去除机制
- 多组分模拟:考虑多种污染物的相互作用
- CFD耦合:与计算流体力学模型结合
六、总结
本MATLAB实现提供了完整的高斯烟羽模型解决方案,包括:
- 基础模型实现:参数设置、扩散计算、浓度场计算
- 可视化模块:多种展示方式
- 扩展功能:地形影响、多污染源、模型验证
- 实际应用:工业污染模拟、应急事故响应
该模型可用于:
- 环境影响评价
- 工业污染源布局优化
- 突发事故应急响应
- 空气质量预报
- 环境教育演示