%目标函数快速计算,用于查看 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使用MATLAB-快速计算常用水文评价指标
张小明
前端开发工程师
清华源加速下载Qwen3-32B模型权重文件方法详解
清华源加速下载Qwen3-32B模型权重文件方法详解 在大模型落地日益深入的今天,一个现实问题困扰着无数AI开发者:明明本地GPU集群已准备就绪,推理服务也配置完成,却卡在了最基础的一环——模型权重下载太慢。尤其是像 Qwen3-32B 这样…
LobeChat环境变量配置详解:灵活调整运行参数
LobeChat环境变量配置详解:灵活调整运行参数 在构建现代AI对话系统时,一个直观、强大的前端框架往往决定了用户体验的上限。LobeChat 正是这样一款基于 Next.js 的开源聊天应用,它不仅支持接入 GPT、Claude、通义千问等多种大模型,…
49、技术领域综合知识解析
技术领域综合知识解析 1. 符号与运算符 在编程和命令行操作中,有众多符号和运算符发挥着关键作用。以下是一些常见符号及其功能: | 符号 | 功能 | | — | — | | &(与号) | 可作为赋值运算符(&=)、逻辑与运算符(&&)、位与运算符,还用于开始 HTML…
固态断路器技术现状、应用场景与核心挑战
在全球能源转型与新型电力系统建设的双重驱动下,直流配电、新能源并网、电动汽车快充等领域对电路保护设备的响应速度、可靠性与智能化水平提出了严苛要求。传统机械断路器因响应迟缓、电弧烧蚀、寿命有限等固有缺陷,已难以适配现代电力系统的发展需求。…
21、在云环境中部署和管理 Docker 主机的全面指南
在云环境中部署和管理 Docker 主机的全面指南 1. 在 Google Compute Engine (GCE) 上启动 Docker 主机 1.1 创建 Ubuntu 实例并安装 Docker 可以通过以下命令在 GCE 上创建一个 Ubuntu 14.04 实例,并在启动时安装 Docker: --metadata startup-script=\ "sudo wget …
27、Docker 应用场景:Galera 集群负载均衡与 Spark 集群搭建
Docker 应用场景:Galera 集群负载均衡与 Spark 集群搭建 1. Galera 集群与动态负载均衡 在使用 Docker 进行多节点部署时,Galera 集群是一个不错的选择。利用 Docker Network 可以实现与单 Docker 主机相同的部署方法,这为多节点 Galera 集群的搭建提供了便利。 1.1 问题…