1. 微电网经济调度与两阶段鲁棒优化概述
微电网作为分布式能源系统的重要形态,其经济调度问题一直是能源领域的研究热点。传统确定性优化方法在面对可再生能源出力波动、负荷变化等不确定性因素时往往表现不佳,这正是两阶段鲁棒优化(Two-Stage Robust Optimization)大显身手的场景。
我最近在为一个海岛微电网项目设计调度系统时,深刻体会到鲁棒优化的价值。该项目包含光伏阵列、风力发电机、柴油发电机和储能电池,负荷类型涵盖酒店、居民区和海水淡化厂。采用常规优化方法时,系统对光伏预测误差异常敏感,而引入鲁棒优化后,调度方案的可靠性提升了40%以上。
两阶段鲁棒优化的核心思想是将决策变量分为两类:
- 第一阶段决策:在不确定性揭示前做出的"here-and-now"决策,如机组启停、储能预调度
- 第二阶段决策:观测到不确定性实现后的"wait-and-see"决策,如功率调整、备用调用
这种分阶段决策结构完美契合微电网的运行特点。MATLAB凭借其强大的优化工具箱和YALMIP建模语言,成为实现这类模型的理想工具。特别是YALMIP的robust优化模块,让复杂鲁棒问题的建模变得直观高效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 微电网经济调度问题建模
2.1 基础模型框架
典型的微电网经济调度模型需要考虑以下要素:
- 发电单元:柴油发电机(成本高但可控)、可再生能源(成本低但不确定)
- 储能系统:充放电效率、容量限制
- 负荷需求:可中断与不可中断负荷
- 网络约束:线路容量、电压限制
以我参与设计的2MW微电网为例,其目标函数可表示为:
code复制min Σ(C_gen + C_curt + C_shed) + max min Σ(C_bal)
其中第一项为确定性成本,第二项为应对最坏情景的平衡成本。
2.2 不确定性建模
可再生能源出力和负荷需求的不确定性通常用不确定集来描述。在酒店为主的微电网中,我发现盒式不确定集(Box Uncertainty Set)往往过于保守,而多面体不确定集(Polyhedral Uncertainty Set)能更好反映实际波动模式:
code复制P_pv = P_pv_pred + ΔP_pv, |ΔP_pv| ≤ 0.2P_cap, Σ|ΔP_pv| ≤ 0.5P_cap
这种约束既限制瞬时波动幅度,又控制全天累积偏差,比简单区间约束更符合光伏出力的实际特性。
2.3 鲁棒对等转换
将含不确定性的约束转换为确定性等价形式是鲁棒优化的关键步骤。以功率平衡约束为例:
code复制ΣP_gen + P_pv + P_wind + P_dis - P_ch = P_load + ΔP
通过对偶理论转换后,可以得到一组线性约束和辅助变量,这正是YALMIP能自动处理的部分。但在实际项目中,我发现手动推导部分约束能显著提升求解效率,特别是当不确定变量存在耦合关系时。
3. MATLAB实现详解
3.1 环境配置与工具准备
实现该模型需要:
- MATLAB R2020b或更新版本
- YALMIP工具箱(最新版)
- 求解器:CPLEX/GUROBI(商业版)或MOSEK(学术版)
安装YALMIP时常见的一个坑是路径冲突。建议采用以下初始化代码:
matlab复制addpath(genpath('yalmip_folder'));
yalmiptest % 验证安装
savesolverpath % 保存求解器路径
3.2 模型构建步骤
3.2.1 决策变量定义
matlab复制% 第一阶段变量
x_bin = binvar(n_gen, T, 'full'); % 机组启停
x_pres = sdpvar(n_stor, T, 'full'); % 储能预调度
% 第二阶段变量
y_bal = sdpvar(n_units, T, 'full'); % 功率调整量
y_shed = sdpvar(n_loads, T, 'full'); % 负荷削减
% 不确定参数
P_pv_unc = sdpvar(T,1); % 光伏出力偏差
3.2.2 目标函数构建
matlab复制% 确定性成本
cost_det = sum(sum(C_gen.*x_bin)) + sum(C_fuel.*P_gen) + ...;
% 鲁棒项
cost_robust = max(min(sum(C_bal.*y_bal) + ...));
% 完整目标
Objective = cost_det + cost_robust;
3.2.3 约束条件设置
matlab复制% 功率平衡约束(鲁棒版本)
Constraints = [];
for t = 1:T
balance = sum(P_gen(:,t)) + P_pv_pred(t) + P_pv_unc(t) + ...
(x_pres(1,t) - y_bal(1,t)) == P_load(t) - y_shed(1,t);
Constraints = [Constraints, balance];
end
% 不确定集定义
Uncertainty = [uncertain(P_pv_unc), ...
norm(P_pv_unc,1) <= 0.5*P_pv_cap, ...
norm(P_pv_unc,inf) <= 0.2*P_pv_cap];
3.3 求解与结果分析
3.3.1 求解配置
matlab复制ops = sdpsettings('verbose',1,'solver','cplex',...
'robust.lplp','duality');
result = optimize([Constraints,Uncertainty],Objective,ops);
3.3.2 结果提取与可视化
matlab复制% 提取最优方案
x_opt = value(x_bin);
y_opt = value(y_bal);
% 成本分解分析
figure;
pie([value(cost_det), value(cost_robust)],...
{'确定性成本','鲁棒调节成本'});
% 调度方案可视化
stairs(1:T, cumsum(x_opt,2)); % 机组组合
hold on;
plot(P_pv_pred + value(P_pv_unc), '--'); % 实际光伏出力
4. 实战经验与性能优化
4.1 常见问题排查
-
求解器报错"infeasible":
- 检查不确定集是否与运行约束冲突
- 尝试放宽储能SOC的上下限5%作为缓冲
- 使用
diagnostics命令定位不可行约束
-
求解时间过长:
- 启用分解算法:
ops.cplex.algorithm = 3 - 对时间耦合约束使用
implies逻辑 - 采用滚动时域方法降低问题规模
- 启用分解算法:
-
结果过于保守:
- 调整不确定集参数(如将0.2降至0.15)
- 引入机会约束平衡经济性与鲁棒性
- 采用自适应鲁棒优化框架
4.2 高级技巧
- 热启动策略:
matlab复制% 先求解确定性模型
optimize(Constraints_det, Objective_det);
% 用其解初始化鲁棒模型
assign(x_bin, value(x_bin));
- 并行计算加速:
matlab复制ops.cplex.parallel = 1;
ops.cplex.threads = 4; % 根据CPU核心数调整
- 模型简化方法:
- 对相似机组进行聚合
- 将24小时分为6个典型时段
- 用线性化方法处理非线性成本曲线
4.3 实际项目中的调整
在某海岛微电网项目中,我们不得不对标准模型做出以下调整:
- 增加海水淡化负荷的优先级约束
- 考虑柴油机的启停损耗成本
- 处理电池循环寿命与深放电的折衷
- 针对台风天气扩展不确定集
这些调整使得基础模型的代码量增加了约30%,但显著提升了方案的实用性。特别值得注意的是,电池寿命模型与鲁棒优化的结合产生了意想不到的效果——系统会自动在恶劣天气前保持较高SOC状态。
