微电网作为分布式能源的重要载体,其经济调度一直是行业痛点。特别是在台风、极端天气等场景下,光伏发电可能瞬间崩溃,负荷又会突然飙升,传统优化方法往往难以应对这种双重不确定性。我在参与某海岛微电网项目时,就曾亲眼见证过因调度方案不够鲁棒导致的整个系统瘫痪——光伏出力骤降70%的同时,应急负荷突然增加200%,柴油发电机还没来得及启动,系统就已经崩溃。
两阶段鲁棒优化正是为解决这类问题而生。它像给微电网装上"防弹衣",通过主问题制定基础调度方案,再通过子问题模拟最恶劣场景,不断迭代优化直到方案能抵御任何极端情况。本文将结合MATLAB/YALMIP/CPLEX工具链,详细解析如何构建这样的"防弹调度系统"。
两阶段鲁棒优化的核心思想可以用"先计划,后防御"来概括。主问题(第一阶段)负责制定基础调度方案,确定可控机组出力、储能充放电等"确定性"决策;子问题(第二阶段)则模拟在最恶劣的不确定性场景下,系统如何通过快速调整(如切负荷、弃光)来维持运行。
这种方法的优势在于:
在台风等极端场景下,光伏出力和负荷波动往往呈现空间相关性。我们采用椭球不确定集合而非简单的盒式约束,更符合实际情况:
matlab复制Gamma_w = 0.3; % 光伏出力最大波动比例
Gamma_d = 0.4; % 负荷最大波动比例
Constraints = [norm(delta_w./Pw_max, 2) <= Gamma_w,
norm(delta_d./Pd_max, 2) <= Gamma_d];
这种建模方式允许某些时段波动较大,但整体波动幅度受限,避免了过于保守的调度方案。
主问题的决策变量包括机组出力、储能状态等"这里现在"就要确定的量:
matlab复制% 基础参数
T = 24; % 时间周期
N_dg = 3; % 柴油机组数量
N_ess = 2; % 储能系统数量
% 决策变量定义
Pg = sdpvar(T, N_dg, 'full'); % 机组出力
U_ess = binvar(T, N_ess, 'full'); % 储能充电状态(0/1)
Pch = sdpvar(T, N_ess, 'full'); % 充电功率
Pdis = sdpvar(T, N_ess, 'full'); % 放电功率
% 目标函数:最小化确定性成本
Objective = sum(sum(C_dg.*Pg)) + sum(C_ess.*(Pch+Pdis))...
+ sum(C_curtail.*P_curt) + sum(C_shed.*P_shed);
特别注意储能建模需要防止同时充放电:
matlab复制Constraints = [Pch <= U_ess.*Pch_max,
Pdis <= (1-U_ess).*Pdis_max];
子问题本质上是一个双层优化,内层优化可再生能源和负荷波动,外层优化系统调整策略:
matlab复制% 不确定性变量
delta_w = sdpvar(T, N_wind, 'full'); % 光伏出力偏差
delta_d = sdpvar(T, N_load, 'full'); % 负荷波动量
% 调整变量(第二阶段决策)
P_curt = sdpvar(T, N_wind, 'full'); % 弃光量
P_shed = sdpvar(T, N_load, 'full'); % 切负荷量
% 最坏场景目标
WorstCase = -sum(sum(lambda_w.*delta_w))...
-sum(sum(lambda_d.*delta_d))...
+sum(sum(C_curt.*P_curt))...
+sum(sum(C_shed.*P_shed));
列与约束生成(C&CG)算法的核心迭代流程如下:
matlab复制UB = inf; LB = -inf; gap = inf;
tolerance = 1e-4; max_iter = 20;
iter = 0;
while gap > tolerance && iter < max_iter
% 求解主问题
optimize(Master_cons, Master_obj);
LB = value(Master_obj);
% 固定主问题变量,求解子问题
Pg_fixed = value(Pg);
optimize(Sub_cons, Sub_obj);
UB = min(UB, value(Sub_obj));
% 添加最恶劣场景约束
delta_w_worst = value(delta_w);
delta_d_worst = value(delta_d);
Master_cons = [Master_cons,
balance_constraint(Pg, Pch, Pdis,...
delta_w_worst, delta_d_worst)];
gap = abs(UB - LB);
iter = iter + 1;
end
在实际项目中,我们通过以下技巧将求解时间从8小时缩短到30分钟:
matlab复制options = cplexoptimset('cplex');
options.advance = 1; % 启用高级起始点
matlab复制options.threads = 4; % 使用4个线程
matlab复制Constraints = [Constraints,
sum(Pg,2) >= 0.9*sum(Pd,2)];
在某海岛微电网的实测中,当遭遇台风天气时:

matlab复制assert(size(Pg,1)==T && size(Pg,2)==N_dg,...
'机组出力矩阵维度错误!');
matlab复制figure; plot(1:iter, LB_history, 'b-o',...
1:iter, UB_history, 'r--x');
legend('下界','上界'); xlabel('迭代次数');
matlab复制lambda_w = linspace(0.5, 2, 5); % 测试不同值
matlab复制if weather == 'typhoon'
Gamma_w = 0.4; Gamma_d = 0.5;
else
Gamma_w = 0.2; Gamma_d = 0.3;
end
这套方法不仅适用于微电网,经过适当调整还可用于:
我在最近一个项目中将其扩展为三阶段优化,增加了预防-校正-恢复的全周期决策框架。实际运行表明,这种方案能够将极端天气下的停电损失降低70%以上。