news 2026/6/11 3:50:10

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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的矩阵运算可以避免循环,大幅提升计算效率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 3:46:13

UVM寄存器模型实战:手把手教你从CSV文件自动生成可用的寄存器模型代码

UVM寄存器模型自动化实战&#xff1a;从CSV到可验证代码的工业级解决方案在芯片验证领域&#xff0c;寄存器模型构建往往是项目初期最耗时且容易出错的环节之一。当硬件设计团队交付一份包含数百个寄存器的Excel表格时&#xff0c;传统手工编码方式不仅效率低下&#xff0c;更可…

作者头像 李华
网站建设 2026/6/11 3:46:13

别再乱格式化硬盘了,最全的10大文件系统一次讲透

很多人买了U盘、移动硬盘、NAS,甚至装Linux系统时,都会碰到一个问题: 格式化的时候到底选什么文件系统? FAT32? exFAT? NTFS? ext4? 还是最近越来越火的Btrfs和ZFS? 对于大多数人来说,这些名字都很熟悉,但真正知道区别的人并不多。 今天这篇文章,带大家一次…

作者头像 李华
网站建设 2026/6/11 3:42:06

从棒球击打到陀螺仪:用Python模拟5个经典案例,彻底搞懂转动惯量

从棒球击打到陀螺仪&#xff1a;用Python模拟5个经典案例&#xff0c;彻底搞懂转动惯量转动惯量这个概念&#xff0c;听起来像是物理课本里那些让人昏昏欲睡的公式之一。但当你看到花样滑冰运动员收紧手臂高速旋转&#xff0c;或是无人机在空中稳定悬停时&#xff0c;背后都是转…

作者头像 李华
网站建设 2026/6/11 3:40:55

Stability AI生成模型终极指南:5步掌握多模态AI创作核心技术

Stability AI生成模型终极指南&#xff1a;5步掌握多模态AI创作核心技术 【免费下载链接】generative-models Generative Models by Stability AI 项目地址: https://gitcode.com/GitHub_Trending/ge/generative-models 你是否曾为AI生成模型的复杂配置而头疼&#xff1…

作者头像 李华