首页 / 资讯中心 / 文章详情

压缩空气储能与热网热惯性联合优化调度:热电联产系统建模与求解

压缩空气储能与热网热惯性联合优化调度:热电联产系统建模与求解 ★ FEATURED ARTICLE
前几年做模拟项目X时我遇到一个很典型的调度困境系统里有一台热电联产机组和一片集中供热管网冬季夜间电负荷低、热负荷却很高机组被“以热定电”的约束绑得死死的电力调峰完全腾不出手只能眼睁睁看着风电场被迫弃风。当时组里引入先进绝热压缩空气储能AA-CAES做扩容改造原以为把储能当成“大号电池”接入电网就行结果一跑调度就发现真正让收益卡脖子的根本不是电量平衡而是供热网络的热惯性。热量在管道里走得慢、会降温、能短暂蓄存这些特性如果不放进优化模型储能和热电机组永远只能各干各的联合调度就是一句空话。这篇文章我把完整设计和代码实现拆开讲包括热网动态建模、AA-CAES和热电联产的数学约束、求解器落地、算例对比和调试经验给正在做综合能源系统优化调度的同学一份可以直接复现的参考。1. 为什么要把压缩空气储能和热网热惯性放在同一个优化模型里1.1 热电联产的“电热耦合”是怎么卡住调峰的热电联产机组的核心特征是同时出力汽轮机在发电的同时抽汽或排汽给热网提供热量。抽凝式机组的热电关系在一个可行域内变化热出力拉高时机组电出力下限也被一起抬高。冬季夜间恰恰是热负荷高峰、电负荷低谷风电大发时CHP为了满足供热必须发出大量电电网消纳不掉产生弃风。所有做过电力调度的人都熟悉这种“想降电却降不下来”的憋屈感。大多数传统做法是给CHP配蓄热罐用蓄热罐在热负荷高峰“接一下”让机组白天少供一点热、晚高峰多供一点热从而腾出电调峰空间。蓄热罐本质上是个热量的时间搬运工。但蓄热罐有容量限制而且它是“显式”的储能设备要花钱、占场地。真正容易被忽略的是区域供热管网本身——管道里的热水量巨大流速不高热量从热源到用户要花几十分钟甚至几个小时。这段延迟加上建筑物本身的蓄热能力构成了热惯性它相当于一张分布在整个管网里的隐形容热网比集中式蓄热罐的容量大得多。一旦把热惯性考虑进调度热源侧和用户侧之间就不是简单的“瞬时供热等于瞬时用热”而是允许供热功率在一段时间内偏离用户散热功率用管网和建筑的蓄热能力去填补这个缺口。这正是解除“以热定电”锁链的关键抓手。1.2 AA-CAES在系统里的双重身份电储能加隐藏热源先进绝热压缩空气储能与传统压缩空气储能最大的区别在于它把压缩过程中产生的压缩热存下来而不是丢弃掉。充电时压缩机消耗电能压缩空气空气进入储气室前先经过蓄热换热器把热量存在蓄热介质里放电时储气室的高压空气先被这个蓄热介质重新加热再进入膨胀机做功发电。整个过程不需要补燃天然气因此AA-CAES同时具备储电和储热两条能量链路循环效率一般在60%到70%之间。在热电联产系统里这个双重性非常值钱。充电时压缩机耗电是在帮助电网消纳风电压缩热如果直接供给热网或存入蓄热罐又是在帮助热网补热。放电时膨胀机发的是电但从蓄热介质取走的热量如果不补回来下一次放电功率就会受影响。这意味着AA-CAES的调度不能只看“什么时候充电、什么时候放电”还要看储气室压力和蓄热罐热量两个状态变量如何联动。很多人在建模时只写储气室能量平衡漏了蓄热罐的热量平衡结果算出来的出力和实际物理过程完全对不上。1.3 热网热惯性放着没用的“免费储能”只在模型里挖得出来热惯性的物理来源有两个一是热网管道的传输延迟和散热二是建筑围护结构的蓄热能力。热水管道里的水是“货车”热量是“货物”货车从热源跑到用户需要时间而且跑的途中会向周围土壤散热。用户侧的房间本身是个大热容短时间内供热量减少室温不会立刻掉下来这就是建筑热惯性。用生活类比来说把热网想成整栋楼的“暖气水库存”。晚上锅炉房多烧一点水送进管网第二天上午即使锅炉少烧一小时室内温度依然能维持住。这种能力就是时间维度上的柔性。问题在于热量在网络里的流动是有损耗、有混合、有延迟的数学上很难写进优化模型所以很多研究的简化做法是直接令“热源供热等于用户热负荷”把网络当成一根无质量、无延迟的理想管道。这样就白白丢掉了最大的调节资源。把AA-CAES和热网热惯性放在同一个模型里本质上是在做两件事用储能把电量在时间轴上搬移用热惯性把热量在时间轴上搬移而AA-CAES的充放电过程又天然把电和热两个时间轴耦合起来。这种多维度的耦合只有在统一的优化模型里才能算出全局最优解分开按“电系统”和“热系统”各自调度永远差一口气。2. 热惯性怎么变成一行行能求解的约束2.1 三种建模思路集总参数、延迟模型、节点法到底选谁供热网络动态建模常见的方案有三种。第一种是集总参数法把整个管网和用户简化为一个或几个等效热容室温动态用一阶惯性环节表达。优点是变量少、求解快缺点是没法反映管道延迟适合做全年长周期分析。第二种是传输延迟模型明确建立“管道入口温度经过一段时间后出现在出口”的关系保留延迟这个核心特征损失和混合则做大幅简化。第三种是节点法按管段将供水和回水网络做空间离散用有限差分把一维的对流换热方程转换成时序递推式。节点法最接近物理过程但变量数量会随网络规模膨胀。我的建议很直接做日前优化调度优先采用传输延迟模型的思路在节点层面建立温度等式但对温度损失做线性近似。因为调度关心的核心是时间错位延迟才是影响成本最大的因素。节点法虽然精确但动辄上万变量的网络模型塞进MILP求解器调试成本会迅速失控。如果只是做学术对比或者原型验证先用小网络把传输延迟跑通后面再逐步增补温降方程。2.2 管道延迟和温降的离散化处理管道入口温度传到出口物理上满足一个带延迟项的表达式。若保持热网流量恒定那么水流经过管段的传播时间为τ L / v其中L是管长v是流速。离散化后延迟步长取k round(τ / Δt)Δt是调度时段长。第t个时段管段出口温度可以表达为T_out(t) T_amb (T_in(t-k) - T_amb) × φφ是温降系数近似取exp(-K·L / (m_dot·cp))K是综合传热系数m_dot是质量流量cp是比热容。这个式子非常友好只要流量和管道参数给定φ就是常数k也是常数整条约束就是纯线性的。很多人会问流量明明会随负荷变化怎么能固定工程实践中的处理办法是把热网调度分成两步先按典型工况确定各管段流量分配比例温度约束用固定流量下的延迟矩阵机组出力算出来之后再校验这个流量假设是否合理差别大就迭代一轮。在二次网和一次网解耦的常规设计中一次网流量本来就经常采用质调节也就是供水温度变化而流量基本不变固定流量假设的适用范围比想象中大。2.3 节点混温的双线性难题与初版简化热网拓扑中必然存在供水管道的汇合节点比如两条不同温度的水在某个三通处汇合后进入同一段管道。混合节点的能量守恒可以写成T_mix (Σ m_dot_i · T_i) / (Σ m_dot_i)如果各支路流量m_dot_i固定这就是线性等式。如果流量也作为决策变量就会出现温度乘以流量的双线性项模型从线性优化变成非凸非线性规划求解难度和稳定性都会断崖式下跌。对做优化调度的人来说这是最常见的“模型膨胀点”。初版方案不要硬碰双线性项。先把各支路流量的分配比例固定下来等于只优化温度曲线上各节点的时序这样整条网络约束都是线性等式。等模型能稳定收敛、调度逻辑验证通过后再考虑流量可调用分段线性近似或者迭代求解。我在模拟项目X里正是这样处理的第一阶段固定流量比优化结果成本已经比忽略热惯性的方案低不少第二阶段再用迭代法微调流量收益增量很小但求解时间翻了数倍性价比很低。3. 优化调度模型的完整数学骨架3.1 目标函数购电、售电、燃气与弃风惩罚怎么打架日前优化调度的目标函数是系统总运行成本最小化暂不考虑启停成本和机组寿命损耗时可以写成min Σ_t [ c_buy(t)·P_buy(t) - c_sell(t)·P_sell(t) c_gas·F_gas(t) c_curtail·P_curtail(t) ]其中P_buy是电网购电功率P_sell是售电功率。很多情况下同一联络线不可能同时购售电要加一条互斥约束。c_gas是单位燃气价格F_gas是CHP燃气消耗量。弃风惩罚c_curtail不一定是真实罚款更常见的是给它一个大值来体现“能不弃就不弃”的调度偏好。目标函数的取舍直接影响优化结果如果弃风惩罚设得太低求解器会拿风电当可自由削减的变量掩盖真实问题如果设得太高又可能让储能过度充放以致损耗成本超过弃风节省。我的经验是先把弃风率作为后处理统计指标目标函数里只写现金成本和固定惩罚值然后用敏感性分析看弃风惩罚变化对总成本的影响再回头定这个系数。3.2 决策变量清单哪些连续哪些必须上整数写代码之前先列变量清单是效率最高的做法。系统级模型需要以下几类决策变量类型变量单位说明CHP电出力P_chp、热出力H_chpMW受热电可行域约束AA-CAES压缩机功率P_c、膨胀机功率P_dMW充放电不能同时发生AA-CAES储气室能量E_air、蓄热罐热量E_heatMWh状态变量需写递推式热网节点供水温度T_s(n,t)、回水温度T_r(n,t)℃延迟与混温约束电网购电功率P_buy、售电功率P_sellMW互斥风电弃风功率P_curtailMW等于预测功率减消纳功率整数充放电状态u_c、u_d0/1避免同时充放这里面最难处理的是温度变量。温度本身不是功率量级通常在几十到一百之间而功率变量动辄几百平衡等式里二者通过流量和比热容相乘建立联系数值尺度差很大求解器容易触发数值警告。所以在建模时要提前把温度坐标做平移比如统一减去基准环境温度让温度变量落在0到50的相对范围内数值稳定性会好很多。3.3 AA-CAES的储气与蓄热状态约束AA-CAES的两个核心状态方程是E_air(t1) E_air(t) η_c · P_c(t) · Δt - P_d(t) · Δt / η_d - E_loss(t)E_heat(t1) E_heat(t) α_rec · P_c(t) · Δt - P_d(t) · Δt / H_HR - H_ext(t) · ΔtE_loss是储气室泄漏和散热损失一般按存储量的一个小比例近似。α_rec是压缩热回收率通常在0.7到0.9之间。H_HR表示每兆瓦电出力需要从蓄热介质取走的热功率反映空气在膨胀前需要的加热量H_ext是AA-CAES向外直供热网的热功率在热电联产场景里这是跟CHP强耦合的关键变量千万不能漏。我见过很多代码把蓄热罐热量写成和E_air共用同一个SOC上限实际上是错的。蓄热介质的热容量由储热材料和罐体尺寸决定跟储气室压力上限没有直接关系。正确做法是把E_air和E_heat分别设上下限并在充放电功率约束里增加“当前蓄热热量能否支撑放电所需加热”的逻辑约束防止优化器把放电视为无代价的电能输出。3.4 CHP可行域与热网动态耦合约束的合并方式抽凝式CHP的电热可行域是一个凸多边形常见约束可以表达为P_chp_min - k1 · H_chp ≤ P_chp ≤ P_chp_max - k2 · H_chp其中k1、k2是抽汽系数取值决定热出力对电出力上下限的影响程度。这个线性多边形约束写起来不难麻烦的是把它跟热网动态约束放到一起时会出现“源供热量不等于用户耗热量”的疑问。加入热惯性后热源供热与用户散热之间要保持的是带有蓄热差分项的等式例如用供水管道的总热容量C_net近似表达热网蓄热状态变化Σ_h H_source(h,t) H_demand(t) C_net · [T_s_avg(t) - T_s_avg(t-1)] / Δt H_loss(t)这个式子左边是CHP和AA-CAES供出的总热量右边是用户负荷、管网蓄热变化量和散热损失。C_net是热网等效热容T_s_avg是所有节点供水温度的加权平均值。它没有试图精确追踪每个房间的室温但把热惯性最核心的“热量可以暂存在管网里”这个能力表达出来了而且完全是线性约束。要把建筑物蓄热也加进来只需在H_demand(t)前面加一个建筑等效热容项形式一样。4. 代码落地从拓扑数据到求解器出结果的全流程4.1 数据结构与参数准备先别急着写优化代码把数据结构和测试用例准备好能省一半调试时间。我习惯用以下目录组织data/topology.json节点、管道、热源、用户的连接关系data/loads.csv用户热负荷、电负荷曲线data/electricity_price.csv日前分时电价data/params.jsonAA-CAES效率、容量、热网管长管径等参数src/model.py建模与求解脚本results/输出出力曲线与成本统计拓扑文件是最容易被忽视的环节。我建议用节点编号列表加边列表的方式存每个管道字段写明长度、直径、传热系数、起始节点和终止节点。提前写一个函数计算每个管段的传输延迟步长和温降系数因为这两个值在建模时会被反复引用。用一个csv存延迟索引矩阵shape是[管段数, 时段数]第(i,t)个元素表示第i段管道在t时刻接收到的入口温度对应的原始时段序号。模拟项目X的测试算例用了六节点五管段的简化网络节点1和2是热源节点节点3到6是热用户管道长度从300米到1200米不等供水温度设计值约90℃回水温度约50℃。这个规模足够验证建模逻辑又不会在调试初期引入过多的求解负担。4.2 建模核心代码片段与延迟索引技巧在Python里用主流商业MILP求解器建模时核心代码结构类似下面这段。我只给出骨架具体参数根据场景填入。import numpy as np from some_milp_solver import Model # 基础维度 T 24 # 日前调度24个时段 dt 1.0 # 时段长度小时 nodes [0, 1, 2, 3, 4, 5] pipes [...] # 每条管道: (起点, 终点, delay_steps, drop_coeff) # 决策变量 p_chp {} h_chp {} for t in range(T): p_chp[t] model.add_var(lb0, ubP_CHP_MAX, namefp_chp_{t}) h_chp[t] model.add_var(lb0, ubH_CHP_MAX, namefh_chp_{t}) p_ch model.add_vars(T, lb0, ubP_CH_MAX, namep_ch) p_dc model.add_vars(T, lb0, ubP_DC_MAX, namep_dc) e_air model.add_vars(T, lbE_AIR_MIN, ubE_AIR_MAX, namee_air) e_heat model.add_vars(T, lbE_HEAT_MIN, ubE_HEAT_MAX, namee_heat) # 热源节点供水温度 temp_s {} for n in nodes: for t in range(T): temp_s[n, t] model.add_var(lbT_AMB, ubT_SUP_MAX, namefTs_{n}_{t})延迟索引是这段代码最容易出错的地方。假设管道i的延迟步长为k则# 延迟: 出口温度 入口温度在t-k时刻的值按温降系数衰减 for pipe in pipes: i, j, k, phi pipe for t in range(T): if t - k 0: src_t t - k model.add_constr( temp_s[j, t] - T_AMB phi * (temp_s[i, src_t] - T_AMB) ) else: # 调度周期开始前管道内已有热水取初始稳态温度 model.add_constr( temp_s[j, t] - T_AMB phi * (T_INIT - T_AMB) )这里的坑在于如果t-k小于0不能直接忽略约束因为优化器会把出口温度当成自由变量从而“免费”获得热量。正确做法是用调度开始时的初始温度填充这一段。初始温度从上一个调度周期的末端状态读取工程上叫“跨日衔接”我的建议是把模型滚动起来每周跑一次168小时的调度而不是每天孤立地跑24小时。4.3 模型不可行时的排查顺序联立约束越多越容易在某个角落出现不可行。求解器返回Infeasible时我的排查顺序非常固定。先看能量平衡约束。用外挂脚本把所有节点的供给量求和、需求量求和检查是否至少满足“总供给大于总需求”的基本条件。很多时候不可行是因为测试数据里热负荷总和高于所有热源上限总和这时该调参数而不是调代码。再看互斥和启停约束。充放电状态用二进制变量互斥时要注意状态与功率的耦合u_c1时P_c可以取正但P_c的上限也要跟u_c相乘。如果忘了给功率上限乘状态变量求解器可能让u_c0但P_c0模型直接数理矛盾。接着看温度约束。热网节点温度下限常常被忽略。供热量减小到一定程度时为了保证用户侧供水温度不低于设计值温度约束会比功率约束更紧模型表现为“虽然电量平衡没问题但整体不可行”。解决办法是检查每个热源节点的最低出口温度约束是否和供热量的下限匹配。最后才查数值问题比如某个参数量纲写错导致约束系数差出1e6倍。量纲问题是新手最容易踩的坑我单独专门说。4.4 量纲与数值尺度问题能源系统模型里功率、能量、温度、流量的单位经常混用。统一的规范是功率用MW能量用MWh温度用℃质量流量用kg/s比热容用kJ/(kg·K)。特别注意用MW乘以小时得到MWh而如果直接用kW就会让约束系数差1000倍。温降系数φ一般是个0.7到1.0之间的小数而购电电价可能只有几百元/MWh。目标函数里的成本系数和约束系数之间差异很大在求解器里容易触发“大数吃小数”的数值警告。解决方法是把目标函数统一改成万元或者千元为单位并且把温度变量做平移让所有变量尽量都落在0.1到1000这个区间。求解器的参数设置也有讲究。MIP gap设成1%到3%就够了没必要追求精确最优。时间限制建议先设120秒跑通逻辑再放开到600秒做最终结果。数值容差保持默认不要为了通过可行性检查而去调大容差否则最后得到的“最优解”在物理上可能根本站不住脚。5. 算例验证热惯性到底省了多少成本5.1 三套对比方案的设计思路为了单独把热惯性的价值量化出来我设计了三个方案方案ACHP独立运行热网按瞬时平衡处理也就是供热功率严格等于用户热负荷不加AA-CAES。方案B在方案A基础上接入AA-CAES但热网仍然按瞬时平衡热惯性不建模。方案C完整模型AA-CAES加区域供热网络热惯性全部进入约束。三个方案共用同一套六节点热网、同一台CHP、同一个AA-CAES参数、同一份风电预测和分时电价。热负荷曲线取冬季典型日晚高峰热负荷高风电出力在凌晨高、白天低峰谷电价差按3:1设置。AA-CAES参数设定为压缩机额定功率100MW膨胀机额定功率80MW储气室容量400MWh蓄热罐容量200MWh压缩热回收率0.8。5.2 结果解读调度曲线与成本对比运行结果非常有代表性。方案A中CHP夜间为满足单位数MW的尖峰热负荷电出力下限被抬得很高再加上风电场出力夜间电网外送容量不够弃风率超过25%。方案B加入AA-CAES后夜间多余风电被压缩机吸收弃风率降到8%左右但CHP依然因为热负荷刚性约束白天低电价时段电出力不能降到理想水平导致大量低价值电能被储气室或电网吞掉。方案C的结果最有趣由于热网允许在夜间多蓄热、白天少供热CHP白天可以把热出力降下来电出力下限随之松动腾出的空间让系统在午间低电价时段多向电网购电给AA-CAES充电在晚高峰放电。三个方案的日运行总成本对比如下方案运行成本万元/日弃风率%说明A24.826.3无储能电热强耦合B19.68.4有储能但热网瞬态被忽略C16.22.1储能与热惯性联合利用方案C比方案B成本再降17.3%这笔收益几乎全部来自热网热惯性带来的“热负荷时间搬移”。换句话说不建模热惯性储能只发挥了电量搬移的作用建模之后储能连热量的搬移也一起做了系统调节资源的盘活程度完全不同。5.3 敏感性分析延迟时间和用户热容量对收益的影响热惯性建模里有两个参数最敏感管道传输延迟步长和建筑等效热容。把管道长度统一乘以0.5到2倍运行成本变化如下延迟时间越接近调度时段长收益提升越明显但当延迟超过3小时之后收益增速放缓因为管网散热损失增大多蓄的热量开始“漏”掉建筑热容增大时可允许的供热功率下降幅度变大收益同样上升但超过某个阈值后受限于供水温度下限继续增加热容不再产生收益。这个结果说明热惯性资源有边界不是越大越好。调度模型的价值正在于把这些资源的边界暴露出来告诉运行人员到底能压多少热出力、能压几个小时而不是凭经验毛估。6. 调试中踩过的坑与可复用的经验6.1 混温双线性项优先固定流量比第一次把热网约束写进模型时我试图让每个节点的流量作为决策变量结果模型规模爆炸求解时间从一个量级跳到另一个量级。后来老老实实先做固定流量比模型变成纯线性规划任何一台标准的MILP求解器都能在几秒内解完。这个教训是初版模型绝对不要贪求物理完备先跑通一个可解释、可验证的简化版本再考虑扩展。如果后续一定要考虑流量调节我的经验是用迭代式求解第一轮固定流量得到温度分布第二轮根据温度和负荷重新计算各支路流量分配更新延迟矩阵再求解一次。重复两三轮后结果趋于稳定。这个方法虽然没有严格的收敛保证但在工程场景下比直接求解非凸问题实用得多。6.2 指数衰减项别让它非线性管道温降的指数表达在数学上是微妙的陷阱。如果直接把exp(-K·L/(m_dot·cp))放进约束而m_dot是变量模型就变成非线性。我踩过一次求解器跑了半小时结果还是崩溃的。后来把所有管道的温降系数全部预计算成常数只在流量变化幅度超过20%的时候重新计算一次并更新参数问题立刻消失。温降系数对成本的影响很钝完全值得用常数近似。6.3 求解器数值问题大M、容差与MIP gap充放电互斥约束要引入大M常数很多初学者为了保险把M设成1e9结果模型出现严重的数值病态。原则是M越小越好只要比该变量的最大可能值大一点就行。比如充电功率上限100MWM取120就够了不要养成写1e6的习惯。设置MIP gap为1%之后最终成本比硬算到0.01%精度只高一点点但求解时间省掉一大半。6.4 少谈精细、多谈鲁棒实际工程数据的处理办法现实项目里未必有完整的管道保温参数和建筑热容数据。我的处理办法是热网等效热容不用管道逐段累加而是用实际运行数据反推——取几天供回水温度和热负荷的时序数据用差分方程拟合出C_net的值误差完全可以接受。建筑蓄热系数则按建筑类型取值办公建筑热容小、住宅热容大这是合理的工程近似。做优化调度的人要明白一件事模型的价值不在于绝对精确预测每一分钟室温而在于把“可转移的热量”量化出来给调度员一个安全边界。边界内的操作是允许的边界外的操作需要实时校验。用这样的思路去建模既能享受热惯性带来的收益又不会因为模型过度乐观导致实际运行中出现室温失守的问题。这也是我在模拟项目X里最终采用简化热惯性模型而不是上完整计算流体力学模型的原因。这类模型后续还能延伸很多方向比如把建筑用户侧需求响应加进来、把AA-CAES的联合循环运行特性细化、或者处理多热源多储能的联合调度。核心思路是一致的先把物理过程简化成能求解的线性或混合整数线性约束再逐步逼近真实系统。每次加一个约束都用对比算例去验证它是否真的带来了成本或灵活性收益而不是为了“模型显得高级”而堆砌细节。工程上的好模型永远是简洁、可调试、经得起对比验证的模型。
阅读完成 · 觉得有帮助?
咨询建站