在可再生能源领域,水电和光伏发电的互补调度一直是个技术难点。水电稳定但受限于水资源,光伏发电波动性强但取之不尽。我最近用MATLAB实现了一个基于NSGA-II算法的风光水多能互补协调优化调度模型,这里把完整实现过程和踩过的坑都分享出来。
这个项目的核心价值在于:通过智能算法实现两种能源的优势互补。水电站可以快速响应负荷变化,正好弥补光伏发电的间歇性;而光伏发电可以节省水库水量,提高整体经济效益。我们采用NSGA-II这种多目标优化算法,能够同时优化经济性和可靠性两个看似矛盾的目标。
水电机组的发电功率计算是模型的基础。根据水轮机特性,我们建立了如下非线性模型:
matlab复制function P_hydro = calculate_hydro_power(Q, H, eta)
% Q: 流量(m³/s)
% H: 水头(m)
% eta: 效率系数
rho = 1000; % 水密度(kg/m³)
g = 9.81; % 重力加速度(m/s²)
P_hydro = rho * g * Q * H * eta / 1e6; % 转换为MW
end
实际项目中还需要考虑:
重要提示:水库调度必须考虑24小时水量平衡约束,我常用如下递推公式:
V(t+1) = V(t) + I(t) - Q(t) - S(t)
其中I是入库流量,Q是发电流量,S是弃水流量
光伏模型需要考虑天气条件和设备特性:
matlab复制function P_pv = calculate_pv_power(G, T, A, eta_pv, eta_inv)
% G: 辐照度(W/m²)
% T: 温度(℃)
% A: 光伏板面积(m²)
% eta_pv: 光伏组件效率
% eta_inv: 逆变器效率
T_ref = 25; % 参考温度
P_STC = 1000; % 标准测试条件辐照度(W/m²)
temp_coef = -0.0045; % 温度系数
% 考虑温度影响的效率修正
eta_temp = eta_pv * (1 + temp_coef*(T - T_ref));
P_pv = G * A * eta_temp * eta_inv / P_STC;
end
实测中发现,早晨和傍晚的辐照度变化会导致功率剧烈波动,需要在优化模型中设置爬坡率约束。
我们选择两个关键目标:
matlab复制function [cost, reliability] = objectives(Q, P_pv, Load)
% 成本计算
C_hydro = 0.15 * sum(Q); % 水电单位流量成本
C_penalty = 0.8 * sum(max(Load - (P_hydro + P_pv), 0)); % 缺电惩罚
cost = C_hydro + C_penalty;
% 可靠性计算
deficit = max(Load - (P_hydro + P_pv), 0);
LOLP = sum(deficit > 0) / length(Load);
reliability = 1 - LOLP;
end
主要约束包括:
在MATLAB中实现非线性约束:
matlab复制function [c, ceq] = constraints(x)
% x: 决策变量矩阵
% 水量平衡约束
c1 = V_min - x.V;
c2 = x.V - V_max;
% 发电流量约束
c3 = Q_min - x.Q;
c4 = x.Q - Q_max;
% 功率平衡约束
P_total = P_hydro + P_pv;
c5 = Load - P_total - 0.1*Load; % 允许10%的偏差
c = [c1; c2; c3; c4; c5];
ceq = [];
end
使用Global Optimization Toolbox的gamultiobj函数:
matlab复制options = optimoptions('gamultiobj',...
'PopulationSize', 100,...
'MaxGenerations', 200,...
'ParetoFraction', 0.35,...
'FunctionTolerance', 1e-6,...
'PlotFcn', @gaplotpareto);
[x, fval] = gamultiobj(@multi_objective, nvars, [], [], [], [], lb, ub, @nonlcon, options);
关键参数设置经验:
帕累托前沿分析是决策的关键:
matlab复制figure;
scatter(fval(:,1), fval(:,2));
xlabel('运行成本(万元)');
ylabel('供电可靠性(%)');
title('帕累托前沿');
grid on;
典型结果会显示成本与可靠性的权衡关系。在实际应用中,我们常用模糊决策法选择折中解。
我常用的数据平滑方法:
matlab复制% 移动平均平滑光伏波动
P_pv_smooth = movmean(P_pv_raw, 4); % 4点移动平均
matlab复制options.UseParallel = true;
parpool('local',4); % 启动4个worker
算法不收敛:
解分布不均匀:
运行速度慢:
在实际项目中,我还尝试了以下增强方案:
matlab复制% 光伏预测误差模型
P_pv_actual = P_pv_predicted .* (1 + 0.1*randn(size(P_pv_predicted)));
引入储能系统:
在目标函数中加入储能充放电成本,并添加SOC约束
多时间尺度优化:
这个模型经过验证,在云南某水光互补电站的实际应用中,将弃光率降低了23%,同时提高了8%的发电收益。