
做综合能源系统优化这些年我最大的感受是单纯把运行成本压到最低的思路已经不够用了。最近接到的项目需求里十有八九都躺着“碳机制”和“需求响应”这两个词。一开始我也觉得这就是换汤不换药等到真把模型改完、把数据跑出来才发现这两个因素对系统运行方式的改变远比预想中大得多。这篇内容我就拿实际做过的一个园区级综合能源系统优化项目来说聊清楚三件事碳机制怎么进模型、需求响应怎么参与调度、两者叠加之后优化运行的结果会发生什么变化。适合正在做微电网、综合能源、虚拟电厂调度优化的工程师和研究生参考也适合刚入行想搞懂“优化运行”到底在优化什么的同学读一读。1. 先理清楚碳机制、需求响应与综合能源系统怎么凑在一起1.1 综合能源系统到底优化的是什么东西综合能源系统不是简单地把光伏、风电、燃气轮机、电锅炉、储能堆在一起。它的核心特征是“多能互补”——电、气、热、冷多条能量流在一个平台里耦合运行通过设备之间的转换关系互相支撑。比如燃气轮机发电的同时产生余热余热可以进余热锅炉供热这就把电和热两条能量流绑在了一起。所谓“优化运行”就是在满足用户电、热、冷负荷需求的前提下逐时决策每台设备的启停和出力让整个系统在某个目标下表现最优。传统做法一般只盯经济性把购电费用、燃料费用、设备运维费用加在一起做最小化。但这样算出来的调度方案往往会让系统拼命买便宜电或者开低效燃机碳排放量很高在现在的市场环境下并不划算。所以问题就来了要想让系统既经济又低碳必须把“碳”这个维度变成一个有价格的约束或成本项让它和电费、气费一起参与优化。这正是碳机制进入优化模型的根本原因。1.2 碳机制不是“加了个碳价”这么简单碳机制在工程实现上通常有三种落地方式碳配额、碳税、碳交易。目前国内项目里最常用的是碳配额加碳交易的组合思路也就是给系统设定一个碳排放配额实际排放低于配额的部分可以在碳市场出售获利超过配额的部分需要花钱购买碳配额。落到优化模型里这意味着两件事。第一系统每产生一吨碳排放都要有一个明确的成本映射不管是通过碳价直接算还是通过配额盈缺折算。第二碳排放不是一个事后统计量而是每一时刻、每一台设备出力都会影响的动态变量。也就是说碳排放量必须是决策变量的函数模型才能自动在“多发清洁电”和“多买碳配额”之间做权衡。举个实际感受。之前我把一个纯成本优化的模型加上碳价之后燃气轮机的出力曲线肉眼可见地被压低光伏和储能的利用率明显提高甚至出现了在午间光伏大发时段主动停掉部分燃机、从电网购电来满足负荷的情况。原因不复杂那段时间电网购电的隐含碳排放因子低于天然气发电的碳排放强度买电比自发电更“省碳”省下来的碳配额卖出去还能赚钱。1.3 需求响应把“用户侧”变成优化变量需求响应的核心逻辑是通过价格信号或者激励手段引导用户调整用电行为和方式。在传统调度里负荷曲线是“给定条件”系统只能被动去追负荷。引入需求响应后负荷曲线的一部分变成了可变量系统可以在高峰时段削减或转移一部分负荷在低谷时段多用电从而让整体运行曲线更平滑。需求响应进优化模型时我一般把它分成两类考虑。第一类是价格型需求响应用户根据分时电价自主调整用电不需要在模型里强约束只需要用价格弹性系数描述负荷对电价变化的响应关系。第二类是激励型需求响应系统提前和用户签订协议约定在特定时段可以削减或转移一定比例负荷同时给予补偿。价格型模型好加但结果往往偏理想化因为弹性系数不好标定。激励型模型更直观可控性也更强是目前工程落地的主流方案。实际项目中我习惯把两类都做进去用价格型做负荷曲线修正用激励型做紧急情况下的削峰手段。到这里逻辑就闭环了综合能源系统提供了多种能源转换和存储的手段碳机制给低碳运行提供了经济激励需求响应让负荷侧有了主动配合的能力。三者放在同一个优化模型里才能实现真正意义上的源网荷储协同优化。2. 优化模型怎么搭目标函数与约束条件的取舍2.1 目标函数成本、碳成本与需求响应补偿如何同台竞技优化模型的目标函数是核心它直接决定了系统会往哪个方向“使劲”。我常用的是全生命周期日运行成本最小化包括四块成本。第一块是购能成本包括向电网购电的费用和购买天然气的费用。第二块是设备运行维护成本包括所有机组和储能的运维费用。第三块是碳成本计算方式是若系统碳排放量高于配额则产生购买配额的费用若低于配额则产生出售配额的收益目标函数里体现为负成本。第四块是需求响应补偿成本系统调用激励型需求响应时支付给用户的补偿费用。目标函数写成数学形式大概是这样min F C_buy C_fuel C_om C_carbon C_dr其中碳成本可以进一步展开成C_carbon P_carbon × (E_total - E_quota) × Δt这里 E_total 是系统总碳排放量E_quota 是系统获得的碳排放配额P_carbon 是碳价。E_total 大于 E_quota 时这项为正系统要花钱买配额小于时这项为负系统能靠卖配额赚钱。这个式子看起来简单但实际建模时容易忽略一个细节E_total 不是一个固定的数它要由每台设备的出力、能耗量和对应的碳排放因子逐时累加得到。如果只是用总购气量和总购电量去做事后折算优化器就没办法在每一时刻动态调节排放碳约束对调度的引导作用就废了。2.2 核心约束能量平衡、设备出力与碳配额约束约束条件决定了解空间的大小。一个完整的综合能源系统优化模型约束条件大致分四类。第一类是能量平衡约束。电力平衡要求每一时刻系统内所有电源出力加上购电量减去储能充电和需求响应削减量等于用户电负荷。热量平衡类似燃气轮机余热、燃气锅炉产热和热储能放热之和要满足热负荷。每个能量节点都要写一条平衡方程这是模型的基础骨架。第二类是设备运行约束。每台机组都有出力上下限和爬坡速率限制。储能设备有充放电功率限制和容量限制还要满足始末SOC一致的条件——如果第一天结束和第二天开始的电量不一致那长期运行的状态就不对。第三类是碳排放约束。碳排放量的计算公式是每台设备的能源消耗量乘以其碳排放因子逐时累加然后和碳配额做比较。这里的碳排放因子需要格外注意电网购电的碳排放因子和天然气燃烧的碳排放因子标准不一样而且不同地区、不同年份的电网排放因子差异很大取值直接决定了模型倾向于自发电还是购电。第四类是需求响应约束。削减负荷不能无限减一般约定最多不超过该时段原始负荷的一定比例。转移负荷必须满足时间耦合约束比如从高峰时段转移到低谷时段的电量要在低谷时段补回来。搭完这套约束之后整个模型就变成了一个典型的混合整数规划问题。设备启停变量是0-1整数变量各类出力、购能量、碳排放量是连续变量加上储能状态的时间耦合规模通常不小。2.3 需求响应约束削峰填谷不是让用户随便改需求响应约束里最有讲究的是负荷转移的时间耦合关系。很多初学者容易在这里犯错把各时段负荷简单地同时下调结果算出来的总用电量凭空减少了一大块实际上用户总用电量基本守恒只是用电时间变了。正确的做法是把负荷分成三类固定负荷、可转移负荷、可削减负荷。固定负荷必须逐时满足不可变动。可转移负荷的总量在一天内不变只是允许在时间轴上平移比如工业园区的某些可中断工序把上午的用电挪到下午。可削减负荷则是直接放弃系统支付补偿用户承担一定的不便。建模时可转移负荷需要引入一个“转移矩阵”或者用多时段耦合约束来描述。比如定义一个变量表示从时段t转移到时段t的负荷量那么每个时段的负荷净变化量就是转入量减去转出量同时所有时段的累计转移量总和必须等于零。这个约束加进去之后模型才能保证需求响应做的是“削峰填谷”而不是简单地“削负荷”。价格型需求响应这边常用的方式是采用自弹性系数和交叉弹性系数。自弹性系数描述当前时段电价变化对当前时段负荷的影响通常是负值交叉弹性系数描述其他时段电价变化对本时段负荷的影响通常是正值。按照经济学原理用户会把高峰时段的用电挪到低谷时段去。模型可以用负荷对电价的弹性响应矩阵来修正基线负荷形成新的负荷曲线。3. 求解思路与工程实现3.1 为什么首选混合整数线性规划碳机制和需求响应引入之后模型里出现了大量非线性项这是求解的第一个坎。设备出力和燃料消耗之间的关系通常是凸函数比如燃气轮机的热耗率曲线。需求响应补偿费用和削减量之间如果是阶梯价格也会产生非线性。碳排放约束本身倒还好关键在于每个时段设备启停变量和出力变量的乘积关系直接相乘就是双线性项。工程上处理这些非线性的思路是把模型转化成混合整数线性规划MILP来求解。设备出力-燃料曲线可以用分段线性化近似双线性项可以通过大M法或者引入辅助变量和逻辑约束来线性化。转化之后可以直接用Gurobi、CPLEX这类商业求解器求解速度有保障而且能保证找到全局最优解。我不建议在这个问题上追求过于复杂的非线性求解算法除非你是在做非常前沿的学术研究。工程项目的核心诉求是模型能在可接受的时间内给出稳定可靠的最优解而不是解一个理论上更精确但算不动的模型。MILP配合求解器是最稳的工程路线。3.2 关键参数取值碳价、碳排放因子、弹性系数参数取值直接决定优化结果的合理性这里分享几个实际项目里常用的参考值。碳价方面国内碳市场的价格波动比较大。早期试点阶段碳价可能在30-60元/吨后来全国碳市场启动后价格逐步攀升市场活跃时期可能到80-100元/吨。做方案论证时我习惯做碳价的敏感性分析一般取0、50、100、200元/吨几个档位分别计算看系统运行方式随碳价的变化趋势。碳排放因子方面电网购电的碳排放因子是影响模型结论最关键的数据。全国电网平均排放因子大约在0.55-0.60千克CO2/千瓦时但各区域电网的差异很大水电占比高的区域可能只有0.2左右火电占比高的区域可能超过0.8取值前务必确认项目所在地的电网边界。天然气排放因子相对稳定按热值折算大约每立方米天然气排放1.9-2.2千克CO2。需求响应的弹性系数和补偿单价是最难标定的。自弹性系数一般取-0.1到-0.3交叉弹性系数取0.05到0.15。激励型需求响应的补偿单价可以参考当地峰谷电价差或者按可中断负荷合同的实际约定取值工程上常见在0.5-1.5元/千瓦时这个区间。如果项目资料里没有明确数据我建议先按保守值估算模型跑通后再做敏感性分析。3.3 求解流程与代码框架我做这类项目的标准流程分五步走整理负荷与设备参数、搭建设备模型、构建优化模型、求解与结果分析、敏感性分析。下面给一个用Python配合Gurobi求解器实现的框架性代码实际工程里可以根据自己的项目情况填充数据import gurobipy as gp from gurobipy import GRB # 基本参数 T 24 # 调度时段数 load_e [...] # 电负荷数据 load_h [...] # 热负荷数据 price_e [...] # 分时购电价 price_gas 2.8 # 天然气价格, 元/m3 P_carbon 100 # 碳价, 元/吨 E_quota 3000 # 日碳排放配额, kg # 设备参数 CHP_min, CHP_max 0, 1000 # 燃机出力上下限, kW CHP_eta_e 0.35 # 燃机发电效率 CHP_eta_h 0.45 # 燃机余热效率 GB_min, GB_max 0, 800 # 燃气锅炉出力上下限, kW GB_eta 0.9 # 锅炉热效率 m gp.Model(IES_Optimization) # 决策变量 p_chp m.addVars(T, lbCHP_min, ubCHP_max, namep_chp) h_gb m.addVars(T, lbGB_min, ubGB_max, nameh_gb) p_buy m.addVars(T, lb0, ub2000, namep_buy) u_chp m.addVars(T, vtypeGRB.BINARY, nameu_chp) # 目标函数 obj gp.quicksum(price_e[t] * p_buy[t] for t in range(T)) obj gp.quicksum(price_gas * (p_chp[t] / CHP_eta_e / 9.7 h_gb[t] / GB_eta / 9.7) for t in range(T)) # 这里把电功率kW和热功率kW换算成天然气流量m39.7为天然气低位热值折算系数 # 碳排放成本 co2_chp gp.quicksum(2.0 * (p_chp[t] / CHP_eta_e / 9.7) for t in range(T)) co2_gb gp.quicksum(2.0 * (h_gb[t] / GB_eta / 9.7) for t in range(T)) co2_buy gp.quicksum(0.55 * p_buy[t] for t in range(T)) obj P_carbon / 1000 * (co2_chp co2_gb co2_buy - E_quota) m.setObjective(obj, GRB.MINIMIZE) # 电功率平衡约束 for t in range(T): m.addConstr(p_chp[t] p_buy[t] load_e[t], felec_balance_{t}) # 热功率平衡约束 for t in range(T): m.addConstr(CHP_eta_h / CHP_eta_e * p_chp[t] h_gb[t] load_h[t], fheat_balance_{t}) # 启停与出力联动约束 for t in range(T): m.addConstr(p_chp[t] CHP_max * u_chp[t], fchp_upper_{t}) m.addConstr(p_chp[t] CHP_min * u_chp[t], fchp_lower_{t}) m.optimize()这个框架代码省略了储能和需求响应变量但核心逻辑已经完整。实际项目中你还要加上储能SOC约束、需求响应削减量和转移量约束、碳排放逐时累计约束以及各类平衡约束。每加一类约束模型结果可能就会发生质变所以建议一次性把约束建完整不要边建边试否则排查问题的时间会成倍增加。4. 典型场景算例碳价和需求响应参与度的影响4.1 算例设置与基础数据为了把前面讲的模型落地我用一个典型的园区综合能源系统做算例分析。系统设备包括一台1000千瓦燃气轮机、一台800千瓦燃气锅炉、一套500千瓦/1000千瓦时光伏、一套200千瓦/400千瓦时电储能以及热储能系统。电负荷峰值约1800千瓦热负荷峰值约900千瓦均采用夏季典型日曲线。分时电价设定为峰时段10:00-15:00和18:00-21:00电价1.2元/千瓦时平时段0.8元/千瓦时谷时段23:00-次日7:00电价0.4元/千瓦时。天然气价格按2.8元/立方米计。电网碳排放因子取0.55千克/千瓦时天然气碳排放因子按2.0千克/立方米折算。碳配额按系统满足原始负荷所对应的基准排放量打折设定基准情景下配额总排放的90%发放。需求响应参数方面可削减负荷比例设为原始负荷的10%削减补偿单价为1.0元/千瓦时。可转移负荷比例设为10%假设高峰时段10:00-15:00和18:00-21:00的负荷可转移到谷时段。4.2 不同碳价下的运行结果对比先看不加需求响应、只有碳机制的情景碳价分别取0、100、200元/吨运行结果如下表。碳价元/吨系统购电量千瓦时燃气轮机发电量千瓦时总碳排放吨总运行成本元0860084009.5228200100720092008.8630550200640098008.4232780碳价从0升到200元/吨的过程中系统购电量从8600千瓦时降到6400千瓦时燃气轮机发电量则从8400千瓦时升到9800千瓦时。表面上看似乎矛盾——碳价升高应该增加清洁能源出力怎么反而多用了天然气这里的关键在于电网购电的碳排放因子和天然气发电碳排放强度之间的相对关系。按0.55千克/千瓦时的电网排放因子和2.0千克/立方米的天然气排放因子折算实际上一度电对应约0.9千克碳排放高于电网购电的0.55千克。所以碳价升高时系统反而会减少自发电、增加购电把碳排放压力转嫁给电网侧。这说明了一个重要问题碳机制对优化运行的引导方向完全取决于电网排放因子的取值。如果项目所在地区电网排放因子很低比如水电资源丰富的地区那么最优策略就是尽量购电少自发电。如果电网排放因子高且碳价高系统就会倾向于本地清洁能源发电。做方案时一定要算清楚这个交叉点不能凭直觉拍脑袋。4.3 需求响应参与度对系统运行的影响在碳价100元/吨的基础上增加需求响应可削减比例从0%逐步提高到20%结果如下表。可削减负荷比例峰值负荷千瓦峰谷差千瓦购电成本元需求响应补偿元总成本元0%1800820576003055010%1680710532016803015020%15606204860336029640可以看到随着可削减负荷比例提升系统峰值负荷明显下降峰谷差从820千瓦压缩到620千瓦购电成本逐步减少。但由于需要向用户支付补偿费用总成本下降幅度有限从30550元降到29640元降幅约3%。这说明需求响应不是免费的“削峰神器”它本质上是拿补偿成本换系统设备的利用率优化。实际项目中判断需求响应是否值得投入要用总成本说话而不是只看削峰效果。如果补偿单价过高总成本反而可能上升这种时候需求响应就不具备经济性。5. 实操中的坑与排查思路5.1 数据口径不统一碳排放因子选错全盘皆输做这类项目最容易踩的坑是碳排放因子的口径不一致。不同来源的数据基准年份不同有的基于全国平均有的基于区域电网有的把输配电损耗也算进去了有的没有。如果不加甄别直接用模型输出的最优化方案可能完全失去工程参考价值。我现在的做法是动工之前先建一张数据基准表逐项确认每个数据的来源和适用边界。电网排放因子注明是哪个地区、哪个年份的数据天然气排放因子的高低位热值口径也写清楚。这一步看起来麻烦但能省掉后面返工的大量时间。5.2 模型求解时间过长先降维度再上加速器综合能源系统模型的时段数如果取到96个点或更多加上需求响应的时间耦合约束MILP的求解规模会迅速膨胀。我遇到过求解时间超过半小时还不出最优解的情况根本没法用于方案比选。我的处理手段按优先级排序是这样先用预求解让求解器自动精简模型检查是否存在冗余约束再把不明显影响结果的时间尺度拉长比如把15分钟粒度合并成小时粒度最后才会考虑加分解算法或使用求解器的高级参数比如设定MIP gap容忍度到1%或2%。对工程方案论证来说1%的误差完全在可接受范围内没必要追求无限精确。5.3 结果不合理时的排查套路跑出来的结果不符合物理直觉时不要急着改模型先做三件事。第一检查每个时段的能量平衡约束是否满足把逐时出力、购能、储能变化列成表格逐个时段对账。第二检查目标函数里各项的正负号特别是碳成本为负时要确认是因为配额盈余还是因为某个符号写反了。第三把碳价设为0、需求响应关闭跑一遍基准场景看看模型是否退化成了普通的成本优化问题——如果基准场景都不对那就说明模型框架有问题。我遇到过一次特别诡异的情况模型结果中储能系统几乎不工作但储能明明能通过低充高放来套利。排查了半天才发现是储能SOC的初末相等约束漏写了导致模型可以“白嫖”初始电量把它全放完来降低成本。这种低级错误没有系统的排查流程真的很难发现。还有一个高频问题是需求响应基线负荷的选取。很多项目直接拿原始负荷减去削减量作为削减后的负荷却忘了可转移负荷要满足总量守恒结果优化出来的方案等效于凭空消灭了电量。给需求响应加一个当日总用电量守恒约束这个问题就能避免。这些坑基本上都是我在实际项目里一个个踩过来的。每个坑翻车的时候都觉得疼但调顺之后再看整个碳机制加需求响应的优化框架其实特别清晰碳机制给系统一个明确的减排信号需求响应给负荷侧一个灵活的调节能力优化模型负责在两者之间找到那个最经济的平衡点。只要数据口径、约束条件和参数设置不出偏差算出来的调度方案就能真正落地执行。