1. 微网优化调度与YALMIP工具概述
微电网作为分布式能源系统的重要实现形式,其优化调度直接影响着运行经济性和供电可靠性。传统手工建模方法在面对复杂约束条件时往往力不从心,而YALMIP作为MATLAB平台的建模语言,通过其声明式语法大幅简化了优化问题的表述过程。我在参与某工业园区微网项目时,曾用三天时间手工构建的调度模型,改用YALMIP后仅需半天即可完成同等复杂度的建模。
这个工具箱最吸引人的特点是其"翻译器"功能——用户只需用直观的数学语言描述问题,YALMIP会自动将其转换为底层求解器(如CPLEX、GUROBI)所需的格式。去年调试某医院微网时,我们需要在冷热电联供模型中添加设备启停约束,传统方法需要重写整个模型,而YALMIP只需新增几行约束条件代码。
2. 模型构建核心要素解析
2.1 决策变量定义技巧
在构建24小时调度模型时,建议采用时间索引方式定义变量:
matlab复制P_grid = sdpvar(24,1); % 购电功率
P_pv = sdpvar(24,1); % 光伏出力
实际项目中我发现,对于储能这类具有状态累积特性的设备,采用矩阵形式定义能简化充放电逻辑:
matlab复制ESS_ch = sdpvar(24,1,'full'); % 充电功率
ESS_dis = sdpvar(24,1,'full'); % 放电功率
重要提示:定义变量时务必显式指定'full'参数,避免YALMIP默认的对称变量假设导致模型错误。某次项目调试中,未指定的储能变量被误认为对称矩阵,导致调度方案出现昼夜倒置。
2.2 约束条件建模实践
微网运行需要满足的典型约束包括:
- 功率平衡约束:
matlab复制Constraints = [sum(P_pv + P_diesel + ESS_dis - ESS_ch) == Load];
- 储能系统约束需考虑:
- SOC状态转移:
SOC(t+1) = SOC(t) + (η_ch*P_ch - P_dis/η_dis)*Δt - 充放电互斥:
P_ch(t)*P_dis(t) = 0
- SOC状态转移:
处理这类非线性约束时,我通常采用大M法进行线性化:
matlab复制M = 1000; % 足够大的常数
Constraints = [Constraints, ESS_ch <= M*(1-u), ESS_dis <= M*u];
其中u为二进制变量,通过这种方式将原本的非线性问题转化为MILP问题。
3. 目标函数设计与优化
3.1 经济性目标构建
典型微网运行成本包含:
- 购电成本:
C_grid = sum(c_grid.*P_grid) - 燃料成本:
C_fuel = sum(c_diesel.*P_diesel) - 设备损耗成本:
C_wear = c_bat*sum(ESS_ch + ESS_dis)
在商业园区项目中,我们通过引入分时电价系数使模型更贴合实际:
matlab复制TimePrice = [repmat(0.5,1,7), repmat(1.2,1,10), repmat(0.8,1,7)]; % 峰谷平电价
Objective = sum(TimePrice'.*P_grid) + ...;
3.2 多目标优化处理
当需要兼顾经济性和环保指标时,可采用ε-约束法:
matlab复制Constraints = [Constraints, sum(P_diesel) <= ε_CO2];
或加权求和法:
matlab复制Objective = w1*Cost + w2*sum(P_diesel)*CarbonFactor;
实际应用中发现,权重系数选择对结果影响显著。建议先进行归一化处理:
matlab复制w1 = Cost_max/(Cost_max + Emission_max);
w2 = 1 - w1;
4. 求解器配置与调试经验
4.1 求解器性能对比
| 求解器 | 适用问题类型 | 许可证要求 | 求解速度(测试案例) |
|---|---|---|---|
| CPLEX | MILP | 商业 | 12.3s |
| GUROBI | MIQP | 商业 | 9.8s |
| IPOPT | NLP | 开源 | 23.7s |
| CBC | MILP | 开源 | 32.1s |
在最近的海岛微网项目中,我们发现GUROBI对混合整数问题的预处理能力尤为突出。当模型包含200+整数变量时,其求解速度比CPLEX快约15%。
4.2 常见报错处理
-
Infeasible model错误:
- 使用
diagnostics函数定位冲突约束 - 逐步注释约束条件排查
- 检查变量边界是否合理
- 使用
-
Out of memory问题:
- 启用
saveSolverOutput选项保存中间结果 - 尝试
sdpsettings('solver','gurobi','gurobi.Method',1)启用单纯形法
- 启用
-
数值不稳定:
- 缩放变量范围到相近数量级
- 设置
sdpsettings('solver','gurobi','gurobi.NumericFocus',3)
5. 实际项目应用案例
某制造园区微网参数:
- 光伏容量:2MW
- 储能系统:1MW/4MWh
- 柴油机组:3×800kW
通过YALMIP构建的优化模型实现了:
- 运行成本降低27%
- 柴油机运行时间减少41%
- 计算耗时从原有Excel模型的6小时缩短至15分钟
关键实现代码片段:
matlab复制% 分时电价设置
electricity_price = [0.35*ones(1,7), 0.78*ones(1,10), 0.43*ones(1,7)];
% 目标函数
Objective = sum(electricity_price'.*P_grid) + ...
sum(500*P_diesel) + ...
0.1*sum(ESS_ch + ESS_dis);
% 储能约束
for t = 1:23
Constraints = [Constraints, ...
SOC(t+1) == SOC(t) + 0.95*ESS_ch(t) - ESS_dis(t)/0.95];
end
调试中发现,将储能效率从固定值改为时变参数(考虑温度影响)后,冬季调度方案更符合实测数据。这提示我们在建模时需要根据实际运行数据持续修正模型参数。