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

MATLAB实战:用TOPSIS法给20条河流水质排个名(附完整代码与数据)

MATLAB实战:TOPSIS算法在水质评价中的完整应用指南

引言

水质评价是环境科学领域的重要课题,如何科学合理地评估不同水域的环境状况一直是研究者关注的焦点。TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)即优劣解距离法,是一种有效的多属性决策方法,广泛应用于各类评价问题中。本文将结合MATLAB编程环境,详细介绍如何利用TOPSIS算法对20条河流的水质数据进行综合评价和排名。

不同于简单的指标加权平均,TOPSIS方法通过计算各评价对象与理想解和负理想解的距离,能够更全面地反映评价对象的优劣。这种方法特别适合处理具有多个评价指标且指标间可能存在冲突的复杂决策问题。我们将从数据准备、指标处理、算法实现到结果分析,呈现一个完整的技术闭环。

1. 数据准备与预处理

1.1 水质数据集介绍

我们使用的数据集包含20条河流的4个关键水质指标:

  • 含氧量(ppm):极大型指标,数值越高越好
  • PH值:中间型指标,理想值为7
  • 细菌总数(个/mL):极小型指标,数值越低越好
  • 植物性营养物量:区间型指标,最佳范围需根据实际情况确定
% 示例数据加载 data = [4.69 6.59 51 11.94; 2.03 7.86 19 6.46; 9.11 6.31 46 8.91; 8.61 7.05 46 26.43; 7.13 6.5 50 23.57; 2.39 6.77 38 24.62; 7.69 6.79 38 6.01; 9.3 6.81 27 31.57; 5.45 7.62 51 8.46; 6.19 7.27 17 7.51; 7.93 7.53 9 6.52; 4.4 7.28 17 25.3; 7.46 8.24 23 14.42; 2.01 5.55 47 26.31; 2.04 6.42 31 7.91; 7.73 6.14 52 15.72; 6.35 7.58 25 29.46; 8.29 8.41 39 12.02; 3.54 7.27 54 3.16; 7.44 6.26 82 8.41];

1.2 数据导入与基本检查

在MATLAB中导入数据后,首先应进行基本的数据质量检查:

% 检查数据缺失值 missing_values = sum(isnan(data), 1); disp(['各指标缺失值数量:', num2str(missing_values)]); % 检查数据范围 disp(['含氧量范围:', num2str([min(data(:,1)), max(data(:,1))])]); disp(['PH值范围:', num2str([min(data(:,2)), max(data(:,2))])]);

提示:在实际应用中,建议将数据保存为.mat文件便于后续重复使用,使用saveload命令实现数据的存储和读取。

2. 指标正向化处理

2.1 指标类型识别与转换

TOPSIS方法要求所有指标均为极大型(效益型),因此需要对不同类型指标进行正向化转换:

  1. 极小型指标转换

    function posit_x = Min2Max(x) posit_x = max(x) - x; % 或使用1./x当x全为正数时 end
  2. 中间型指标转换

    function posit_x = Mid2Max(x, best) M = max(abs(x - best)); posit_x = 1 - abs(x - best) / M; end
  3. 区间型指标转换

    function posit_x = Inter2Max(x, a, b) M = max([a-min(x), max(x)-b]); posit_x = zeros(size(x)); for i = 1:length(x) if x(i) < a posit_x(i) = 1 - (a - x(i))/M; elseif x(i) > b posit_x(i) = 1 - (x(i) - b)/M; else posit_x(i) = 1; end end end

2.2 实际应用示例

针对我们的水质数据集,各指标处理方式如下:

指标名称原始类型转换参数转换方法
含氧量极大型无需转换
PH值中间型best=7Mid2Max
细菌总数极小型Min2Max
植物性营养物量区间型a=10, b=20Inter2Max
% 应用正向化处理 normalized_data = data; normalized_data(:,3) = Min2Max(data(:,3)); % 细菌总数 normalized_data(:,2) = Mid2Max(data(:,2), 7); % PH值 normalized_data(:,4) = Inter2Max(data(:,4), 10, 20); % 植物性营养物量

3. 数据标准化与距离计算

3.1 标准化处理

标准化目的是消除不同指标量纲的影响,采用向量归一化方法:

Z = normalized_data ./ sqrt(sum(normalized_data.^2, 1)); disp('标准化矩阵:'); disp(Z);

标准化后的数据满足每列元素的平方和为1,确保各指标处于相同量纲尺度。

3.2 理想解与负理想解确定

根据标准化矩阵Z,确定各指标的最优解和最劣解:

Z_max = max(Z); % 理想解 Z_min = min(Z); % 负理想解

3.3 距离计算与得分归一化

计算各评价对象与理想解和负理想解的欧氏距离:

D_plus = sqrt(sum((Z - Z_max).^2, 2)); % 与理想解距离 D_minus = sqrt(sum((Z - Z_min).^2, 2)); % 与负理想解距离 S = D_minus ./ (D_plus + D_minus); % 未归一化得分 normalized_S = S / sum(S); % 归一化得分 % 按得分排序 [score, rank] = sort(normalized_S, 'descend');

4. 结果分析与可视化

4.1 水质排名结果

下表展示了20条河流的最终评价结果:

排名河流编号归一化得分与理想解距离与负理想解距离
1K0.07020.15790.5212
2J0.06840.16830.4997
3I0.06810.19040.5550
...............
20N0.01920.56680.1506

4.2 结果可视化

使用MATLAB绘制得分分布图:

figure; barh(score(end:-1:1)); set(gca, 'YTickLabel', rank(end:-1:1)); xlabel('归一化得分'); ylabel('河流排名'); title('TOPSIS水质评价结果');

4.3 结果解读要点

  1. 得分含义:得分越接近1表示水质越好,越接近0表示水质越差
  2. 关键指标影响:通过分析各指标对最终得分的贡献,可识别影响水质的关键因素
  3. 敏感性分析:可调整指标权重或参数设置,观察排名变化情况

5. 模型优化与扩展应用

5.1 权重优化方法

标准TOPSIS假设各指标权重相同,实际应用中可通过以下方法优化:

  1. 主观赋权法:层次分析法(AHP)

    % 示例:使用特征值法计算权重 [V, D] = eig(comparison_matrix); max_eig = max(diag(D)); weights = V(:, diag(D) == max_eig); weights = weights / sum(weights);
  2. 客观赋权法:熵权法

    % 计算信息熵 P = Z ./ sum(Z, 1); E = -sum(P .* log(P), 1) / log(size(Z,1)); weights = (1 - E) / sum(1 - E);

5.2 应用扩展建议

  1. 动态评价:结合时间序列数据,分析水质变化趋势
  2. 空间分析:将评价结果与地理信息系统结合,进行空间可视化
  3. 组合评价:结合其他评价方法(如模糊综合评价)提高结果可靠性

6. 完整代码实现

以下是整合所有步骤的完整MATLAB代码:

function water_quality_ranking() % 数据加载 data = [4.69 6.59 51 11.94; 2.03 7.86 19 6.46; ...]; % 完整数据 % 指标正向化 normalized_data = data; normalized_data(:,3) = Min2Max(data(:,3)); normalized_data(:,2) = Mid2Max(data(:,2), 7); normalized_data(:,4) = Inter2Max(data(:,4), 10, 20); % 标准化 Z = normalized_data ./ sqrt(sum(normalized_data.^2, 1)); % 距离计算 Z_max = max(Z); Z_min = min(Z); D_plus = sqrt(sum((Z - Z_max).^2, 2)); D_minus = sqrt(sum((Z - Z_min).^2, 2)); % 得分计算与排序 S = D_minus ./ (D_plus + D_minus); normalized_S = S / sum(S); [score, rank] = sort(normalized_S, 'descend'); % 结果输出 disp('水质评价排名结果:'); disp(table(rank, score, 'VariableNames', {'河流编号','归一化得分'})); end % 各正向化函数定义...

在实际项目中,我发现将各功能模块封装为独立函数能显著提高代码的可维护性和复用性。特别是在处理大量数据时,合理使用MATLAB的矩阵运算可以避免循环,大幅提升计算效率。

http://www.jsqmd.com/news/989773/

相关文章:

  • Windows系统文件credui.dll文件丢失找不到问题解决
  • 更懂你的ChatGPT来了!通过做梦整理记忆,事实准确率83%
  • 2026年成都奢侈品寄卖市场格局与发展趋势分析——以新津区及主城区代表性机构为例 - 优质品牌商家
  • HBase性能优化与高可用配置
  • 大型语言模型中的人格子网络现象与剪枝技术
  • 别再纠结选哪个了!用Python实战对比X-Bar-S与X-Bar-R控制图,附完整代码与CPK计算
  • 2026年 深圳MES系统/软件/方案源头厂商排行榜:智能车间数字化转型的优选推荐 - 品牌发掘
  • pixi-live2d-display企业级解决方案:革命性的Web动态角色集成框架
  • 医学影像零样本解剖区域检测技术解析
  • 船舶检测专用YOLOv5工程包:带预训练模型、VOC格式数据集与完整训练推理代码
  • 3个突破性方法:如何用ROS2 SDK彻底改造四足机器人?
  • PMSM全速域无传感器控制实战包:含EKF算法Simulink模型、推导教程与参数调试脚本
  • 洛雪音乐音源完全指南:解锁全网高品质音乐的秘密武器
  • 用Python+LLM复刻斯坦福AI小镇:手把手教你搭建自己的25个智能体沙盒
  • 黑苹果配置革命:OpCore-Simplify让OpenCore配置从8小时缩短到30分钟
  • 2026年AI论文写作工具全攻略:分阶段搭配策略+实测横向测评,一站式提升科研写作效率
  • AUFS是什么
  • 2026年支吊架行业供应体系分析:从选型到交付的可靠路径参考 - 优质品牌商家
  • 别再手动拖拽了!用poi-tl 1.10.5给Word模板批量“挂”上附件(附完整Java代码)
  • 别再只点灯了!用ESP32的FFT功能做个实时音频分析仪,附Arduino代码详解
  • AIri项目容器化部署深度解析:从单机到云原生完整实战
  • 数据备份101:企业容灾入门指南
  • 分数对数拉普拉斯算子:理论与应用解析
  • 数据的加密与解密(03:52)
  • 2026年四川客梯安装厂家TOP5排行及选型参考 - 优质品牌商家
  • C语言扫雷项目复盘:我是如何用两个二维数组搞定游戏核心逻辑的
  • 调试利器:手把手教你用Python解析HEX-ASCII码还原浮点数(逆向转换教程)
  • 【AI daily 2026-06-10】RAG 2026 已进入“Agentic RAG“时代
  • 如何用Unlock Music终极解决音乐解密和音频格式转换问题:3种简单快速的方法
  • Whiteout