1. 微电网优化调度问题概述
微电网作为分布式能源系统的重要实现形式,其优化调度直接关系到运行经济性和供电可靠性。我们面对的核心问题是在24小时周期内,协调柴油发电机、储能系统和风力发电机的出力组合,在满足用电需求的前提下实现总运行成本最小化。这本质上是一个典型的约束优化问题,需要同时考虑设备物理限制、能量平衡和运行经济性等多重因素。
从工程实践角度看,微电网调度有三大难点:首先是电源特性差异大——柴油机有最小出力限制和启停成本,风电具有强随机性,储能系统则需要考虑充放电效率与荷电状态(SOC)的耦合关系。其次是时间耦合性强,特别是储能系统的SOC状态具有强时间关联性,当前时刻的决策会影响后续多个时段的运行可行性。最后是约束条件复杂,包括功率平衡、设备运行限值、爬坡率限制等多类约束需要同时满足。
2. 建模工具选型与配置
2.1 YALMIP+CPLEX组合优势
选择YALMIP作为建模语言主要基于其三大优势:首先是语法简洁,用直观的数学表达式描述优化问题,避免了传统MATLAB优化工具箱需要手动构造约束矩阵的繁琐过程。其次是求解器无关性,同一模型可以无缝切换CPLEX、GUROBI等不同求解器。最重要的是其出色的可读性,约束条件和目标函数的数学意义一目了然。
CPLEX作为商业求解器,在处理中等规模线性/二次规划问题时表现出色。实测数据显示,对于24时段的微电网调度问题,CPLEX的求解速度比开源求解器如GLPK快10-20倍,特别是在处理储能系统带来的复杂时间耦合约束时优势明显。学术用户可通过IBM官网申请免费许可,注意选择与MATLAB版本匹配的CPLEX版本。
2.2 环境配置要点
安装配置时需要特别注意:
- 设置正确的路径包含顺序:先添加CPLEX安装路径,再添加YALMIP路径
- 验证求解器识别:运行
yalmiptest命令时,CPLEX状态应显示为绿色"√" - 处理常见报错:若出现"License expired"提示,需检查CPLEX许可证文件的系统时间是否过期
提示:在Windows系统中,环境变量
PATH中CPLEX动态链接库(dll文件)的路径优先级需高于MATLAB自带的优化工具箱,避免求解器冲突。
3. 数学模型构建详解
3.1 决策变量定义
采用YALMIP的sdpvar声明三类核心变量:
matlab复制T = 24; % 时间分段数
P_dg = sdpvar(T,1); % 柴油发电机出力[kW]
P_bat = sdpvar(T,1); % 储能充放电功率[kW],正为放电
Bat_SOC = sdpvar(T,1); % 储能荷电状态[%]
变量维度设计原则是每个时段对应一个决策变量,便于后续向量化建模。其中储能功率采用单变量表示充放电状态,通过符号区分方向,比分别定义充电/放电变量更节省计算资源。
3.2 目标函数构造
柴油发电机运行成本采用二次函数近似:
matlab复制a = 0.15; b = 2.3; c = 10; % 成本系数
cost_dg = a*P_dg.^2 + b*P_dg + c; % 各时段成本
total_cost = sum(cost_dg); % 总成本目标
二次项系数a反映燃料消耗率随负载的变化特性,实测数据显示当柴油机负载率在40-80%时,该模型误差小于5%。线性项b包含维护成本和人工成本,常数项c表示空载运行成本。
3.3 约束条件设置
3.3.1 功率平衡约束
matlab复制constraints = [P_dg + P_wind' + P_bat == P_load'];
注意负荷与发电功率的量纲统一,建议全部采用kW为单位。风电预测数据P_wind需要转置为列向量以匹配其他变量维度。
3.3.2 储能系统动态约束
matlab复制for t = 2:T
constraints = [constraints,
Bat_SOC(t) == Bat_SOC(t-1) + 0.9*P_bat(t)*0.25, % SOC更新
Bat_SOC(t) >= 20, Bat_SOC(t) <= 100, % SOC限幅
P_bat(t) >= -30, P_bat(t) <= 30 % 功率限幅
];
end
其中0.9为充放电效率系数,0.25对应15分钟时间分辨率(将kW转换为kWh)。SOC下限设为20%可延长电池寿命,功率限值30kW由逆变器容量决定。
3.3.3 柴油机运行约束
matlab复制constraints = [constraints,
P_dg >= 10, P_dg <= 50, % 出力上下限
diff(P_dg) >= -15, diff(P_dg) <= 15 % 爬坡率约束
];
10kW的最小出力限制是避免柴油机低效运行区,±15kW/h的爬坡限制保护发动机机械结构。
4. 模型求解与结果分析
4.1 求解器参数配置
matlab复制ops = sdpsettings('solver','cplex','verbose',1);
optimize(constraints, total_cost, ops);
设置verbose=1可输出求解过程信息,对于大规模问题建议设置cplex.timelimit防止长时间无结果。
4.2 结果可视化方法
matlab复制figure;
subplot(3,1,1);
plot(1:T, value(P_dg), 'r-o'); title('柴油机出力');
subplot(3,1,2);
bar(value(P_bat)); title('储能充放电');
subplot(3,1,3);
stairs(value(Bat_SOC), 'g'); title('SOC变化');
多子图布局可直观展示各变量时序关系,stairs函数适合显示SOC的阶梯变化特性。
4.3 典型运行场景分析
风电大发时段(如夜间)会出现:
- 柴油机仍保持最小出力10kW,这是受限于其技术参数
- 储能系统充电功率达到上限-30kW
- 多余风电被弃用(模型未考虑弃风惩罚)
这种现象揭示了基础模型的局限性,需要通过引入混合整数规划(MIP)来建模柴油机的启停决策。
5. 高级建模技巧
5.1 混合整数规划扩展
为柴油机添加启停状态变量:
matlab复制u_dg = binvar(T,1); % 启停状态
constraints = [constraints,
P_dg >= 10*u_dg, P_dg <= 50*u_dg, % 联动约束
sum(diff(u_dg)~=0) <= 3 % 最大启停次数
];
这会显著增加求解难度,建议先固定启停状态求初始解。
5.2 随机优化框架
考虑风电预测误差:
matlab复制P_wind_actual = P_wind_pred + 0.2*randn(T,1); % 添加噪声
constraints = [constraints,
P_dg + P_wind_actual + P_bat >= 0.95*P_load % 概率约束
];
5.3 灵敏度分析示例
研究柴油机成本系数影响:
matlab复制a_range = 0.1:0.02:0.2;
cost_results = zeros(size(a_range));
for i = 1:length(a_range)
cost_dg = a_range(i)*P_dg.^2 + b*P_dg + c;
optimize(constraints, sum(cost_dg), ops);
cost_results(i) = value(sum(cost_dg));
end
6. 工程实践注意事项
-
单位一致性检查:确保所有物理量单位统一,特别是时间尺度(h/min)和能量单位(kWh/kW)
-
储能效率修正:实际充放电效率不对称,应分别指定充电效率η_c和放电效率η_d:
matlab复制P_loss = (P_bat>0).*P_bat*(1-η_d) + (P_bat<0).*P_bat*(1/η_c-1); -
数据预处理:负荷和风电预测数据建议进行平滑处理,避免极端波动导致模型不可行
-
求解失败处理流程:
- 检查
yalmiperror输出 - 逐步放松约束定位冲突源
- 尝试其他初始值设置
- 检查
-
性能优化建议:
- 用向量运算替代for循环
- 稀疏矩阵存储大型约束
- 并行计算多场景分析
完整项目应包含:
- 主优化脚本(如
main_optim.m) - 数据预处理模块(
load_data.m) - 结果可视化函数(
plot_results.m) - 参数配置文件(
config_params.m)
建议采用模块化编程,各功能通过输入输出接口耦合,便于后续扩展为多目标优化或动态调度等高级应用。