资讯动态

综合能源系统四联供优化调度:需求响应、碳交易与Cplex求解实践

发布时间:2026/10/20 6:55:53 来源:尧图企业网站定制
这两年做综合能源系统优化调度的朋友应该都有体会冷热电气四联供听起来只是比三联供多了一个气字实际做起来涉及的设备建模、多能流平衡、市场机制和求解工具环环相扣任何一个环节偷懒都会在结果里现出原形。我这个项目从立项到跑通主线就是标题里的三件事综合需求响应、碳交易机制、用Cplex求解。这篇文章把完整思路做个梳理重点放在建模取舍和求解踩坑上给正在做园区级综合能源优化调度的同行一份可参考的实践记录也顺便聊聊这个方向里看起来简单、做起来麻烦的地方。1. 四联供系统到底在优化什么项目需求拆解1.1 为什么偏偏是冷、热、电、气四种能量耦合电、热、冷、气是园区场景里最常见的四种终端用能形式也是综合能源系统研究里最经典的耦合对象。很多人第一次看到四联供会觉得这是概念堆砌其实它的物理基础很扎实燃气轮机烧天然气发电排出的高温烟气如果直接扔掉那叫浪费把它回收进余热锅炉变成蒸汽或者热水就是供热再把这部分热量驱动吸收式制冷机就变成了制冷。发完电、供完热、制完冷天然气的化学能基本被梯级利用了一遍这正是冷热电联供能量梯级利用的核心逻辑。再加上气这个维度系统结构的互补性会更强。燃气锅炉可以在余热不足时顶上供热电制冷机和吸收式制冷机可以分摊冷负荷蓄电池、储热罐、储气装置又给系统增加了时间维度的调节能力——白天电价高、光照足的时候多发电多充电夜间谷电时段再释放这种源-网-荷-储协同的调节空间是单独建一套电系统、一套热系统、一套冷系统根本给不了的。拿我做的这个模拟园区来说业态是办公楼加数据中心加酒店白天电负荷和冷负荷双双打尖峰晚上人流散去热负荷生活热水、采暖反而上来。如果按传统方式分别从电网购电、从燃气管网购气每一路都要按自己的最大需求预留容量配下来容量冗余很大。四联供要回答的问题就一个在满足所有冷热电负荷的前提下每一时段每台设备到底发多少电、供多少热、制多少冷、存多少能量才能让全系统运行成本最低、碳排放也尽可能少。1.2 综合需求响应和碳交易把调度问题推进到了哪一步传统的日前调度只做供给侧优化负荷是硬约束不能动。这相当于把系统的一半调节能力锁死了。加入综合需求响应IDR之后负荷侧的可调潜力被正式纳入优化源荷两侧联合同步决策。综合需求响应和电力系统里常说的需求响应还不一样。它强调的是综合两个字电、热、冷、气四类负荷全部可以参与响应。电负荷可以转移、可以削减热负荷在用户舒适度范围内可以下调冷负荷有室内温度设定区间可调气负荷里面也有一部分是可中断的。每一类负荷的响应特性、补偿机制都不一样建模时必须分类对待。价格型响应靠分时电价引导用户自己调整激励型响应靠签订可中断合同、由调度中心直接下发削减指令这两种机制背后的数学表达完全不同。碳交易机制则给系统加了一个碳排放成本维度。过去碳排放是事后核算跟日常运行决策没关系纳入碳交易之后排放量直接变成目标函数里的成本项。有意思的地方就在这里燃气轮机烧天然气单位热值的碳排放比煤电低那么系统到底应该多烧气少购电还是多购电少烧气就不再是一个固定答案而要看碳价、气价、电价三者的相对关系。这个动态权衡是这类项目最有研究价值的地方。2. 数学建模目标函数与约束条件的核心设计2.1 目标函数购能成本、运维成本、碳交易成本怎么摆模型的目标函数我采用了典型的全生命周期日运行成本最小化形式所有成本项都折到同一个调度周期24小时内[ \min F C_{购电} C_{购气} C_{运维} C_{碳交易} C_{需求响应} ]购电成本( C_{购电} \sum_{t1}^{24} \rho_{电}(t) \cdot P_{buy}(t) )分时电价和每个时段的外购电功率相乘累加购气成本( C_{购气} \rho_{气} \cdot \sum_{t} F_{gas}(t) )注意天然气的计价单位是元/立方米而设备出力通常用kW两者换算必须统一运维成本每台设备单位出力对应的折旧和维护费用累加碳交易成本( C_{碳交易} \lambda_{碳} \cdot (E_{实际} - E_{配额}) )这个差值可正可负正值是买配额负值是卖配额需求响应补偿成本主要是激励型DR的可中断负荷补偿价格型DR不需要额外列项因为它已经在购电成本和负荷转移行为里体现了。这里有一个新手特别容易踩的坑量纲不统一。燃气的热值、设备的发电效率、碳排因子、电价单位四个变量凑在一起任何一个换算错了模型照样能算出一个漂亮的最优解——但那个解是错的。我的习惯是先把所有物理量统一折算成电功率当量kW和能量kWh天然气先用热值换算成kWh再参与计算全过程只保留一套单位体系。2.2 需求响应的两种建模路线价格型与激励型价格型需求响应PBDR有两种主流建模方式。第一种是用价格弹性矩阵描述负荷对电价的响应数学上会产生非线性项后续要做线性化处理第二种是把负荷拆成固定负荷 可转移负荷 可削减负荷可转移负荷的总量在一天内守恒只是可以换时段使用可削减负荷设上限并给补偿单价。我选了第二种因为它在工程上更直观也更方便后续跟激励型DR统一在一个模型框架里。热负荷和冷负荷的柔性建模用的是舒适度区间思路供热时允许室内温度在一定范围波动相当于给热负荷一个连续可调区间制冷同理。气负荷里的一部分用户签订了可中断供气合同这部分可以直接当作激励型DR来处理。激励型DR在建模上要比价格型复杂因为要引入0-1变量表示某个时段是否发生了削减还得限制单日最多削减次数、单次削减的最短/最长持续时间。不限制的话优化器会钻空子把同一个负荷一天切上十几次这在工程实践中根本不允许。这些二元变量正是后面Cplex求解时间变长的根源之一属于建模一时爽求解火葬场的典型代表。2.3 能量平衡和设备约束模型能不能自洽的关键四联供系统的核心约束其实就是四条能量平衡方程电平衡( P_{buy} P_{GT} P_{PV} P_{dis} P_{load} P_{EC} P_{chg} )热平衡( H_{HRSG} H_{GB} H_{dis} H_{load} H_{AC} H_{chg} )冷平衡( C_{AC} C_{EC} C_{load} )气平衡( F_{buy} F_{GT} F_{GB} F_{gas_load} )。每条方程每个时段都要满足这看起来简单但细节陷阱非常多。电平衡等式右边必须包含电制冷机的耗电因为电制冷机是用电产生冷的设备它本质上是电力系统的负荷热平衡等式右边必须包含吸收式制冷机消耗的热量因为它是从热力系统抽走热量的设备。我见过不少初稿模型漏掉其中一项结果能量怎么算都不守恒排查起来非常痛苦。设备层面的约束也很有讲究。除了出力上下限和爬坡约束燃气轮机的热电运行可行域feasible operation region是必须建模的。实际热电联产机组的发电出力和供热出力不是彼此独立的它们被热电比约束在一个多边形可行域里。如果图省事只写两个独立上下限模型会给出一个电和热同时取最大值的物理上不可能运行的工况后面的结论全是空中楼阁。储能设备则需要写充放电功率约束、SOC递推式、以及调度周期始末SOC相等约束。3. 碳交易机制从配额分配到模型落地3.1 免费配额怎么算碳交易机制落地的第一件事是确定初始配额即系统在没有额外购买的情况下被允许排放的上限。国内试点最常见的分配方法是基准线法按某种产出量乘以对应的排放基准来分配。比如燃气轮机每供应1 kWh电力分配0.7 kg二氧化碳当量的配额吸收式制冷机每供应1 kWh冷量按对应的供冷基准分配。这样做的好处是多产出多给配额不会过度惩罚产量高的企业。整个园区综合能源系统的总配额就是各类能源输出量乘以各自基准后求和。需要提醒的是这个配额基准的取值极其敏感——基准定得高系统几乎不用为碳排放掏钱碳交易机制形同虚设基准定得低系统可能在所有场景里都处于买配额状态成本压力又太大。所以我在算例部分从不让配额取单一固定值一般同时做配额高、中、低三档的对比。3.2 碳排放核算边界直接排放与间接排放系统实际碳排放要分两部分核算。直接排放来自燃气轮机和燃气锅炉消耗的天然气计算方式是天然气消耗量乘以天然气排放因子折算下来大约每标准立方米天然气排放2.16千克二氧化碳实际值要看项目当地的气质参数我算例里都按这个标准值。间接排放来自外购电。你从电网买来的电对应电网侧煤电、气电等电源的排放核算时用购电量乘以区域电网基准线排放因子国内一般取0.5到0.7千克CO₂每千瓦时具体数值取决于当年所在区域电网的电源结构。这个间接排放的占比往往很惊人尤其是园区电负荷大的时候购电导致的间接排放可能超过燃气机组直接排放的总和。建模时容易混淆的一对概念是排放和配额。配额是按产出量给的排放是按燃料消耗量算的两者表达式完全不同一定要分开建。我最初写模型时把这两个变量混用了结果碳交易成本恒为负模型居然越排越赚钱整个结果完全失真排查了很久才意识到是核算口径的问题。3.3 碳交易成本进目标函数的处理方式碳交易成本进入目标函数的主流写法是 ( \lambda_{碳} \cdot (E_{实际} - E_{配额}) )把它当作一个可正可负的软性成本项。( E_{实际} ) 小于 ( E_{配额} ) 时系统可以把富余配额卖出变现等于获得一笔负成本反之则需要买配额增加成本。这种写法把碳排放从硬约束变成了经济权衡优化器会自动寻找购气、购电、储能充放之间的最优妥协点。也有人会把碳排放写成硬约束即 ( E_{实际} \le E_{配额} )相当于不允许购买配额。这种写法在工程上更保守但把碳市场的灵活调节价值砍掉了。我的项目定位是碳交易机制下的研究所以采用可买卖的软约束形式这样更能体现市场机制对运行策略的引导作用。碳价本身也需要做场景化处理。不同碳价水平下系统的最优策略差异很大碳价低时碳排放成本微不足道系统偏向经济最优碳价高了系统会主动压低外购电、抬高燃气轮机出力甚至调整储能策略来减少间接排放。这个动态特性的价值在后面的灵敏度分析里会看得非常清楚。4. Cplex求解实战线性化、环境搭建和参数调优4.1 非线性项线性化是第一步模型里天然包含非线性项而Cplex的MILP求解器只处理线性目标函数和线性约束。所以建模之后的第一件事就是线性化。最常见的三类问题第一二进制变量和连续变量的乘积比如储能充电状态和充电功率相乘处理手法是大M法引入一个辅助变量用一组含大M的不等式等价替换。第二二次成本曲线比如燃气轮机发电成本随出力近似二次曲线处理手法是分段线性化PWL把出力范围切成若干段每段用线性函数逼近同时引入顺序约束保证段与段之间衔接自然。第三目标里的min/max项和绝对值项用辅助变量加不等式组改写。分段数的选取值得单独说。分的段太少逼近误差大碳价灵敏度分析时曲线不够光滑分段太多二元变量数量暴涨求解时间成倍增加。我试下来电出力范围切4到6段是比较平衡的选择既能保证误差在1%以内又不至于把模型撑爆。4.2 YALMIPCplex环境搭建与核心建模代码求解环境我选的是MATLAB YALMIP Cplex。YALMIP是建模层负责把优化问题描述成标准形式真正求解还是交给Cplex引擎。Cplex对大规模混合整数线性规划的处理能力在商用求解器里属于第一梯队这也是题目标题里点它的原因。核心建模代码骨架大概长这样% 决策变量 P_gt sdpvar(1, 24, full); % 燃气轮机发电出力 H_gt sdpvar(1, 24, full); % 燃气轮机供热出力 P_ec sdpvar(1, 24, full); % 电制冷机耗电 u_gt binvar(1, 24); % 燃气轮机启停状态 P_dr sdpvar(1, 24, full); % 可削减电负荷 ... % 目标函数 F sum(price_elec .* P_buy) price_gas * sum(F_gas) ... sum(om_rate_gt .* P_gt) ... carbon_price * (E_actual - E_quota) ... sum(dr_price .* P_dr); % 约束 Constraints []; for t 1:24 % 电平衡 Constraints [Constraints, P_buy(t) P_gt(t) P_pv(t) P_dis(t) ... P_load_fix(t) P_load_shift(t) P_ec(t) P_chg(t) P_dr(t)]; % 设备出力上下限 Constraints [Constraints, 0 P_gt(t) P_gt_max * u_gt(t)]; ... end % 储能SOC递推 Constraints [Constraints, soc(2:24) soc(1:23) ... eta_chg * P_chg(1:23) - P_dis(1:23) / eta_dis]; ... % 求解 ops sdpsettings(solver,cplex,verbose,2, ... cplex.mip.tolerances.mipgap, 0.001, ... cplex.timelimit, 3600); optimize(Constraints, F, ops);几个细节提醒一下。( F_{gas} ) 不能直接当变量瞎写它必须通过燃气轮机的发电效率和热电效率从 ( P_{gt} )、( H_{gt} ) 反算出来写成线性等式约束。储能SOC的递推公式里充放电效率一个放在充电侧一个放在放电侧别两边都乘效率否则能量会莫名其妙地越存越多。还有YALMIP里binvar和sdpvar混用时乘法要通过辅助变量处理不能直接乘这个很多人第一次跑就会报错。4.3 求解参数调节从能出解到高效出解第一次跑完整模型大概率会遇到求解时间爆炸。我的经验是先把规模降下来做模型验证只跑24时段、只含电热两流的简化场景确认结果符合物理直觉之后再加冷、加气、加需求响应。每加一层都观察目标函数和关键变量是否发生合理变化这样能快速定位建错的地方。Cplex的几个关键参数我常用的设置如下参数作用推荐设置mipgap整数解最优性间隙0.001 ~ 0.01timelimit求解时间上限3600秒threads并行线程数4 ~ 8mipdisplay求解过程输出2conflictrefine冲突最小化on排错用工程上不要把mipgap设成默认的极小值日前调度场景下0.1%的次优完全可接受但求解时间可能差出数倍。另外储能初值赋值很关键不给SOC初值Cplex会在大量节点上反复试探不可行域浪费大量时间给一个合理的初始可行解常常能把求解时间缩短到原来的十分之一。5. 算例设计与结果分析模型有没有用数据说话5.1 典型日场景与设备参数设置算例用的是某综合园区的典型夏季日数据。电负荷峰值约1.2 MW冷负荷峰值约800 kW热负荷峰值约900 kW含生活热水气负荷折算约200 kW当量。关键设备参数如下表设备容量效率/性能系数运维成本燃气轮机1000 kW发电效率0.330.02元/kWh余热回收系统600 kW热热回收效率0.700.01元/kWh吸收式制冷机500 kW冷COP 1.20.01元/kWh电制冷机600 kW冷COP 4.00.005元/kWh燃气锅炉800 kW热效率0.920.008元/kWh蓄电池500 kWh充放效率0.950.03元/kWh储热罐800 kWh效率0.950.005元/kWh电价采用峰平谷三段式峰时1.12元/kWh8点至11点、18点至21点平时0.68元/kWh谷时0.32元/kWh23点至次日6点。天然气价2.8元/m³碳价基准80元/吨电网排放因子0.581千克CO₂/kWh天然气排放因子2.16千克CO₂/m³。5.2 三种机制组合的结果对比为了把需求响应和碳交易两个机制的贡献分开我设计了三个场景对比场景配置日总成本/元碳排放/kg外购电量/kWhA无DR、无碳交易940202463013280B仅含DR价格型激励型892602471012410CDR 碳交易870402085010320场景A是基准系统没有负荷调节能力也没有碳排放成本压力怎么便宜怎么来。场景B加了需求响应后日总成本降了约5%但碳排放几乎没动——说明单纯的需求响应主要实现的是省钱靠削峰填谷挪移负荷把高价时段购电换成低价时段购电对总排放量影响很小这个结果和很多文献结论一致。场景C同时加入碳交易机制情况完全不同了碳排放从24.6吨降到20.8吨降幅约15%同时总成本比场景B还低一点。原因是碳价把燃气轮机的相对经济性抬高了——80元/吨的碳价使得外购电的间接碳排放成本变得不可忽略系统主动提高燃气轮机出力、减少外购电从电网侧煤电置换了相当一部分间接排放。这个结果很有说服力需求响应负责削峰填谷省成本碳交易负责引导系统的低碳转型二者不是一回事但放在同一个模型里能做到协同优化。5.3 碳价灵敏度分析一张图看懂运行策略拐点我把碳价从40元/吨一路扫到200元/吨观察系统运行策略的变化。结果出现两个明显的拐点在40到80元/吨区间系统对碳价不敏感因为燃气轮机的发电成本优势还不足以抵消碳价带来的间接排放惩罚从80元/吨开始燃气轮机的出力明显上升外购电量快速下降系统开始主动把电负荷从电网搬到燃气轮机上超过150元/吨后变化趋于平缓因为燃气轮机的容量已经接近上限再提高碳价也只能通过微调储能策略来减碳。这个灵敏度分析的工程意义很实在给园区运营者提供一个碳价阈值参考。碳价落到某一区间时维持现有运行策略即可碳价涨过某个临界值就得提前调整机组组合方式甚至重新评估是否需要扩容燃气轮机。如果不做这个分析拿到一个碳价就直接跑一遍模型等于只看了一张快照看不到策略切换的边界在哪里那才是真的浪费了优化模型的价值。6. 踩坑记录建模与求解中的高频问题6.1 不可行解的排查链路模型建完第一次求解非常大概率收到infeasible的结果。这时候千万别慌也别一头扎进代码里瞎改。我的排查顺序是固定的先放开全部需求响应约束只保留最基本的能量平衡和设备上下限确认问题本身可行如果此时可行再加回储能约束重点检查SOC递推的初值与终值一致性——这是一个极高频的不可行来源再加价格型DR约束重点检查可转移负荷总量守恒是否真的守恒。我最常犯的错误是把全天总量守恒误写成每个时段都要等于同一个常数直接导致夜间时段无解最后加激励型DR约束检查削减时长和削减次数限制是否与负荷时长数据匹配利用Cplex的conflict refinement功能直接输出冲突约束集合比人工逐条猜高效得多。YALMIP里可以调用cplex的冲突最小化接口报告会直接指出哪几条约束互相矛盾。我印象最深的一个坑是可削减负荷的单次削减持续时长约束我一开始写成了削减时长必须恰好等于3小时这导致晚高峰时段的负荷削减无法满足时长的整数匹配模型在那一时段永远无解。正确的写法应该是连续削减时长在2到4小时之间用两个不等式和辅助状态变量描述而不是一个等式。6.2 求解时间失控的处理24时段加十几个0-1变量的MILP很多时候不是不能解而是解不完。遇到求解时间失控我的三板斧是第一压缩二元变量的数量。很多设备的启停状态可以尝试用连续变量加互补约束替代或者把一天按典型运行模式分段减少需要独立决策的时段数。第二给mipgap一个合理的非零容忍度。0.1%的次优解在日前调度里完全可接受但求解时间可能差出一个数量级。第三观察gap下降曲线。如果求解日志长时间卡在某个gap不动说明存在一组非常接近最优解的整数组合在竞争这时候可以加对称性破缺约束——比如多台同类型机组按序号设定出力递减消除等价解的搜索空间。另外一个YALMIP层面的技巧把储能SOC初值、上一时段的设备出力作为参数传给模型相当于给求解器一个靠谱的起点很多情况下求解速度能提升数倍。这招在滚动优化的场景下尤其好用。6.3 结果合理性检验不要只盯着目标函数模型跑出数值解之后严格来说工作只完成了一半。我每次必做三件事来检验结果的正确性第一把Cplex输出的各变量值回代到能量平衡方程里检查残差是否在数值容差内。这一步看起来笨但它能拦下相当一部分目标函数挺好看、物理上根本不守恒的错误解。第二检查燃气轮机的电出力热出力工作点是否真的落在热电可行域内防止线性化过程中产生的无效解混进结果。第三观察储能SOC曲线有没有出现整天满充满放的振荡。如果出现了通常不是求解器的问题而是目标函数里储能折旧成本定得太低导致优化器把储能当作免费的削峰填谷工具这和实际运行逻辑是不吻合的。还有一个容易忽略的点碳交易成本在目标函数里是预测值但实际操作和结算往往有偏差碳价、配额基准都可能和日前预测不一致。所以我在算例里额外做了一组碳价偏差正负20%的鲁棒性验证看系统的最优策略是否会发生大的跳变。如果碳价小幅波动就导致机组组合剧烈翻转说明这个模型的结果在实际落地时不可信需要重新检查约束条件是否过于紧张。最后再分享一点个人体会。这类带碳交易和需求响应的四联供调度模型真正卡人的往往不是数学而是对物理系统的理解——设备到底怎么运行、负荷到底柔性到什么程度、碳配额的边界在哪里。把这些想清楚模型和求解基本都是水到渠成的事。我建议刚接触这个方向的同行先别急着堆设备和约束拿一个简单的园区数据把无DR、无碳交易的基准场景跑通再逐层加入需求和碳市场机制每加一层都仔细看结果发生了什么变化。这样既能理解每个机制的作用边界也能避开我上面踩过的那些坑。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑