综合能源系统优化调度:AA-CAES与供热热惯性的协同建模解析

发布时间:2026/9/8 5:36:59
综合能源系统优化调度:AA-CAES与供热热惯性的协同建模解析 写在前面如果你最近在搞综合能源系统、储能或者供热经济调度方向的毕业设计大概率会搜到“AA-CAES”和“热电联产”这两个词的组合。确实先进绝热压缩空气储能AA-CAES和热电联产CHP机组放在一起做优化调度是当前电气工程和热能工程交叉方向里比较有搞头的一个选题。这个模型不算特别难但代码实现时坑不少尤其是“区域供热网络热惯性”这一段处理不好模型求解直接不收敛。这篇文章我会把我实际调试这个调度模型时的完整思路、建模取舍、代码框架和踩坑经历都整理出来给打算复现或者做相似课题的同学一份可以直接下手的参考。先说清楚这个项目到底在做什么在一个包含风电、CHP热电厂、AA-CAES储能站和区域供热系统的园区级能源系统里考虑供热管网的蓄热特性和建筑物热惯性从而建立一个优化调度模型让系统在满足电、热负荷的同时运行成本最低。说白了就是要想办法把“电跟着热走”这个热电联产的老毛病通过储能和管网蓄热给治一治。这篇内容最适合三类人一是电气工程、热能工程方向做毕业设计或课题研究的研究生二是在做综合能源服务、园区智慧能源管理的工程师三是准备从事电力市场或虚拟电厂方向、想快速上手优化调度建模的初学者。阅读过程中你可以跟着操作不需要太强的数学背景但最好用过Python并对线性规划的基本概念有个大致印象。1. 内容整体设计与思路拆解1.1 这个模型到底解决了什么痛点北方冬季供热期最大问题还不是电负荷高而是热负荷太高。传统的抽凝式热电联产机组有一个硬约束只要机组在供热它的电出力就有一个由热出力决定的下限行业内叫“以热定电”。夜间风电大发的时候系统本来想把风电全消纳掉但热网还有一大坨热负荷压着CHP机组降不下去电出力风电场只能弃风或者让储能充电。传统电储能锂电池只能吸收电量对供热侧完全帮不上忙。AA-CAES不一样。先进绝热压缩空气储能在充电时多余的电能驱动压缩机压缩热被储热系统收集放电时压缩空气加热后进入膨胀机发电。更关键的是部分热还可以用于供热。这样一来它既能吃电也能产热天然适合和CHP搭配。不过AA-CAES和锂电池一样本质上还是“储电调峰”的角色。真正能让CHP在夜间把出力压低、还能保证用户暖气不冷的靠的是供热网络的热惯性。热惯性是什么意思你晚上想把家里暖气调低一点房间不会立刻冷下来管道里的热水和楼体的混凝土都还在持续散热这个“降温缓冲过程”就是热惯性。在调度上这意味着热负荷不是一个瞬时平衡的死约束允许提前蓄热或延迟供热只要用户室温在舒适区间内波动即可。把热惯性纳入调度模型就相当于给系统多了一个“看不见的储能”热网本身能存热灵活性一下就出来了。1.2 为什么把AA-CAES和热惯性放在一个模型里单独调度AA-CAES很成熟单独做热网蓄热优化也有很多论文。但这个项目有意思的地方在于把AA-CAES的电力调节能力和热网蓄热能力放在同一个时间窗内协同。举个例子电价低谷期让AA-CAES压缩机满负荷吃电同时让CHP缓慢降低热出力热水管网和用户建筑靠前期蓄热维持温度等到电价高峰期AA-CAES膨胀机放电压减CHP电出力CHP再加大热出力把管网蓄热补回来。整个过程电网侧峰谷套利热网侧利用蓄热填谷两边都受益这才是集成调度的意义。从这个角度来看模型的本质是一个“以小时为尺度的暖通电力联合调度”把电功率、热功率、储能SOC、热网管道温度、用户室温全部映射到同一组时间离散化的决策变量上在满足物理约束的前提下求运行成本的最小值。1.3 我选择的技术路线和建模目标我的目标是构建一个可以在普通笔记本电脑上跑动的优化模型所以没有盲目追求高精度。整个模型框架如下时间尺度24小时优化窗口1小时间隔。需要说明的是热管网的时间常数通常只有几十分钟到两三小时1小时的粒度基本能反映热惯性的跨时段转移能力。系统构成CHP机组、AA-CAES储能站、风电场、常规电热锅炉备用、区域供热一级管网、用户换热站。调度目标最小化系统总运行成本包含CHP煤耗、购电费用、弃风惩罚、储能运维成本。数学模型混合整数线性规划MILP求解器用Gurobi或CBC均可。选择MILP而不是非线性规划核心原因有三个一是热网动态方程通过合理假设可以线性化二是MILP有全局最优解保障论文审稿人基本都认可三是我个人经验里非线性模型在工程上的可解释性和调试友好度都差很多。2. 核心细节解析与实操要点2.1 AA-CAES的数学模型构建AA-CAES的设备结构可以简化为四个部分压缩机链、储气室、储热系统、膨胀机链。建模时不需要关心内部热力过程细节只需要刻画外部电热特性和内部能量状态。我用的是以下简化的能量平衡模型充电过程充电功率乘以充电效率得到储气室注入功率同时压缩热带入储热系统。这里有一个容易被忽略的点AA-CAES充电时产生的压缩热并不是稳定的储热系统的温度状态会随运行工况波动。为了模型可解我假设储热系统温度和储气室压力始终在允许范围内不做满变量建模只约束储热系统的SOC上下限。放电过程储气室释放空气经过储热系统加热后进入膨胀机。这个过程中如果储热系统SOC偏低会导致膨胀机入口温度不足、发电效率下降所以在约束里我强制要求放电只能在储热SOC高于某一阈值时进行。储能站的核心约束是充电功率上下限和充电状态约束放电功率上下限和放电状态约束充电和放电不能同时进行的逻辑约束储气室SOC的状态转移方程储热系统SOC的状态转移方程日始末储能状态一致性约束我把储能SOC定义为连续变量充/放电状态定义为0-1整数变量。这里有个关键技巧为了避免“充电功率极小但不为零”这种求解器给出的工程上无意义的解我给连续功率变量加了“要么为0、要么大于最小技术出力”的特殊约束也就是很多论文里说的big-M约束。这个在工程调度里是必要的否则优化结果会出现充电功率0.003MW这种荒唐数值。2.2 热电联产机组的电热耦合特性热电联产机组建模是整个模型最核心的一环。抽凝式机组的特点是热出力和电出力存在一个可行区域通常用线性不等式组描述。工程上常见的简化是把可行域近似成一个凸多边形每个顶点对应一个工况点。我的模型用了四个顶点逼近最大凝汽工况点热出力低电出力低最大抽汽工况点热出力高电出力高最小凝汽工况点热出力低电出力高这个看似反直觉实际上抽凝机在完全停抽时如果有电需求可以加大进汽量电出力反而可能更高最小抽汽工况点热出力高电出力受锅炉最小稳燃限制这四条边界围成的区域就是机组的实际运行可行域。建模时用凸组合表达机组工况引入权重变量并让电出力、热出力分别等于各顶点对应值的加权和。这样处理后整个电热耦合关系变成线性约束求解器处理起来毫无压力。CHP的煤耗函数我在初始版本用了二次函数但MILP模型没法直接处理二次项。最后的处理方案是分段线性化按电出力区间切成5段每段用直线逼近煤耗曲线误差控制在1%以内。对调度结果的影响非常小但求解速度提升明显。2.3 区域供热网络热惯性的建模细节这一部分是整个模型最容易出问题的地方我花的时间也最多。热惯性主要来自两个部分一级供热管网的蓄热量和用户建筑物的蓄热量。管网的传热模型如果完全按照偏微分方程来建优化调度模型根本没法求解。我采用的简化方案是“节点法时间延迟”的组合思路热网中的管道被简化为一系列管段热水从管段入口流向出口需要一定时间这个时间由管长和流速决定。管段入口温度和出口温度的关系用一个温度动态方程描述管段的出口温度等于上一时刻入口温度经过时间延迟后的衰减值衰减程度由管道散热损失系数决定。如果把每个时刻的管道出口温度都设为独立变量约束数量会爆炸。实际上我采用的是“入口温度状态数组”的方法不设出口温度变量而是维护一个包含历史时间段入口温度的数组出口温度直接按延迟时间抽取对应历史值再乘以散热损失系统。这个技巧让管网约束从二次复杂度降为线性复杂度求解规模大幅缩减。建筑物热惯性的建模相对成熟我用的是等效热参数模型ETP模型的一阶形式室温的下一时刻值等于当前室温与室外温度、供热功率之间的线性组合本质上是一个一阶惯性环节。这个模型被大量建筑节能文献验证过精度足够用于小时级调度。需要注意的是为了保持模型线性我假设热水质量流量恒定只调节供回水温度也就是“质调节”运行方式。这是工程上的常用简化。如果你在论文里采用“量调节”模型管道质量和流量耦合会引入双线性项求解器速度会大幅下降除非使用McCormick松弛等手段否则不建议在入门阶段尝试。2.4 模型范式选型为什么坚持用MILP之前也试过把整个问题扔给遗传算法这类元启发式算法求解结果是能耗没问题但每次运行结果都不一样而且无法证明最优性。在学术研究中这种“黑箱解”很难让人信服。改用MILP后Gurobi可以给出最优性间隙MIP gap论文里把这个指标放上去审稿人基本不会再质疑你结果的合理性。MILP还有一个好处约束可以随时增减灵活性极强。比如想加个“机组爬坡速率限制”只需要在约束列表里加一行代码想加个“储热系统最低温度限制”也是一行代码的事。对代码后续扩展和维护非常友好。3. 优化调度模型的构建与代码实现3.1 目标函数的成本构成目标函数设计为最小化总运行成本我考虑了四项CHP机组燃料成本由分段线性函数给出是成本的主要部分购电成本当系统内部发电不足时从上级电网购电按分时电价计算弃风惩罚成本为了鼓励消纳风电对未使用的风电功率设置惩罚系数储能与热网运行维护成本按充放电量和供热量线性折算购电成本和弃风惩罚这两个参数对调度结果影响很大。我在实际调试中发现如果弃风惩罚系数设得太低模型会主动弃风来避免调节机组太高则会导致机组频繁调峰。建议先跑一版不加弃风惩罚的模型统计自然弃风量再根据这个量级设置惩罚系数数值大约在风电上网电价的1.5到2倍之间比较合理。3.2 约束条件全梳理约束条件大概可以分为五组我列一个表方便对照检查建模时漏了哪一条直接用这个表回头查约束类别具体内容备注电功率平衡各电源出力之和等于电负荷与外送功率之和必须等式约束热功率平衡CHP供热、AA-CAES供热、电锅炉供热等于热网需热量考虑管网热损失系数CHP运行约束电热可行域凸组合、爬坡约束、最小启停时间约束分段线性煤耗函数AA-CAES运行约束充放电功率上下限、SOC转移、储热SOC、状态互斥整数变量控制启停热网动态约束管道时间延迟、供水温度范围、回水温度范围、用户室温舒适区间室温区间是热惯性效果的出口电功率平衡约束在代码里必须写成等式否则求解器会有“强行丢弃功率”这类不合理的自由度。热功率平衡因为考虑了管网蓄热是一个可以带松弛的动态等式但松弛变量一定要加惩罚系数否则热平衡就是一句空话。室温舒适区间我取的是18到24摄氏度这个区间越宽松系统灵活性越大运行成本越低。3.3 整体代码框架结构我的代码完全基于Python 3.10编写优化建模用Pyomo 6.x求解器优先调Gurobi没有Gurobi license的话用CBC也可以跑通但求解速度会慢不少。整个代码结构分成五个文件data_loader.py读入电负荷、热负荷、风电预测、分时电价、机组参数、热网参数chp_model.py定义CHP机组可行域变量和约束aacaes_model.py定义储能变量和约束heat_network.py定义供热管网和建筑热惯性相关的动态约束main_optimization.py组装模型、求解、结果后处理这样拆分的好处是调试方便。热网或者储能出了问题时只需单独跑对应模块的约束验证代码不需要把整个模型拖起来节省大量时间。实际调试时我强烈建议你分开先验证每个子模块的可行性再组装到一起否则一旦求解器提示不收敛排查范围会非常大因为你根本不确定是哪个模块的问题。3.4 核心代码片段解析下面这段是热网时间延迟约束的核心代码也是整个模型最精华的部分。它实现了管道出口温度对入口温度的延迟采样功能import pyomo.environ as pyo def add_heat_network_delay_constraints(model, pipe): 为热网管道添加时间延迟约束 pipe: 管道对象包含 pipe.length, pipe.velocity, pipe.loss_coef, pipe.delay_steps for t in model.T: delay_idx t - pipe.delay_steps if delay_idx 0: # 管道出口温度等于历史入口温度乘以散热损失系数 model.pipe_out_temp[t, pipe.name] ( model.pipe_in_temp[delay_idx, pipe.name] * pipe.loss_coef ) else: # 启动时段假设入口温度等于初始设计温度 model.pipe_out_temp[t, pipe.name] pipe.init_temp这里的关键变量是delay_steps它由管道长度和热水流速共同决定计算方法是延迟时间等于管长除以流速然后除以时间步长并取整。我自己实际跑的例子中一根3公里长、流速1.2米每秒的管道延迟时间约为42分钟对应1个调度时段延迟效果刚好能跨时段体现。再展示一下AA-CAES储热SOC的约束代码这里想突出的是“辅助变量初始化”的重要性def add_aacaes_storage_constraints(model): for t in model.T: if t 0: model.heat_soc[t] model.heat_soc_initial else: model.heat_soc[t] ( model.heat_soc[t-1] model.charge_heat_in[t-1] * model.heat_charge_eff - model.discharge_heat_out[t-1] / model.heat_discharge_eff ) # 储热SOC上下限 model.heat_soc[t] model.heat_soc_min model.heat_soc[t] model.heat_soc_maxPyomo里如果连续两个时段引用变量下标为t-1在t0时会出现索引溢出所以代码风格上要习惯在循环里加边界判断或者给时间集合设置一个虚拟起点。4. 算例设置与调度结果分析4.1 典型日数据准备我以一个我国北方某工业园区为背景构造了一个典型冬季场景。电负荷峰值152兆瓦出现在傍晚18时热负荷峰值198兆瓦出现在清晨6时风电出力在夜间23时到来日凌晨4时处于高位。系统内包含一台60兆瓦抽凝式CHP机组一台30兆瓦的AA-CAES储能站储气室容量对应满功率放电4小时一个带有8根主要管道的区域供热网络总管道长度约25公里。分时电价采用峰谷三段式峰段1.0元/千瓦时平段0.65元/千瓦时谷段0.35元/千瓦时。热用户室温舒适区间18至24摄氏度管道供水温度在85至120摄氏度之间回水温度在35至55摄氏度之间。4.2 三组对比方案的设置与结果为了把热惯性和AA-CAES的作用分开看我设置了三个对比方案方案A传统CHP独立供电供热无AA-CAES不考虑热网动态。方案BCHP加上AA-CAES但不考虑区域供热网络热惯性。方案C完整模型CHP加AA-CAES加区域供热网络热惯性。三个方案采用完全相同的负荷曲线、风电曲线和分时电价。运行结果如下表方案总运行成本万元弃风率%CHP夜间最低电出力兆瓦方案A212.618.748.2方案B198.49.348.2方案C185.14.135.6方案的对比效果很明显。方案B和方案A相比主要是AA-CAES通过峰谷套利降低了购电成本但对夜间弃风的改善有限因为弃风的根源是CHP电出力下限太高而不是缺少电能消纳空间。方案C加入热惯性后CHP夜间最低电出力从48.2兆瓦直接降到35.6兆瓦弃风率从9.3%掉到4.1%成本一天就少了13.3万元大约节省6.7%。这就是热惯性“解耦以热定电”的直接价值。4.3 热惯性的灵活性到底从哪里来如果只看最终结果可能觉得热惯性就是“让机组少出力”这么简单。但实际上它的调度机制要微妙得多。从优化器输出的详细结果看方案C的供水温度曲线呈现出一个明显的“锯齿状”在夜间风电大发时段CHP热出力降低供水温度从105摄氏度逐步滑落至88摄氏度回水温度基本不变这个过程管网和建筑在持续释放前期蓄热在白天电价较高或热负荷高峰到来之前CHP提前增大热出力把供水温度拉回到110摄氏度以上完成蓄热。更有意思的是AA-CAES在这个场景中并没有像锂电池那样在夜间充到满、白天放到底而是把充放电时段分散了因为热网蓄热释放也需要CHP在部分时段提升电出力来配合AA-CAES相当于在电侧做“削峰填谷”热网在热侧做“移峰填谷”两者互补后才形成了整体最优解。如果你只盯着储能SOC曲线看会觉得它充放次数偏多、不太规律但结合热网温度曲线一起看就明白这就是协同调度的真正形态。5. 常见问题与排查技巧实录5.1 模型求解不收敛或MIP gap过大的处理思路我遇到过最多的异常就是模型求解特别慢或者显示infeasible。先说infeasible这通常不是模型错误而是约束自相矛盾。常见原因是CHP可行域顶点输入错误。你可以先跑一个最小化“松弛变量之和”的可行性恢复模型也就是把所有等式约束都加一个松弛变量并把松弛量最小化找到最先冲突的约束然后逐条排查。求解慢则大概率是整数变量太多。CHP启停变量加充放电状态变量加起来在48个时段内就有上百个整数变量。处理经验有二一是把不敏感的0-1变量改为连续化试算看看目标函数变化量如果变化很小就保留连续化结果二是给模型提供一个初始可行解用解热网前一日调度结果作为初始值Gurobi的warm start功能能显著压缩求解时间。5.2 热网温度约束的稳定性问题如果模型能求解但结果中管道出口温度出现异常振荡问题往往出在时间延迟数组越界或初始时段处理不当。我的建议是把初始几小时内的管道入口温度固定为设计值并让延迟数组用向前填充而不是简单清零这样前几个时段不会出现虚假的低温冲击。另一个坑是散热损失系数设置过高当系数超过每公里0.5摄氏度的时候长距离管道的出口温度可能低于回水温度这在物理上不可能但在优化模型里会被当成可行解。因此我会在模型里补充约束强制每一根管道的出口温度大于回水温度至少3摄氏度。5.3 结果不合理时的排查顺序如果你发现调度结果违背基本工程直觉比如白天高电价时段CHP不发电、反而让储能充电不要急着怀疑模型先按这个顺序排查排查时段索引是否对齐风电、电价、热负荷这些时间序列是否在同一个时间轴上小时刻度和浮点精度是否一致。排查单位是否统一功率单位用兆瓦热量单位用兆瓦时储能用兆瓦时。混用的现象在复现代码里非常常见一搞错就是数量级灾难。排查参数符号正负号储热SOC转移方程里充放热的符号如果没有统一会直接导致能量凭空产生或消失。最后检查边界时段约束日始末SOC一致性条件如果漏了模型会把储能初始能量当作免费的资源耗尽成本自然会异常低。5.4 给新手的实操建议如果你是第一次接触这类优化调度模型我建议不要一上来就复现完整的热网动态模型而是分成三步走第一步先跑通一个最简单的经济调度模型只包含CHP和电负荷目标只有煤耗不接储能和热网。第二步把AA-CAES加进去加入储电、储热SOC约束跑通并验证不等式约束的逻辑。第三步再加热网时间延迟和建筑热惯性这时候你已经对前面两块代码足够熟悉热网模块的问题很容易被单独隔离出来。还有个细节热网模型的管道数量不要一开始就上几十根。先用一根管道、一个热负荷节点把逻辑跑通验证延迟效果正确再扩展到完整管网。我第一版代码就是图省事直接把50根管道全建出来结果光排查热网建模错误就折腾了好几天。简化起步后面补扩展效率才是最高的。结尾一点个人的实际体会这个项目做下来我最深刻的体会是优化调度模型的价值从来不在数学有多复杂而在你捕捉物理过程本质的准确性。热惯性这个概念如果只是当成一个“软约束”随便处理根本体现不出管网蓄热的力量一旦你把它写成时间延迟和温度动态约束在结果里亲眼看到CHP的夜间电出力降下来、成本降下来的时候会真切感受到好模型的力量。建议你在复现时也把重心放在热网建模这一块多试几组管道长度和流速参数找到适合你场景的时间延迟量级。如果你在跑通过程中遇到热网约束导致的求解困难欢迎把这篇文章里的参数试一遍大概率能帮你少走一大段弯路。