最近在能源行业混迹多年,发现综合能源系统优化调度这个领域越来越火。每次和同行聊起这个话题,大家都会心一笑——这玩意儿确实是个技术活,特别是要把电力网、天然气网和热力网三个系统耦合在一起建模的时候。今天我就把自己用Matlab+Gurobi搭建调度模型的经验分享出来,希望能帮到正在啃这块硬骨头的朋友。
先说说为什么综合能源系统调度这么重要。现在的能源系统早就不是当年各自为政的局面了,电力、燃气、热能之间的耦合越来越紧密。比如燃气轮机发电产生的余热可以供给热网,电锅炉可以把富余的电能转化为热能,这些耦合关系让系统运行效率大幅提升,但也让调度问题变得异常复杂。
我们设计的这个系统包含以下几个关键组件:
这三个子系统通过以下方式耦合:
整个优化问题可以表述为一个混合整数线性规划(MILP)问题:
目标函数:
最小化系统24小时总运行成本:
code复制min Σ(Cᴱ·Pᴱ + Cᴳ·G + ΣCᵢᴼᴾ·Pᵢ)
其中:
主要约束条件:
code复制Pᴱ + Pᴳᴱ + Pᴱˢ⁻ = Pᴰᴱ + Pᴱˢ⁺ + Pᴱᴮ
code复制Qᴳᴴ + Qᴱᴴ + Qᴴˢ⁻ = Qᴰᴴ + Qᴴˢ⁺
code复制Pᴳᴱ = ηᴳᴱ·G
Qᴳᴴ = ηᴳᴴ·G
Pᴳᴱ_min ≤ Pᴳᴱ ≤ Pᴳᴱ_max
气网流动方程本质上是非线性的,直接求解会面临非凸优化问题。我们采用文献[3]中的方法,通过分段线性化将原方程转化为线性约束:
这样处理后,原本的非线性约束转化为一组线性约束和特殊的顺序约束,可以用MILP精确求解。
储能设备的充放电不能同时进行,这是一个典型的互斥约束。我们采用Big-M法处理:
matlab复制M = 1e5; % 足够大的数
model.vtype(ess_charge) = 'B'; % 二进制变量表示充电状态
model.addConstr(Pess_ch <= M*(1 - ess_charge), 'ESS_charge1');
model.addConstr(Pess_dis <= M*ess_charge, 'ESS_charge2');
这里的关键是选择合适的M值:
以燃气轮机为例,它同时涉及电、气、热三种能源形式:
matlab复制for t=1:24
% 电出力上下限
model.A(end+1,:) = sparse([Pgen_idx(t), Heat_CHP_idx(t)], [1,1], [1, -eta_heat], 1,n_vars);
model.rhs(end+1) = 0; % 电热比约束 Pgen = eta_heat*Qheat
model.sense(end+1) = '=';
end
这里使用稀疏矩阵存储约束系数,大幅减少内存占用。对于24小时调度问题,变量规模可能达到数万个,稀疏矩阵技术至关重要。
我们采用某工业园区的实测数据,经过以下预处理:
主要设备参数参考了多篇文献的实测数据:
| 设备类型 | 参数 | 值 | 单位 | 来源 |
|---|---|---|---|---|
| 燃气轮机 | 电效率 | 0.45 | - | 文献[1]表2 |
| 燃气轮机 | 热效率 | 0.35 | - | 文献[1]表2 |
| 余热锅炉 | 效率 | 0.85 | - | 文献[2]图5 |
| 电储能 | 容量 | 2 | MWh | 实测数据 |
| 热储能 | 容量 | 1.5 | MWh | 实测数据 |
matlab复制params.outputflag = 1; % 显示求解过程
params.mipgap = 0.005; % 允许0.5%的优化间隙
params.timelimit = 3600; % 最大计算时间1小时
params.presolve = 2; % 激进预处理
这些参数设置经过了大量测试验证:
使用stackedplot函数绘制各设备出力情况:
matlab复制stackedplot(timetable, {'Pgrid_buy','Pgen','Pess'}, 'Title','电力系统调度结果');
这种堆叠图可以直观显示:
能源价格波动对系统经济性影响很大,我们测试了天然气价格±20%变化的影响:
| 情景 | 总成本变化 | 购电比例变化 | 自发电比例变化 |
|---|---|---|---|
| 气价+20% | +15.7% | +8.2% | -8.2% |
| 气价-20% | -12.3% | -6.5% | +6.5% |
结果表明系统对气价变化相当敏感,在实际运营中需要建立价格预测机制。
模型不可行:
求解时间过长:
结果不符合预期:
模型简化:
求解加速:
代码优化:
这套基础模型还可以向多个方向扩展:
考虑不确定性:
多时间尺度协调:
市场机制设计:
在实际项目中,我们通常会先用这个确定性模型作为基础,然后根据具体需求逐步添加上述高级功能。每次扩展都要注意评估对计算复杂度的影响,确保模型仍然可解。