news 2026/8/21 18:21:23

使用MATLAB-快速计算常用水文评价指标

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用MATLAB-快速计算常用水文评价指标
%目标函数快速计算,用于查看 clear; clc; % 读取实测径流数据 Qo = load('observed.txt'); % 检查数据格式,假设数据是每行一个数值,如果数据是列向量则无需转置 if size(Qo, 1) == 1 % 如果Qo是行向量 Qo = Qo(:); % 转换为列向量 elseif size(Qo, 2) == 1 % 如果Qo已经是列向量 % Qo已经是列向量,无需转置 else error('实测径流数据文件格式不正确,应为每行一个数值。'); end % 读取模拟径流数据 Qs = load('simulated.txt'); % 检查数据格式,假设数据是每行一个数值,如果数据是列向量则无需转置 if size(Qs, 1) == 1 % 如果Qs是行向量 Qs = Qs(:); % 转换为列向量 elseif size(Qs, 2) == 1 % 如果Qs已经是列向量 % Qs已经是列向量,无需转置 else error('模拟径流数据文件格式不正确,应为每行一个数值。'); end % 调用函数计算NSE, KGE, R2 NSE = GetNSE(Qs, Qo); KGE = GetKGE(Qs, Qo); PBIAS=GetPBIAS(Qs, Qo); RMSE=GetRMSE(Qs, Qo); % 注意:这里需要修正R2计算函数中的变量名,使用a和b而不是Qs和Qo R2 = GetR2(Qs, Qo); % 应改为 R2 = calculateR2(Qs, Qo); % 显示结果 disp(['纳什效率系数(NSE): ', num2str(NSE)]); disp(['Kling-Gupta效率系数(KGE): ', num2str(KGE)]); disp(['决定系数(R²): ', num2str(R2)]); disp(['PBIAS: ', num2str(PBIAS)]); disp(['RMSE: ', num2str(RMSE)]); % 将结果写入新的文本文件 %fileID = fopen('results.txt', 'w'); %if fileID == -1 % error('无法打开文件以写入结果。'); %end %fprintf(fileID, '纳什效率系数(NSE): %f\n', NSE); %fprintf(fileID, 'Kling-Gupta效率系数(KGE): %f\n', KGE); %fprintf(fileID, '决定系数(R²): %f\n', R2); %fprintf(fileID, 'PBIAS: %f\n', PBIAS); %fclose(fileID); %% % 径流目标函数计算 clear; clc; % 读取实测径流数据 Qo = load('observed.txt'); % 检查数据格式,假设数据是每行一个数值,如果数据是列向量则无需转置 if size(Qo, 1) == 1 % 如果Qo是行向量 Qo = Qo(:); % 转换为列向量 elseif size(Qo, 2) == 1 % 如果Qo已经是列向量 % Qo已经是列向量,无需转置 else error('实测径流数据文件格式不正确,应为每行一个数值。'); end % 读取模拟径流数据 Qs = load('simulated.txt'); % 检查数据格式,假设数据是每行一个数值,如果数据是列向量则无需转置 if size(Qs, 1) == 1 % 如果Qs是行向量 Qs = Qs(:); % 转换为列向量 elseif size(Qs, 2) == 1 % 如果Qs已经是列向量 % Qs已经是列向量,无需转置 else error('模拟径流数据文件格式不正确,应为每行一个数值。'); end % 调用函数计算mNSE,PFAB %mNSE = GetmNSE(Qs, Qo); %PFAB = GetPFAB(Qs, Qo); PBIAS=GetPBIAS(Qs, Qo); %NRMSE=GetNRMSE(Qs, Qo); RMSE=GetRMSE(Qs, Qo); % 显示结果 %disp(['修改后的纳什效率系数(mNSE): ', num2str(mNSE)]); %disp(['PFAB: ', num2str(PFAB)]); disp(['PBIAS: ', num2str(PBIAS)]); %disp(['NRMSE: ', num2str(NRMSE)]); disp(['RMSE: ', num2str(RMSE)]); % 将结果写入新的文本文件 fileID = fopen('results.txt', 'w'); if fileID == -1 error('无法打开文件以写入结果。'); end %fprintf(fileID, '修改后的纳什效率系数(mNSE): %f\n', mNSE); %fprintf(fileID, 'PFAB: %f\n', PFAB); %fprintf(fileID, 'RMSE: %f\n', RMSE); fprintf(fileID, 'PBIAS: %f\n', PBIAS); fclose(fileID); % GetNSE函数定义(保持不变) function NSE = GetNSE(Qs, Qo) if length(Qs) == length(Qo) QoAve = mean(Qo); NSE = 1 - sum((Qs - Qo).^2) / sum((Qo - QoAve).^2); else error("实测径流和模拟径流长度不等"); end end % calculateKGE函数定义(保持不变) function KGE = GetKGE(Qs, Qo) QsAve = mean(Qs); QoAve = mean(Qo); COV = cov(Qs, Qo); CC = COV(1,2) / (std(Qs) * std(Qo)); BR = QsAve / QoAve; RV = (std(Qs) / QsAve) / (std(Qo) / QoAve); KGE = 1 - sqrt((CC-1)^2 + (BR-1)^2 + (RV-1)^2); end % calculateR2函数定义(修正变量名) function R2 = GetR2(Qs, Qo) % 修正为正确的输入变量名 if length(Qs) == length(Qo) QsAve = mean(Qs); QoAve = mean(Qo); tempX = sum( (Qo-QoAve).*(Qs-QsAve)); tempY = sqrt(sum( (Qo-QoAve).^2 ) * sum( (Qs-QsAve).^2)); R2 = (tempX / tempY).^2; else error("输入数据长度不等"); end end %function mNSE = GetmNSE(Qs, Qo) % if length(Qs) == length(Qo) % QoAve = mean(Qo); % mNSE = 1 - sum(abs(Qs - Qo)) / sum(abs(Qo - QoAve)); % else % error("实测径流和模拟径流长度不等"); % end %end %function PFAB = GetPFAB(Qs, Qo) % if length(Qs) == length(Qo) % PFAB = abs(sum(Qo - Qs) / sum(Qo)) * 100; % else % error("实测径流和模拟径流长度不等"); % end %end function PBIAS = GetPBIAS(Qs, Qo) PBIAS = sum(Qo - Qs) / sum(Qo) * 100; end %function NRMSE = GetNRMSE(Qs, Qo) % 计算均方误差 % mse = mean((Qo - Qs).^2); % 计算真实值的最大值和最小值 % y_range = max(Qo) - min(Qo); % 计算NRMSE % NRMSE = sqrt(mse)*100 / y_range; %end function RMSE = GetRMSE(Qs, Qo) % 计算预测值和真实值之间的误差平方和 squared_errors = (Qo - Qs).^2; % 计算平均误差平方 mean_squared_error = mean(squared_errors); % 计算均方根误差 RMSE = sqrt(mean_squared_error); end
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 19:16:21

使用Qwen3-VL-8B生成图像描述,提升内容生产效率

使用Qwen3-VL-8B生成图像描述,提升内容生产效率 在电商运营的深夜值班中,你是否曾面对上千张待上新的商品图,一边揉着发酸的眼睛,一边机械地敲下“这款连衣裙采用优质面料”这样的重复文案?这正是当前内容生产链条中最…

作者头像 李华
网站建设 2026/8/21 2:57:28

LobeChat能否识别中文标点?语言细节处理表现评分

LobeChat 的中文标点处理能力深度解析 在中文用户越来越多地使用 AI 聊天工具的今天,一个看似微小却影响深远的问题浮现出来:系统能否正确识别并保留中文全角标点? 这不仅关乎文本是否“看起来舒服”,更直接关系到语义理解的准确性…

作者头像 李华
网站建设 2026/8/21 22:53:36

全球通用人形机器人公司盘点,智元AGIBOT引领商业化浪潮

随着具身智能与量产技术的成熟,全球通用人形机器人行业已迈入规模商业化落地的关键阶段,呈现“技术全栈化、场景多元化、量产规模化”三大特征。各国企业加速布局,一批兼具核心技术与落地能力的企业脱颖而出。本文将从多个维度,盘…

作者头像 李华
网站建设 2026/8/21 22:53:42

AutoGPT能否用于自动生成测试数据?Mock系统构建

AutoGPT能否用于自动生成测试数据?Mock系统构建 在现代软件开发节奏日益加快的今天,前后端并行开发已成为常态。然而,一个老生常谈的问题始终存在:后端接口尚未完成时,前端如何开展联调?自动化测试又该如何…

作者头像 李华
网站建设 2026/8/21 21:57:32

36、进程管理与系统调用追踪全解析

进程管理与系统调用追踪全解析 1. 进程报告准备流程 在进行进程相关的操作时,我们常常需要对进程信息进行整理和筛选,以获取我们需要的报告。下面是一个七阶段的管道流程来完成报告的准备工作: 1. ps 输出 :ps 命令的输出包含类似如下的行: USER COMMAND root sche…

作者头像 李华
网站建设 2026/8/21 0:28:20

AutoGPT如何判断任务优先级变化?动态重规划机制

AutoGPT如何判断任务优先级变化?动态重规划机制 在如今的AI浪潮中,我们早已不再满足于一个只会回答问题的聊天机器人。真正让人眼前一亮的是那些能“自己动起来”的智能体——它们拿到一个目标后,不需要步步指点,就能拆解任务、调…

作者头像 李华