1. 微电网最优调度问题概述
微电网作为分布式能源系统的重要组成部分,其运行调度的经济性直接关系到整个系统的运营成本。在实际工程中,我们常常需要解决这样一个核心问题:如何在满足各类约束条件的前提下,合理安排分布式电源、储能系统的出力,使得微电网在一天内的总运行费用达到最小。这正是典型的微电网最优调度问题。
我最近完成了一个基于Matlab的微电网优化调度案例,采用YALMIP建模工具包搭配CPLEX求解器进行求解。这个方案特别适合处理包含多种能源形式(光伏、风机、柴油发电机等)和储能系统的微电网调度问题。下面我将详细分享这个案例的实现过程和技术要点。
2. 问题建模与数学表达
2.1 目标函数构建
最优调度的核心目标是使微电网24小时的总运行费用最小化。我们的目标函数可以表示为:
min Σ(C_grid(t) + C_dg(t) + C_bat(t))
其中:
- C_grid(t):t时段从主网购电费用
- C_dg(t):t时段柴油发电机运行费用
- C_bat(t):t时段电池充放电损耗费用
每项费用都需要具体展开:
- 购电费用 = 电价(t) × 购电功率(t)
- 柴油机费用 = 燃料成本系数 × (a×P_dg(t)² + b×P_dg(t) + c)
- 电池损耗 = 充放电损耗系数 × |P_bat(t)|
2.2 系统约束条件
微电网运行需要满足以下几类关键约束:
-
功率平衡约束:
P_grid(t) + P_pv(t) + P_wind(t) + P_dg(t) + P_bat(t) = P_load(t) -
柴油发电机约束:
- 出力上下限:P_dg_min ≤ P_dg(t) ≤ P_dg_max
- 爬坡约束:|P_dg(t)-P_dg(t-1)| ≤ ΔP_dg_max
-
储能系统约束:
- SOC状态方程:SOC(t+1) = SOC(t) + (η_ch×P_ch(t) - P_dis(t)/η_dis)×Δt/E_max
- SOC上下限:SOC_min ≤ SOC(t) ≤ SOC_max
- 充放电功率限制:0 ≤ P_ch(t) ≤ P_ch_max;0 ≤ P_dis(t) ≤ P_dis_max
- 充放电互斥:P_ch(t)×P_dis(t) = 0
-
电网交互约束:
- 购售电功率限制:0 ≤ P_grid(t) ≤ P_grid_max
- 售电价格通常低于购电价格,需要考虑双向功率流动的经济性
3. YALMIP建模实现
3.1 变量定义
在Matlab中使用YALMIP定义决策变量:
matlab复制% 定义24小时各变量
P_grid = sdpvar(24,1); % 电网购电功率
P_dg = sdpvar(24,1); % 柴油机出力
P_ch = sdpvar(24,1); % 电池充电功率
P_dis = sdpvar(24,1); % 电池放电功率
SOC = sdpvar(24,1); % 电池SOC状态
3.2 约束条件实现
将数学约束转化为YALMIP表达式:
matlab复制constraints = [];
% 功率平衡约束
for t = 1:24
constraints = [constraints,
P_grid(t) + P_pv(t) + P_wind(t) + P_dg(t) + (P_dis(t)-P_ch(t)) == Load(t)];
end
% 柴油机约束
constraints = [constraints,
P_dg_min <= P_dg <= P_dg_max,
-ramp_limit <= diff(P_dg) <= ramp_limit];
% 电池约束
constraints = [constraints,
SOC(1) == initial_SOC,
SOC_min <= SOC <= SOC_max,
0 <= P_ch <= P_ch_max,
0 <= P_dis <= P_dis_max,
P_ch.*P_dis == 0]; % 充放电互斥
% SOC状态方程
for t = 1:23
constraints = [constraints,
SOC(t+1) == SOC(t) + (eta_ch*P_ch(t) - P_dis(t)/eta_dis)*delta_t/E_max];
end
3.3 目标函数实现
matlab复制% 电价数据
buy_price = [0.5 0.5 0.5 0.5 0.5 0.8 0.8 1.0 1.0 1.0 1.0 0.8 0.8 0.8 0.8 0.8 1.0 1.0 1.0 1.0 1.0 0.8 0.5 0.5];
% 构建目标函数
total_cost = 0;
for t = 1:24
grid_cost = buy_price(t)*P_grid(t);
dg_cost = 0.002*(0.5*P_dg(t)^2 + 20*P_dg(t) + 100);
battery_cost = 0.01*(P_ch(t) + P_dis(t));
total_cost = total_cost + grid_cost + dg_cost + battery_cost;
end
4. CPLEX求解与结果分析
4.1 求解器配置
matlab复制% 配置CPLEX求解器参数
options = sdpsettings('solver','cplex',...
'verbose',1,...
'cplex.timelimit',600,...
'cplex.mip.tolerances.mipgap',0.001);
% 求解优化问题
diagnostics = optimize(constraints, total_cost, options);
% 检查求解状态
if diagnostics.problem == 0
disp('最优解找到');
else
disp('求解出现问题');
disp(diagnostics);
end
4.2 结果可视化
matlab复制% 提取优化结果
P_grid_opt = value(P_grid);
P_dg_opt = value(P_dg);
P_ch_opt = value(P_ch);
P_dis_opt = value(P_dis);
SOC_opt = value(SOC);
% 绘制功率分配图
figure;
hold on;
area(P_pv + P_wind,'FaceColor',[0.9 0.9 0.2]);
area(P_dg_opt,'FaceColor',[0.2 0.6 0.9]);
area(P_grid_opt,'FaceColor',[0.5 0.5 0.5]);
area(-(P_dis_opt-P_ch_opt),'FaceColor',[0.3 0.8 0.3]);
plot(Load,'k','LineWidth',2);
legend('可再生能源','柴油机','电网','储能','负荷');
xlabel('时间(h)'); ylabel('功率(kW)');
title('微电网最优调度结果');
% 绘制SOC变化曲线
figure;
plot(SOC_opt,'LineWidth',2);
xlabel('时间(h)'); ylabel('SOC');
title('电池SOC状态变化');
4.3 经济性分析
计算并比较不同调度策略下的总成本:
- 纯电网供电成本:∑(电价(t)×负荷(t))
- 纯柴油机供电成本:∑(柴油机燃料成本)
- 优化调度成本:最优解的总成本
通过对比可以清晰看出优化调度带来的经济效益。在实际案例中,优化调度通常能节省15%-30%的运行成本。
5. 关键技术与注意事项
5.1 混合整数规划处理
电池充放电互斥约束(P_ch(t)×P_dis(t)=0)是非线性的,需要引入二进制变量将其转化为线性约束:
matlab复制% 引入二进制变量
u_ch = binvar(24,1);
u_dis = binvar(24,1);
% 修改后的约束
constraints = [constraints,
P_ch <= P_ch_max*u_ch,
P_dis <= P_dis_max*u_dis,
u_ch + u_dis <= 1];
5.2 求解效率优化
对于24小时调度问题,可以采取以下加速策略:
- 分时段求解:将24小时分为4个6小时段分别求解
- 松弛处理:先求解连续松弛问题,再固定整数变量
- 热启动:使用前一时段的解作为初始点
5.3 实际工程注意事项
-
预测误差处理:可再生能源和负荷预测都存在误差,需要:
- 采用鲁棒优化或随机规划方法
- 设置备用容量约束
- 实施滚动优化策略
-
多时间尺度协调:
- 日前调度(本案例)
- 日内滚动调整(每15分钟-1小时)
- 实时控制(秒级)
-
电池寿命考虑:
- 在目标函数中加入循环老化成本
- 限制充放电深度(DOD)
- 避免频繁充放电切换
6. 模型扩展与进阶应用
6.1 考虑需求响应
引入可平移负荷和可中断负荷,进一步降低运行成本:
matlab复制% 新增决策变量
P_shiftable = sdpvar(24,1); % 可平移负荷
P_curtailable = sdpvar(24,1); % 可中断负荷
% 修改功率平衡约束
constraints = [constraints,
P_grid(t) + P_pv(t) + P_wind(t) + P_dg(t) + (P_dis(t)-P_ch(t)) == ...
Load(t) - P_shiftable(t) - P_curtailable(t)];
% 添加需求响应约束
constraints = [constraints,
sum(P_shiftable) == total_shiftable_load,
P_shiftable >= 0,
P_curtailable >= 0,
P_curtailable <= max_curtailment];
6.2 多微电网协同优化
考虑多个微电网之间的功率互济:
matlab复制% 新增变量
P_exchange = sdpvar(24,N_microgrids,N_microgrids); % 微电网间交换功率
% 添加交换功率约束
for t = 1:24
for i = 1:N_microgrids
constraints = [constraints,
sum(P_exchange(t,i,:)) - sum(P_exchange(t,:,i)) == ... % 净交换功率
P_grid(t,i) + P_pv(t,i) + P_wind(t,i) + P_dg(t,i) + (P_dis(t,i)-P_ch(t,i)) - Load(t,i)];
end
end
6.3 考虑碳排放约束
在目标函数中加入碳排放成本,或设置碳排放上限:
matlab复制% 碳排放计算
carbon_emission = sum(0.8*P_grid + 0.6*P_dg);
% 方式1:碳成本
total_cost = total_cost + carbon_price*carbon_emission;
% 方式2:碳约束
constraints = [constraints, carbon_emission <= carbon_cap];
7. 常见问题与解决方案
7.1 求解器无法找到可行解
可能原因及解决方法:
- 约束条件相互冲突 → 检查约束逻辑,特别是功率平衡约束
- 资源容量不足 → 检查负荷需求是否超过总可用容量
- 电池SOC无法满足 → 调整初始SOC或充放电功率限值
7.2 求解时间过长
优化策略:
- 增加MIP gap容忍度(如从0.1%提高到1%)
- 限制求解时间(如设置30分钟超时)
- 简化模型(如减少时间分辨率)
7.3 结果不符合预期
检查要点:
- 电价数据是否正确输入
- 各设备参数是否合理
- 约束条件是否完整
- 目标函数权重设置是否合理
调试技巧:可以先固定部分变量,逐步释放约束,定位问题来源
8. 工程实践建议
-
数据预处理:
- 对可再生能源和负荷数据进行平滑处理
- 检查数据质量,处理异常值
- 考虑不同天气场景下的预测数据
-
模型验证:
- 先用简化模型验证基本功能
- 对比商业软件结果(如HOMER)
- 进行灵敏度分析
-
实际部署考虑:
- 将Matlab模型转换为C/C++代码
- 开发可视化监控界面
- 设置人工干预接口
-
性能监控:
- 记录每次求解时间和结果
- 监控预测误差对调度的影响
- 定期重新训练预测模型