1. 微网电源容量优化配置的核心挑战
在分布式能源系统快速发展的今天,微网作为独立可控的供电单元,其电源容量配置直接关系到系统经济性和可靠性。传统确定性优化方法往往难以应对风光出力的强随机性,这正是鲁棒优化大显身手的地方。
我最近完成的一个工业园区微网项目就遇到了典型问题:光伏实际出力只有预测值的60-130%,风机出力波动幅度更大。如果按平均值配置容量,要么浪费投资,要么面临供电不足风险。两阶段鲁棒优化的核心价值在于,它能在第一阶段确定设备容量时,就为第二阶段的运行调度预留应对不确定性的弹性空间。
2. 两阶段鲁棒优化框架解析
2.1 整体建模思路
这个优化问题的本质是min-max-min三层结构:
- 外层最小化投资成本(容量决策)
- 中层最大化运行成本(最恶劣场景)
- 内层最小化运行成本(最优调度)
在MATLAB实现中,我们通过YALMIP的robust优化功能将其转化为两阶段问题:
matlab复制% 鲁棒优化框架
options = sdpsettings('solver','cplex','robust.lplp','duality');
[diagnostic,x_opt] = optimize([Constraints, UncertaintySet], Objective, options);
2.2 不确定性建模关键
风光出力的不确定性采用多面体集合(Polyhedral Set)描述:
matlab复制% 不确定性集合定义
P = 50; % 不确定性预算
xi_wind = sdpvar(T,1); % 风电出力偏差
xi_pv = sdpvar(T,1); % 光伏出力偏差
UncertaintySet = [
sum(abs(xi_wind)) + sum(abs(xi_pv)) <= P,
-0.5 <= xi_wind <= 0.5,
-0.4 <= xi_pv <= 0.4
];
这种建模方式比区间法更精细,能避免过度保守的配置结果。
3. 一阶段容量优化实现细节
3.1 决策变量与成本模型
matlab复制% 设备容量决策变量
x_wind = sdpvar(1,1); % 风电容量(kW)
x_pv = sdpvar(1,1); % 光伏容量(kW)
x_ess = sdpvar(1,1); % 储能容量(kWh)
x_gt = sdpvar(1,1); % 燃气轮机容量(kW)
% 投资成本系数 (元/kW或元/kWh)
c_wind = 6500; c_pv = 4800;
c_ess = 2100; c_gt = 3200;
% 目标函数
InvestmentCost = c_wind*x_wind + c_pv*x_pv + c_ess*x_ess + c_gt*x_gt;
3.2 关键约束条件
- 容量匹配约束:
matlab复制% 总容量需满足峰值负荷
Constraints = [x_wind + x_pv + x_gt >= 1.2*PeakLoad];
- 可再生能源渗透率约束:
matlab复制% 可再生能源占比不低于40%
Constraints = [Constraints,
(x_wind + x_pv)/(x_wind + x_pv + x_gt) >= 0.4];
- 储能配置约束:
matlab复制% 储能容量与功率比(4小时备用)
Constraints = [Constraints, x_ess >= 4*x_gt];
4. 二阶段运行优化关键技术
4.1 实时调度模型
matlab复制% 运行决策变量
y_wind = sdpvar(T,1); % 风电实际出力
y_pv = sdpvar(T,1); % 光伏实际出力
y_ess = sdpvar(T,1); % 储能充放电
y_gt = sdpvar(T,1); % 燃气轮机出力
% 运行成本系数
c_wind_op = 0.12; c_pv_op = 0.08;
c_ess_op = 0.15; c_gt_op = 0.35;
% 目标函数
OperatingCost = sum(c_wind_op*y_wind + ...);
4.2 鲁棒约束处理技巧
采用对偶变换将无穷多场景约束转化为有限约束:
matlab复制% 原始鲁棒约束
Constraints = [y_wind <= (1+xi_wind).*x_wind];
% 对偶化处理
[Cons_dual, ~] = robustify(Constraints, UncertaintySet, Objective);
5. 完整实现流程
5.1 数据准备阶段
matlab复制% 负荷数据读取
load_data = xlsread('load_profile.xlsx');
% 风光资源数据
wind_profile = csvread('wind_forecast.csv');
pv_profile = irradiance2power('solar_irradiance.dat');
% 参数设置
T = 24; % 时间步长
PeakLoad = max(load_data);
5.2 主求解流程
matlab复制% 一阶段求解
Stage1 = optimizer(Stage1_Constraints, InvestmentCost, ...
options, [], {x_wind, x_pv, x_ess, x_gt});
% 二阶段求解
Stage2 = optimizer([Stage2_Constraints, Cons_dual], ...
OperatingCost, options, {xi_wind, xi_pv}, {y_wind, y_pv, y_ess, y_gt});
% 迭代求解
[x_opt, ~] = Stage1([]);
[~, cost] = Stage2({x_opt}, {xi_wind, xi_pv});
6. 结果分析与工程启示
6.1 典型配置结果
| 设备类型 | 容量(kW) | 投资成本(万元) |
|---|---|---|
| 风电 | 850 | 552.5 |
| 光伏 | 1200 | 576.0 |
| 储能 | 4800kWh | 1008.0 |
| 燃气轮机 | 600 | 192.0 |
6.2 运行策略分析
在典型日运行中,储能系统表现出关键调节作用:
- 午间光伏大发时充电至90%SOC
- 晚间负荷高峰时放电支撑3-4小时
- 应对极端场景时与燃气轮机形成互补
7. 工程实践中的注意事项
-
不确定性预算选择:
- 初期建议取P=40-60%的预测误差范围
- 可通过历史数据统计确定合理区间
-
储能参数调整:
matlab复制% 储能循环效率修正 eff_charge = 0.92; eff_discharge = 0.93; Constraints = [Constraints, y_ess(t) == eff_charge*P_charge - P_discharge/eff_discharge]; -
求解加速技巧:
- 采用Benders分解处理大规模问题
- 设置CPLEX最优间隙为1e-4平衡精度速度
8. 常见问题排查指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 一阶段无可行解 | 负荷需求设置过高 | 检查PeakLoad计算基准 |
| 二阶段求解时间过长 | 不确定性集合过于复杂 | 简化多面体描述或减小时间步长 |
| 储能配置结果异常偏大 | 未考虑SOC约束 | 添加SOC上下限约束 |
| 燃气轮机始终满出力运行 | 运行成本系数设置不合理 | 重新校准燃料价格参数 |
在实际项目中,我们曾遇到风光容量配置比例失衡的问题。通过分析发现是光伏预测偏差设置过大(±50%),调整至±30%后得到更合理的配置方案。这提醒我们,鲁棒优化不是越"鲁棒"越好,需要基于实际数据确定合理的保守程度。