考虑柔性负荷的综合能源系统低碳经济调度方法 考虑柔性负荷的综合能源系统低碳经济调度探索做综合能源系统调度的人多少都有过这种体会光伏、风电一上来源侧的不确定性还能靠预测和备用扛一扛真正让人头疼的其实是荷侧——负荷曲线硬邦邦地摆在那儿燃气轮机跟着爬坡储能跟着充放一天下来碳配额超了、成本也上去了调度员手里能打的牌越来越少。我这两年在做园区级综合能源系统的低碳经济调度时最大的一个转变就是把“柔性负荷”从论文里的概念真正放进调度模型里。这个项目名义上是一个调度优化问题实际做下来更像是一套“源-网-荷-储”协同的重构过程。这篇就围绕这个项目把我的建模思路、求解踩坑、参数设计全过程拆开来讲给正在做类似工作的同行一些可直接参考的东西。1. 项目整体设计与调度框架1.1 综合能源系统的“多能互补”到底补什么很多初次接触综合能源系统的人容易被“电热冷气”四个字带偏以为只要把几种设备拼在一起就算多能互补。实际上综合能源系统的核心价值在于能源品种之间的替代与耦合——电不够时可以用气热不够时可以用电制热冷负荷可以由电制冷或吸收式制冷分担。这种替代关系才是调度优化的底层逻辑。我做的这个系统包含的元件比较典型风机、光伏、燃气轮机、余热锅炉、电锅炉、吸收式制冷机、电制冷机以及储能电池和蓄热罐。电网作为外部支撑天然气作为一次能源输入负荷侧包括电负荷、热负荷和冷负荷三类。整个系统的能量流动不是单向的燃气轮机发电后的高温烟气进入余热锅炉产生蒸汽蒸汽既可以供热也可以驱动吸收式制冷机供冷这就是典型的“以热定电”或“以电定热”的运行模式切换。这种耦合结构带来一个调度上的核心难点电、热、冷三种负荷的峰谷时段往往不一致。比如夏季白天电负荷高、冷负荷也高但热负荷很低冬季早晚热负荷高、电负荷相对平稳。如果每个能源品种独立调度很容易出现燃气轮机为了发电产生大量余热却用不完或者为了供热而发电导致电功率超出负荷需求的尴尬局面。柔性负荷的引入恰好给了调度模型一个“削峰填谷”的额外自由度。1.2 柔性负荷的分类与可调度价值柔性负荷不是新鲜概念但在综合能源系统调度里它的作用被放大了。原因很简单系统里有了多种能源耦合负荷的“柔性”就不再只是某一时刻的电功率可调而是可以跨能源品种、跨时间段进行能量置换。我在项目里把柔性负荷分为三类可转移负荷——指用电时间可以平移、但总用电量不变的负荷比如电动汽车充电、洗衣消毒设备、蓄热式电暖器。这类负荷的特性是“总量刚性、时间弹性”转移时段内总能耗不变。可削减负荷——指可以降低功率或减少用量的负荷比如空调温度上调、照明亮度降低、部分工业非关键工序中断。这类负荷“量可减少”但会牺牲一定舒适度或产能。可平移负荷——类似可转移但更严格要求整个负荷块完整地从一个时段搬到另一个时段不能拆分。比如工厂的一条生产线批次要么整批运行、要么整批挪走。三种柔性负荷加起来通常能占到园区总负荷的15%~30%。这个比例听起来不大但在调度模型里它们带来的“调节空间”比同等容量的储能还要有效——因为储能受容量和SOC限制而柔性负荷本质上是把用户侧的“时间资源”变成系统的调节资源几乎不增加硬件投资。1.3 为什么要在低碳目标下谈经济调度纯经济调度和低碳经济调度的本质区别在于前者只算钱后者要把碳排放变成“有价的约束”。现在很多园区和企业在双碳目标下面临实际压力——碳排放配额逐年收紧超出配额的部分需要在碳市场购买这就让“少排碳”直接转化成了“少花钱”。项目中我采用的是碳交易机制模式系统初始分配一定量的免费碳排放配额实际碳排放量低于配额时可以出售多余的配额获利高于配额时需要购买不足的部分。考虑到碳市场价格的阶梯性——超排量越多购买价格越高——调度模型天然会倾向于优先使用低碳甚至零碳的能源比如风电、光伏而不是一味追求运行成本最低的燃气轮机。柔性负荷在这个机制里的作用很巧妙通过转移负荷至新能源出力高峰时段可以提高新能源消纳率间接降低化石能源的使用量。举个例子如果中午光伏大发电负荷却很低柔性负荷可以把一部分高耗电工艺挪到中午让光伏发出的绿电被“自己人”用掉而不是弃掉或者低价上网。每多用一度绿电就等于少用一度燃气轮机发的电碳排放和燃料成本同时降下来。这就是“低碳”和“经济”在这个调度模型里从对立走向统一的关键碳排放约束不是给系统增加负担而是倒逼系统挖掘柔性资源的调节价值。2. 核心模型构建与关键数学表达2.1 目标函数的三层结构调度模型的目标函数我设计成三层叠加的结构每一项都有明确的物理意义和量纲。很多初做优化的朋友容易把目标函数写成一个大杂烩各项成本之间没有归一化处理结果权重失衡优化出来的方案毫无实用价值。这里我给出我的目标函数表达式min F C_fuel C_om C_grid C_co2 - C_curtail其中C_fuel燃气轮机和燃气锅炉的燃料成本按天然气消耗量乘以气价计算。C_om各设备的运行维护成本按输出功率乘以运维系数计算不同设备系数不同比如燃气轮机的运维成本远高于光伏。C_grid与电网交互的成本购电为正售电为负分时电价下峰段和谷段的电价差异非常大。C_co2碳交易成本基于实际碳排放量与配额之差按阶梯碳价计算。C_curtail弃风弃光惩罚项是一个很小的正数乘弃能量目的是保证模型不会为了省钱而主动放弃免费的绿电。这里要特别强调碳交易成本的计算。可能存在一种误解认为碳交易成本就是排放量乘以碳价。实际上在阶梯碳价机制下碳排放量分为几个区间每个区间的碳价不同。比如配额内价格是60元/吨超配额0-500吨部分按70元/吨500-1000吨部分按90元/吨超出越多越贵。这迫使模型在优化的时候不只在“排碳”和“买配额”之间权衡还要考虑排碳量跨区间带来的边际碳价跳变。这种非线性会让模型更难解但更接近真实的市场规则。2.2 柔性负荷的建模方式柔性负荷建模是这个项目里最容易出错的地方。以可转移负荷为例如果只是简单地把“负荷总和不变”作为约束模型会给出一些非常离谱的调度方案——比如把洗衣房所有用电集中到半夜一个小时内完成这在物理上完全可行但在实际运行中可能导致变压器过载甚至让用户在凌晨被噪音干扰。我的做法是给可转移负荷加上两个额外约束单时段功率上下限任何一个调度时段内可转移负荷的功率不能超过额定上限也不能低于最低运行功率。这模拟了设备本身的物理限制。连续运行时长约束同一批可转移负荷一旦开始运行必须连续运行至少若干个时段才能停止。这是为了防止模型在相邻时段间反复启停设备这种操作不但损伤设备在实际执行中也毫无操作性。可削减负荷的建模相对简单本质是给原始负荷曲线乘以一个削减系数但这个系数的范围需要谨慎设定。有些论文直接把削减系数设为0到1相当于允许任意时刻把负荷削减到0这在现实中几乎不可能——谁会同意把整个车间的照明全关掉我测试下来工业园区的削减系数上限设在0.2到0.3之间比较合理写字楼这类商业用户可以放宽到0.4左右。还有一个建模细节值得注意柔性负荷调节的边际成本。调度模型如果允许随意削减负荷那优化结果一定会倾向于大量削减负荷——因为削负荷在模型里几乎是零成本但现实中用户会有强烈的抵触情绪。我需要给负荷削减加上阶梯式的补偿成本削减量越大单价越高。这样优化出来的结果才不是“通过牺牲用户换系统经济性”的空中楼阁。2.3 低碳约束的引入方式综合能源系统的碳排放来源主要有两处燃气轮机的燃料燃烧和从电网购电对应的间接排放。前者按天然气消耗量乘以排放因子计算后者按购电量乘以电网平均碳排放因子计算。最常见的碳约束形式是总碳排放量不超过配额总量但我在项目里发现这种“单一总量约束”太粗糙了它无法反映碳排放在时间维度上的分布。比如系统可以选择在碳排放因子较高的峰段购电然后在谷段用燃气轮机发电只要总量不超限就行。这种结果虽然满足碳约束但实际中电网的实时碳排因子波动很大——光伏大发的中午碳排因子可能只有深夜的一半——不考虑时序碳排放会让“低碳调度”名不副实。一个改进方案是引入时序碳排放因子概念把一天的购电量按小时拆开每小时的购电碳排因子不同再累加得到总的间接碳排放。这相当于把碳约束从“日总量”细化到了“时段累计”对模型的求解规模有一定增加但换来的是调度方案真正做到了“跟着绿电走”效果非常明显。2.4 约束条件的完整清单一套完整的综合能源系统低碳经济调度模型约束条件大致可以分成四类功率平衡约束——这是所有调度模型的基石电功率平衡要求所有电源出力加上储能放电、购电总和等于电负荷加上储能充电、售电热平衡和冷平衡同理。这里容易出现的问题是热负荷与冷负荷在吸收式制冷机处产生耦合——吸收式制冷机消耗的热量本身就是系统热负荷的一部分建模时不注意这个耦合关系会在平衡方程里产生重复计算。设备运行约束——每台设备都有出力上下限和爬坡约束。燃气轮机的爬坡率尤其关键一般控制在额定功率的3%~5%每分钟。储能设备的约束更复杂一些除了充放电功率上下限还要有SOC的上下限和充放电状态互斥约束——蓄电池不能同时充电和放电。状态互斥约束在混合整数线性规划中的处理方式是引入二进制变量这一步是模型能否被高效求解的关键。碳排放约束——如前所述总碳排放约束加上时序碳排因子修正配额不足时按阶梯碳价购买。柔性负荷约束——可转移负荷的转移量守恒、时段功率上下限、连续运行时长可削减负荷的削减比例上限和补偿成本可平移负荷的时间窗约束。这些约束加起来一个典型24小时调度周期步长取1小时的话决策变量大约在300到500个其中二进制变量50到80个。这个规模对于商业求解器来说属于“轻量级”但如果步长细化到15分钟变量规模会翻四倍求解时间就从秒级跳到分钟级了。所以调度步长的选择需要看实际需求做日前计划1小时足够了做日内滚动优化15分钟到30分钟比较合适。3. 求解方法与实操过程3.1 求解器的选择与配置项目里我用的求解环境是MATLABYALMIPR2022求解器选的是CPLEX。这套组合在学术界和工业界都比较常见。选择CPLEX而不是Gurobi主要考虑是CPLEX对混合整数线性规划问题的处理非常成熟而且在处理含大量二元变量的模型时分支定界算法的默认参数通常能给出不错的收敛效果。不过我不得不说一句公道话Gurobi在MILP问题上的综合表现其实已经超过CPLEX但在中国高校和企业里CPLEX的授权获取相对更容易这也是很多人仍然选它的现实原因。用YALMIP建模有一个好处它不绑定特定求解器模型用YALMIP的语言写好后换求解器就是一行代码的事。这个特性在实际项目中非常实用——我在调试阶段先用CPLEX跑通逻辑遇到规模化瓶颈时切到Gurobi模型本体不用动。在YALMIP里定义二进制变量非常简单% 定义24时段二进制变量表示储能是否充电 u_ch binvar(24, 1); % 定义24时段连续变量表示储能充电功率 p_ch sdpvar(24, 1); % 互斥约束充电时放电功率必须为0 p_ch u_ch * P_ch_max; p_dis (1 - u_ch) * P_dis_max;这两行互斥约束是储能建模的精髓。没有它们求解器会给出“同时充电和放电”的荒谬结果——当然如果充放电效率不对称模型自己会找到套利路径但这在实际设备中根本不可能实现。CPLEX的求解速度在这个规模的模型上表现很好一般几秒钟就能收敛到1%以内的最优间隙。但如果你的模型跑了几十秒还出不来结果回头检查一下约束条件是不是不小心写成了非线性的——比如两个变量相乘、或者用了min/max函数但没有做线性化处理。这是初学者最容易犯的错误。3.2 典型日负荷与新能源出力的设定调度模型的输入数据质量直接决定优化结果能不能用于实际。我在项目里整理的典型日数据包括电负荷基准曲线取园区某个月的平均工作日负荷曲线按小时统计最大负荷约4.8MW谷值约2.1MW峰谷差率超过50%。热负荷曲线白天低、早晚高峰值约2.2MWth。冷负荷曲线夏季典型日呈单峰形态下午2点至4点达到峰值1.8MWth。光伏出力曲线光伏额定容量3MW典型日出力峰值为2.4MW出现在正午12点至下午1点之间。这里要注意光伏的出力随机性很大典型日数据只能用于“算例分析”真正用于实际调度时必须用预测数据并在滚动优化中不断更新。风电出力曲线风电额定容量1.5MW夜间出力较高白天相对较低典型日出力峰值为0.9MW。我把分时电价设置为峰段1.2元/kWh、平段0.8元/kWh、谷段0.4元/kWh峰谷比3:1。天然气的价格取2.5元/立方米。碳排放配额设置为系统基准排放量的90%这样不是太松也不是太紧能让模型感受到碳约束的压力。3.3 一套完整的调度结果解读用上述数据跑完优化后我拿到了一组非常有代表性的结果。调度方案中燃气轮机在夜间电价谷段和凌晨时段出力较低仅维持最小技术出力到了白天电价峰段燃气轮机提高出力同时储能电池在谷段充满、峰段放电配合光伏一起满足高峰电负荷。最有意思的部分是柔性负荷的调度结果。园区里的电动汽车充电桩属于可转移负荷模型把原本集中在傍晚的充电需求转移到了午夜0点至凌晨4点之间。这个时段电价最低而且风电出力较高用风电给电动汽车充电既降低了购电成本又减少了碳排放——这个结果完美体现了柔性负荷对新能源消纳的促进作用。蓄热式电锅炉也是一个亮点。传统调度方式中蓄热罐只在谷电时段蓄热白天放热。在引入碳约束和柔性负荷后模型倾向于在光伏大发的中午也启动电锅炉蓄热——尽管中午电价不是最低但光伏出力减少购电碳排放的效果让中午蓄热从碳经济角度变成了更优选择。这就是低碳约束改变运行策略的典型表现。3.4 不同碳价下的方案对比为了测试模型对碳价的敏感性我分别设定了40元/吨、80元/吨、120元/吨三档碳价进行对比。结果非常直观碳价从40元涨到120元系统的天然气消耗量下降了约18%电锅炉的蓄热时段从中夜间扩展到了午间光伏大发时段柔性负荷的转移量增加了近一倍。同时系统的总运行成本并没有大幅上升——因为减少的燃料成本和碳排放支出部分抵消了柔性负荷的补偿成本。这说明一个很重要的结论通过需求侧灵活调节和源侧协同优化系统可以在不大幅增加总成本的前提下显著降低碳排放。碳价越高柔性负荷参与调度的积极性越强系统对新能源的消纳能力越强。4. 常见问题与排查技巧实录4.1 YALMIP模型不收敛的三个高频原因我在这个项目调试阶段遇到最多的就是模型不收敛或收敛极慢的问题。排查下来80%的原因集中在以下三类二进制变量过多导致分支定界树爆炸。解决办法是检查哪些约束可以被松弛成连续变量比如储能充放电互斥约束在水准较高时可以放宽让模型通过充放电效率差自然找到最优解。当然这会牺牲一定的精确性需要评估是否可接受。约束条件中存在大数值尺度差异。比如电功率的量级是MW而碳价的量级是元/吨两者相差几个数量级容易导致求解器在数值计算中出现病态。解决办法是对参数做归一化处理或者在建模时统一单位——比如碳成本用千元/吨功率用kW而不是MW。二进制变量与连续变量的乘积。这在储能SOC的计算中非常常见电池充电时SOC上升放电时SOC下降有些人不加思考就会写成SOC(t1) SOC(t) u(t)p_cheta - (1-u(t))*p_dis/eta这里u乘以p出现了非线性。正确的做法是用大M法把变量乘积线性化% 令 z u * p_ch线性化替换 z 0; z P_ch_max * u; z p_ch - (1-u) * P_ch_max; z p_ch;这种“大M法”是MILP建模的基本功处理不好模型要么无解要么求解器直接报错。4.2 风电光伏预测误差的应对调度优化用到预测数据就必然存在预测误差。我遇到的实际问题某天实际光伏出力比预测值高了不少而模型已经根据预测值把燃气轮机安排在较高出力水平结果出现“既弃光又烧气”的尴尬局面。这个问题的根源不在调度模型而在调度策略的更新频率。日前计划用的是24小时前的预测数据偏差到第二天完全无法避免。解决方案是引入日内滚动优化——每4小时更新一次未来12小时的调度计划用最新的预测数据重新求解。这样虽然不能完全消除预测误差的影响但可以把误差的影响压缩在几个小时内而不是让一整天的运行都基于一个失真的计划。滚动优化的计算时间要求比较高每轮求解必须控制在几分钟内。我当时把调度步长从1小时细化到30分钟变量规模增加后CPLEX求解时间仍然保持在1分钟以内完全满足在线运行的要求。4.3 负荷转移过度导致的新问题柔性负荷用好了是调节利器用不好会带来新的运行风险。我踩过的坑是模型为了追求极端的经济性把大量可转移负荷集中到某个特定时段——比如把全天所有可转移负荷都堆到凌晨3点执行虽然满足单时段功率上限约束但这一时段的电负荷曲线出现巨大尖峰不仅可能导致变压器过载还让这一时段的储能放电压力剧增。解决思路是给柔性负荷集中度设置惩罚项或上限。具体做法是在约束中加入“任意时段可转移负荷的运行功率不超过该时段原始负荷的一定比例”比如不超过30%。这样一来负荷转移的分布会更加平滑不会出现“全部挤在一个点”的极端情况。我对这个问题的理解是柔性负荷的调度自由度不是越多越好合理的限制条件反而能让结果更可执行。模型优化出的方案如果实际运行中无法落实那再好的目标函数和求解算法都没有意义。4.4 碳配额基准值的敏感性分析项目后期我做了一组敏感性测试把碳配额从“基准排放的85%”逐步调整到“100%”观察系统调度策略的变化。结果发现一个分水岭当配额相对宽松时系统的碳交易支出很低模型对碳成本的敏感性不高调度策略基本与纯经济调度一致。当配额收紧到基准排放的90%以下时碳约束开始真正起作用柔性负荷的调度率明显上升燃气轮机的启停次数增加电锅炉在午间的蓄热策略开始出现。这提醒我在低碳经济调度项目中碳配额的设定本身就是一种政策杠杆。配额定得太紧系统会花很大代价去满足碳约束定得太松低碳调度名存实亡。合理的做法是先做基准排放的仿真测算再根据实际的碳价水平和运行成本来综合确定配额而不是照搬其他园区的参数。5. 后续扩展的几个方向这个项目跑通后我觉得有几个方向值得继续深入。一是把需求响应机制和柔性负荷调度结合起来让用户侧通过价格信号主动调整负荷曲线而不是依赖模型强制执行削减二是引入更长时间尺度的储能规划比如季节性蓄热让“低碳”不只体现在日内调度而是跨周甚至跨月的能量平衡三是考虑多园区之间的协同调度把一个园区的柔性负荷作为另一个园区的备用调节资源在更大的空间尺度上挖掘需求侧的灵活性价值。我的体会是综合能源系统低碳经济调度这个题目真正的难点从来不在数学模型的复杂度而在如何让模型输出与现实运行之间保持良好的映射关系。柔性负荷是这个映射中非常关键的一环它让源侧的新能源波动有了一个“软着陆”的缓冲空间。如果有同行正在调试类似的模型我希望这些经验和参数能帮你少走一些弯路特别是在柔性负荷建模和碳约束处理这两个最容易踩坑的地方多花点时间做敏感性分析比盲目追求模型复杂度有用得多。