☰
综合能源系统优化调度实战:Cplex求解冷热电联供与碳交易模型
2026/10/18 10:50:31 网站建设 项目流程

做综合能源系统优化的朋友,对这个方向肯定不陌生。冷、热、电、气四类能量在园区或建筑层面耦合起来,燃气轮机发电、余热回收制冷制热、不足的部分用电或燃气补充,再叠加上需求响应和碳交易这两个市场化机制——这基本就是当前综合能源系统优化研究的标准配置。题目标题里的“采用Cplex求解”,则是这个领域最常见的落地方式:把系统建模成一个混合整数线性规划问题,交给商业求解器去算最优调度计划。

这篇文章,我把自己做这类项目的完整思路、建模细节、求解技巧和踩坑记录整理出来。准备做类似方向毕业设计、科研项目,或者在实际园区里搞过能源调度、想系统了解模型写法的朋友,可以直接照这个框架去搭。整个研究的内核可以概括成一句话:在满足冷、热、电、气负荷需求的前提下,考虑用户侧可调节的响应能力,以及碳排放配额和碳价带来的成本信号,以总费用最小为目标,求解未来24小时(或更长时间尺度)内各设备的出力计划。别看这句话简单,真把模型写出来、让Cplex稳定求出结果、再让结果能讲出道理,每一步都有不少细节。

1. 先搞清楚这个研究到底在算什么

1.1 四联供系统到底长什么样

所谓四联供,是指系统同时供应冷、热、电、气四种能量形式。注意这个“气”有两层含义:一是天然气作为燃料输入,驱动燃气轮机和燃气锅炉;二是某些场景下天然气本身也会直接供给用户(比如餐饮用气、工业用气),不过绝大多数优化研究中,气主要作为燃料侧出现,实际优化变量是“买多少气”以及“气如何分配给不同设备”。

典型场景我习惯拿一个综合园区举例。园区里有办公楼、实验室、食堂,可能还有小型数据中心。楼宇有电负荷、冬季有热负荷、夏季有冷负荷。能源站里装了一台燃气轮机,烧天然气发电,发电的同时产生高温烟气,通过余热锅炉回收变成蒸汽或热水。这部分余热一部分直接供热,一部分进入吸收式制冷机变成冷水供冷。如果余热不够,就用燃气锅炉补热,或者用电制冷机补冷。电不够就从电网买电,电多了也能反售给电网。再加上电储能、蓄热罐、蓄冷罐,整个系统的能量流动网络就成型了。

这个构型为什么流行?因为它抓住了联供系统最核心的经济逻辑:燃气轮机发一度电大约产生1.5到2.5倍于发电量的余热,这些余热如果不利用就直接排掉了;利用起来制冷或供热,替代了原本要用天然气或电去产生的冷热量,综合能源利用效率可以大幅提升。优化的本质,就是在不同时段、不同价格信号下,决定每一度气是“先发电再用热”更划算,还是“直接烧锅炉”更划算。

1.2 需求响应和碳交易为什么会改变调度结果

很多人一开始想不明白:没有需求响应和碳交易,系统已经能优化了,加上这两个机制到底改变了什么?

先看需求响应。传统优化把负荷当成刚性数据,空调该开多少就是多少,电梯该跑就跑。但实际上楼宇负荷有相当大的柔性。夏天最热的时候,办公室空调温度从24度调到26度,人的体感变化不大,但冷负荷能降下去一块;工厂里某些可中断工序,被通知后在高峰时段停一小时,补偿一点费用给用户,电网削峰效果立竿见影。需求响应引入后,负荷从“不可动”变成了“可削、可移、可调”,这等于给优化问题增加了新的自由度。优化的结果会倾向于在电价高的时段削减或转移用电,在碳价和电价叠加的尖峰时段更加明显。

再看碳交易。传统优化只算经济账,烧多少气、买多少电,乘以价格就行。碳交易加入后,碳排放本身变成了一项有价格的“资源”。免费配额就像政府发的“碳排放额度信用卡”,实际排放一旦超过额度,就得去碳市场买配额;低于额度,富余的配额可以卖钱。于是燃气轮机什么时候开、开多少,不再只看气价和电价,还要看天然气燃烧产生的碳排放成本,以及从电网购电对应的间接排放成本。当碳价升高时,系统可能倾向于减少低效机组的出力,或者调整天然气和电网购电的比例。这正是碳交易机制发挥减排引导作用的具体体现。

1.3 研究路线总览

按我自己的经验,这类研究的标准路线分四步走。第一步,搭系统架构,确定设备类型、容量、效率参数,明确能量流动方向;第二步,数学建模,写目标函数和约束条件,本质是把物理规律和经济规则翻译成数学表达式;第三步,求解分析,用Cplex等求解器计算最优调度方案;第四步,对比讨论,设置不同场景(比如无需求响应、有需求响应、有碳交易、两者都有)做对照实验,观察系统运行成本、碳排放量、设备出力结构的变化规律。整条路线看起来简单,但每一步的细节决定成败,接下来逐项拆开讲。

2. 系统建模:从设备到约束的完整拆解

2.1 参考系统架构与设备配置

建模之前先定义物理系统。我常用的参考架构包含一条燃气轮机联供主线,一套补燃/补冷设备,再加上储能和电网交互。设备清单和关键参数如下表所示,供你搭模型时参考。

设备输入能量输出能量关键参数典型取值范围
燃气轮机天然气电 + 高温烟气发电效率、热电比发电效率30%-40%,热电比1.2-2.0
余热锅炉高温烟气热余热回收效率80%-90%
吸收式制冷机热冷COP0.7-1.3
电制冷机电冷COP3.0-5.5
燃气锅炉天然气热热效率85%-95%
电储能电电充放效率、SOC范围效率90%-95%,SOC限值20%-90%
蓄热罐/蓄冷罐热/冷热/冷储放效率、容量效率90%左右
电网交互电电购电价、售电价分时电价曲线

建模时燃气轮机我习惯简化成一个“电出力变量 + 余热出力变量”的耦合关系:燃气轮机烧气产生电和热,热电比通常近似看作常数,余热量等于发电功率乘以热电比。这个简化在项目初期完全够用,等学位论文需要精细化时,再改成随负载率变化的非线性效率曲线。

2.2 能量平衡约束:四个母线的写法

整个优化模型的核心是四个能量平衡方程,分别对应电、热、冷、气四条“母线”。每条母线代表一个能量节点,所有注入该节点的能量之和等于所有流出该节点的能量之和。以24小时调度周期为例,每个时段t都要满足:

  • 电平衡:燃气轮机发电 + 光伏发电 + 电网购电 + 储能放电 = 电负荷 - 需求响应削减 + 电制冷机用电 + 电网售电 + 储能充电
  • 热平衡:余热回收 + 燃气锅炉产热 + 蓄热罐放热 = 热负荷 - 需求响应削减 + 蓄热罐充热
  • 冷平衡:吸收式制冷 + 电制冷 + 蓄冷罐放冷 = 冷负荷 - 需求响应削减 + 蓄冷罐充冷
  • 气平衡:购入天然气 = 燃气轮机耗气 + 燃气锅炉耗气 +(可选)直接供气负荷

写这些方程时有三个容易踩的坑。第一个是单位统一,热负荷和冷负荷有的用kW,有的用GJ/h,混着用必出错,建模之前先统一成kW。第二个是方向约定,储能充电是负荷、放电是电源,代入平衡方程时正负号要一致。第三个是“同时性”问题,电网不能同一时刻既大量购电又大量售电,热网里蓄热罐也不能同时充放,这些需要用0-1变量加互斥约束来限制,否则求解器会给出一看不合理但数学上“最优”的出工结果。

2.3 设备运行约束:启停、爬坡与储能动态

能量平衡只是物理定律的约束,设备本身还有运行限制。燃气轮机和燃气锅炉存在最小技术出力,不能低于额定容量的某个比例(比如不能低于30%);机组启停是0-1决策变量,停机时段不耗气不产能量;相邻时段出力变化受爬坡速率限制,不能从零直接蹦到满负荷。

储能设备要加状态递推约束:当前时段的储能量等于上一时段储能量,加上本时段充入量乘以充电效率,减去本时段放出量除以放电效率。同时储能容量有上下限,充放电功率也有上限。这里要强调一个细节:储能SOC的初始值怎么设。我建议取调度周期首尾SOC相等,也就是“日循环约束”,这样结果更具工程参考意义,否则模型会把初始储存的能量免费用光,导致结果偏乐观。具体写法就是SOC(0)=SOC(24),让一个调度周期内充进去的总能量和放出来的总能量在效率修正后相等。

2.4 综合需求响应怎么建模

题目里“综合”两个字,意味着需求响应不只管电力负荷,冷、热、电三种负荷都要纳入响应范围。这也是很多初学朋友最容易漏掉的部分。

电力需求响应相对成熟,两种基本形式:可削减负荷与可转移负荷。可削减负荷就是高峰时段直接砍掉一部分用电,用户获得补偿;可转移负荷(比如某些生产工序、洗衣房、充电桩)可以把用电量平移到其他时段,但一天内总用电量守恒。建模时可削减量不能超过负荷的一定比例,可转移量要满足“移出的量等于移入的量”这一守恒约束。

热力需求响应和冷需求响应很少被仔细讲,但恰恰是综合能源系统里最有意思的部分。供热系统本身有巨大的热惯性,房间温度在一定范围内变化用户感知不强,所以热负荷可以在允许范围内上调或下调,只要保证时段总供热量不低于最低舒适阈值即可。冷负荷同理,但冷响应更适合用“预冷策略”表达:电价低谷时段提前多供冷,把建筑物或蓄冷罐的冷量存起来,电价高峰时段少供冷甚至不供冷,实现“移峰填谷”。写模型时,热/冷负荷响应可以建模成负荷值在上下限区间内连续可调,而不是简单的0-1削减。这样处理更贴近实际,也给求解器提供了连续调整空间,优化效果更平滑。

2.5 碳交易机制怎么进模型

碳交易建模分三块:配额怎么给、实际排放怎么算、交易成本怎么进目标函数。

配额分配最常见的是基准线法,即以历史强度或区域基准值为准,给系统一个免费排放额度。额度可以表示成与负荷水平挂钩的线性函数,也可以直接给一个固定常数。固定配额的好处是形式简单,便于做灵敏度分析。我实际做的时候更推荐固定配额,先跑出无碳交易时的最优排放量,再反设一个比它低5%-10%的配额,模拟“逐步收紧”的政策环境,这样故事线更完整。

实际排放核算覆盖两个碳排放源:一是天然气燃烧的直接排放,包括燃气轮机和燃气锅炉;二是从电网购电对应的间接排放。直接排放等于耗气量乘以天然气碳排放因子;间接排放等于购电量乘以电网平均碳排放因子。注意,通过电网反售出去的电量对应的排放是负的,从总排放中扣除,否则会高估系统碳责任。

碳交易成本等于(实际排放量 - 免费配额)乘以碳价。实际排放小于配额时,这项是负值,相当于卖配额获利;大于配额时是正值,变成额外的运行成本。碳价可以设固定值,也可以设阶梯价格模拟碳价上涨,阶梯会引入整数变量,模型规模会增大,前期建议先用固定碳价,后期做价格灵敏度扫描时再考虑阶梯。

2.6 目标函数与线性化处理

目标函数是所有决策者最关心的部分,我通常写成:

min ∑ [ 购气费用 + 购电费用 - 售电收入 + 需求响应补偿费用 + 碳交易成本 ]

其中购气费用等于总耗气量乘以天然气价格;购电费用是电网购电量乘以分时电价;售电收入是反售电量乘以上网电价;需求响应补偿是削减或转移的负荷量乘以补偿单价;碳交易成本按上一节方式计算。光伏发电成本通常忽略或按度电成本计入,储能折旧成本可以在目标函数里加一个很小的单位损耗系数,让模型自动减少无效充放循环。

写模型时容易碰到非线性项,最常见的三个:燃气轮机发电效率随负载率变化导致产气量与出力的非线性关系、阶梯碳价导致的分段线性成本、需求响应补偿价格分档。Cplex本身支持二次约束和二次目标,但混合整数二次规划求解速度明显慢于线性规划。我的经验是:项目前期全部线性化,把效率曲线用分段线性逼近,把阶梯价格用大M法转成线性约束。这样模型就是一个标准的MILP,Cplex求解稳定、速度快、调试方便。等后续想提升精度,再逐步把非线性项加回去对比效果。

3. 用Cplex求解:从建模到出结果的完整流程

3.1 先确认问题类型

写代码之前,先判断自己手里拿的是什么样的优化问题。上面的模型带有0-1整数变量(机组启停、充放互斥),目标函数和约束都是线性的,所以这是典型的混合整数线性规划MILP。Cplex最擅长的就是这类问题。如果去掉整数变量,退化成LP,求解会快一个数量级,但会失去启停逻辑的刻画能力。

实际写模型时,我会把变量分成三类:连续变量(各设备出力、储能充放功率、购售电量)、0-1整数变量(设备启停、储能状态、购售电状态)、辅助变量(大M法产生的中间量)。分类清楚之后,再去写约束和目标函数据,思路会清晰很多,也方便后续查错。

3.2 数据准备与表格规范

求解之前先整理数据。时序数据包括24小时电负荷预测、热负荷预测、冷负荷预测、分时购电价、上网电价、天然气价格。价格型参数包括碳价、需求响应补偿单价、各设备效率、容量限值。

我的习惯是用Excel或CSV统一存数据,在建模脚本里一次性读取并赋值给参数结构体。注意校验负荷数据的数量级,比如某栋楼的电负荷峰值是几百千瓦还是几兆瓦,直接决定了设备容量参数怎么设。数据错误是模型不可行最常见的原因,没有之一。调模型之前先把每条数据曲线画出来看一眼,比花几个小时查约束高效得多。

3.3 核心代码框架

我习惯用Matlab加Yalmip调Cplex,开发效率高,调试方便。核心代码框架如下,你可以直接参考。这里只展示关键片段,完整模型按前面章节的约束逐个添加即可。

% 参数定义(示例) T = 24; % 调度周期 P_gt_max = 2000; % 燃气轮机最大电出力,kW P_gt_min = 600; % 最小技术出力,kW R_gt = 800; % 爬坡速率上限,kW/h eta_gt = 0.33; % 发电效率 alpha_chp = 1.5; % 热电比 eta_gb = 0.9; % 燃气锅炉效率 cop_ec = 4.0; % 电制冷COP cop_ac = 1.0; % 吸收式制冷COP % 决策变量 P_gt = sdpvar(1, T); % 燃气轮机发电功率 Q_gb = sdpvar(1, T); % 燃气锅炉产热 P_ec = sdpvar(1, T); % 电制冷机耗电 Q_ac = sdpvar(1, T); % 吸收式制冷耗热 P_buy = sdpvar(1, T); % 电网购电 P_sell = sdpvar(1, T); % 电网售电 u_gt = binvar(1, T); % 燃气轮机启停 u_buy = binvar(1, T); % 购电状态 u_sell = binvar(1, T); % 售电状态 % 储能变量略(类似SOC递推和充放功率定义) % 约束条件 C = []; C = [C, P_gt_min * u_gt <= P_gt <= P_gt_max * u_gt]; C = [C, abs(P_gt(2:T) - P_gt(1:T-1)) <= R_gt]; C = [C, u_buy + u_sell <= 1]; % 购售电互斥 % 电平衡约束 C = [C, P_gt + P_pv + P_buy + P_bat_dis == P_load - P_dr + P_ec + P_sell + P_bat_ch]; % 热平衡约束 C = [C, alpha_chp * P_gt + Q_gb + Q_hs_dis == Q_load - Q_dr + Q_hs_ch]; % 冷平衡约束 C = [C, cop_ac * Q_ac + cop_ec * P_ec + Q_cs_dis == C_load - C_dr + Q_cs_ch]; % 目标函数 F_gas_total = P_gt / eta_gt * 1 / 10.55 + Q_gb / eta_gb * 1 / 10.55; % 折算成kW天然气耗量(简化式) Objective = sum(F_gas_total * price_gas + P_buy .* price_buy - P_sell .* price_sell ... + P_dr * price_dr + carbon_cost); % 求解 ops = sdpsettings('solver', 'cplex', 'verbose', 2); ops.cplex.mip.tolerances.mipgap = 0.001; ops.cplex.timelimit = 600; ops.cplex.threads = 8; optimize(C, Objective, ops);

代码里的天然气折算公式是高度简化的示意,实际建模时通过“输入燃料量 = 输出电功率 / 发电效率”的关系还原耗气量,再乘天然气低热值统一到kW单位。

3.4 Cplex参数调优

Cplex开箱即用能解大多数中小规模模型,但遇到大规模场景(比如8760小时全年调度、几百个0-1变量)就得调参数。我常用四个关键参数:

  • mipgap:混合整数规划的相对间隙容忍度。默认0.0001,即要求解的目标值与下界差距小于0.01%。对大多数工程分析,设到0.001-0.005就足够,可以明显缩短求解时间。
  • timelimit:最长求解时间,防止模型陷入长时间搜索。我一般设300到600秒,到点取当前最优可行解。
  • threads:并行线程数。新机器核心多,设成8到16能有效加速分支定界过程。
  • mip.strategy / nodefile:问题太大会吃满内存,需要开节点文件缓存,把部分分支树放到硬盘上。这时候求解变慢是正常的,属于拿时间换空间。

参数调优要遵循“先保证可行、再追求最优”的原则。先把mipgap调松,确认模型能在一个合理时间内给出可行解,再逐步收紧看最优解的变化。如果收紧gap后目标几乎不变,说明当前精度已经够用,再往下调只是浪费计算时间。

3.5 结果输出与对比分析

求解完成后,把关键结果全部导出并作图:各设备逐时出力柱状图、购售电曲线、储能SOC曲线、需求响应量曲线、碳配额与排放量对比图。这些图不仅是论文素材,更是验证模型正确性的工具。

我习惯做三组对照实验。第一组是基础场景,不加入需求响应和碳交易,得到传统调度结果;第二组只加需求响应;第三组同时加需求响应和碳交易。对比三组的总运行成本、总碳排放量和设备出力结构,能够清晰看出两个机制各自的贡献。再加一组碳价灵敏度分析:把碳价从20元/吨扫到200元/吨,观察系统碳排放变化和设备出力调整,这种结果非常出效果,审稿人和答辩老师都爱看。

4. 求解器选型与模型收敛性优化

4.1 Cplex、Gurobi、开源求解器怎么选

综合能源优化领域用到的主流求解器各有特点,我列一个实际对比:

求解器类型许可方式MILP性能建模友好度适用场景
Cplex商业学术免费/商用收费极强高,支持多种建模工具大规模MILP,标准选择
Gurobi商业学术免费/商用收费极强,部分场景略优于Cplex高大规模MILP,性能敏感场景
SCIP开源免费较强中预算有限的学术项目
CBC开源免费中等中中小规模教学示例
OSQP开源免费只支持QP中纯二次规划场景

Cplex的优势在于行业二十多年的积累,求解器稳定性好,对MILP的分支定界和割平面算法非常成熟,并且支持MATLAB、Python、C++多种接口。我用Yalmip调Cplex时,连求解器内部参数都可以直接透传修改,非常方便。Gurobi在某些纯整数问题上会更快一点,但两者在中小规模综合能源模型上的差距不明显。真到百万级变量的大规模问题,才需要认真对比选型。

4.2 模型规模膨胀的根源与削减技巧

综合能源模型规模膨胀主要来自三方面:时间步长细分(15分钟一个时段)、设备数量增加、0-1变量激增。一个包含10台设备、24小时、每台设备平均2个0-1变量的模型,整数变量也就几百个,Cplex秒解;但如果做全年8760小时调度,变量直接膨胀到百万级别,求解时间呈指数增长。

控制规模的技巧有几个。一是时间聚合:用典型日代替全年逐时数据,比如选夏季典型日、冬季典型日、过渡季典型日,各跑24小时调度,再按天数加权汇总,能极大缩减模型规模。二是合并冗余约束:购售电互斥本质上只需要一个0-1变量,如果系统不允许同时购售电,完全可以去掉互斥0-1变量,只用“购电量×售电量=0”的非线性约束或者干脆强制二者之一为零,减少整数变量个数。三是删掉无效候选状态:夜间冷负荷接近于零时,电制冷机和吸收式制冷机的最大出力直接限掉,剪掉大量无意义的组合空间。

5. 常见问题与排查实录

5.1 模型不可行怎么定位

Cplex返回不可行时,第一反应不要怀疑求解器,先怀疑自己的约束。我的排查顺序是:先检查负荷数据各时段是否齐全,再检查能量平衡方向是否写反(最容易出错的是储能SOC递推的正负号),然后检查容量限值是否小于负荷峰值(比如蓄热罐容量设小了,热平衡永远凑不平),最后检查互斥约束是否过强(比如某时段要求既满足电平衡又要求购售电互斥,结果没有可行解,说明约束矛盾)。Yalmip里可以用求不可行约束集合的功能(通过“%#ok”注释对比约束),逐个放松约束定位问题源。

5.2 求解慢、长时间不收敛

模型卡住最直观的原因是0-1变量组合空间太大。先用上一节的规模削减技巧压缩模型,再把mipgap放宽到0.005看看能不能快速得到一个可行解。如果连可行解都找不到,说明初始下界很差,可以让求解器先生成一个热启动解:先固定机组启停变量为经验值,解一个纯LP问题,再把这个解作为MIP的热启动初始解,通常能大幅提升搜索效率。

5.3 结果出现同时购电和售电

在分时电价有峰谷差时,同时购电和售电表面上看很奇怪,但因为存在储能设备,模型有时会给出“低谷买电充电、高峰放电同时售电”的套利策略,这时同时购售电是合理的。真正不合理的是同一时段既大量购电又大量售电且没有储能参与,这通常说明互斥约束写漏了,或者目标函数里售电价大于购电价导致无限套利。遇到这种结果,先把时段和能量去向查一遍,再检查互斥约束是否完整。

5.4 碳交易参数影响结果异常

碳价升高后,系统碳排放总量不一定单调下降。原因在于系统同时存在多个碳排来源,燃气轮机虽然排碳,但余热利用替代了燃气锅炉和电制冷机的耗能,整体系统碳排放可能反而降低。所以碳价升高可能导致燃气轮机多发电,反而增加了一部分排放。这不是模型错误,而是联供系统的真实特征:碳排放和电力市场化激励存在耦合,分析结果时必须结合设备出力结构来解释,不能只看总量曲线。做碳价灵敏度时,把燃气轮机出力、电网购电量、燃气锅炉产热量三条曲线一起画出来,碳价影响一目了然。

5.5 常见问题速查表

问题现象可能原因解决措施
模型不可行负荷数据错误或约束方向写反逐条检查能量平衡方程,检查数据单位
求解极慢0-1变量过多、big-M取值过大压缩整数变量、收紧M值、放宽mipgap
同时购售电互斥约束缺失或储能套利策略添加购售电互斥,检查储能充放逻辑
目标函数为负且离谱售电价高于购电价,模型无限套利检查价格参数,添加电量买卖约束
储能首时段即放完缺少日循环约束加入SOC初始等于末尾的约束
碳价升高但排放反升联供系统结构特性,非模型错误结合设备出力曲线解释,补充对照场景

最后再分享一点个人经验

这类研究做到最后,真正有价值的往往不是那一张最优解表格,而是对系统运行规律的理解。Cplex求解器只是工具,它能在0.1秒内给出一个数学上的最优解,但判断这个解是否符合实际、是否满足物理直觉、是否能在真实系统里落地,还是得靠人。我做综合能源模型踩过最深的坑,就是过于相信求解结果,直到把某一天的调度曲线逐条核对了几个小时,才发现是燃气轮机的热电比参数少了一个零。从此之后,每跑完一组结果,第一件事一定是画图、看图、问三个问题:设备出力是否在合理区间?储能是否有异常充放?购售电行为是否与市场价格信号一致?这三个问题过滤掉90%的模型错误。

如果你正准备开这个方向的研究,建议从一个小规模系统做起,设备控制在3到5台,时间尺度先做24小时,把模型跑通跑顺,再逐步扩展。建模本身没有太多玄学,关键是物理逻辑清楚、数学表达准确、求解结果可解释。做到这三点,这套框架无论是继续深入做全年优化、做不确定性鲁棒优化,还是扩展到多园区协同,都会很顺手。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询