很多做综合能源系统研究的朋友,第一步接触的往往就是“多区域综合能源系统热网建模及系统运行优化”这类题目。标题看着不复杂,但真正动手做起来,尤其是用Matlab复现EI论文里的模型时,你会发现坑远比想象中多。我大概花了三周时间,从读论文到跑通第一个完整算例,中间推翻了两版代码,才把整个流程理顺。这篇文章就把我复现这条路完整记录下来,包括热网模型怎么建、优化问题怎么解、以及那些论文里根本没写但代码里绕不开的细节。如果你正准备做类似的复现工作,或者正在为“多区域IES优化调度”头疼,这篇文章应该能帮你少走不少弯路。
1. 多区域综合能源系统里,热网建模为什么是最容易“翻车”的一环
1.1 单区域与多区域的本质差异:从“点模型”到“网络模型”
先说一个很多新手都没想清楚的问题:为什么单区域综合能源系统里,热网只是一个“设备”,而到了多区域系统里,热网就变成了一套需要专门建模的“网络”?
单区域系统里,热力网往往被简化成一个热源节点加一个负荷节点,中间的热网管道用一个固定效率或者一个传输延时来表示,目的是把CHP机组或者燃气锅炉产生的热量送到建筑负荷侧。这种“点对点”的模型,本质上不需要管网拓扑,也不需要计算管段里的水力平衡和热力损失。可一旦涉及多个区域的互联,热网就承担了一个新的角色——它不再只是“传输通道”,而是一个在不同区域之间分配热能、具备动态延迟特性的中间层。
拿我复现的那个系统来说,三个区域的热负荷特性差别很大:居民区早高峰和晚高峰明显,办公区白天平稳、夜间几乎为零,工业区则是全天高负荷且波动小。如果把这些区域简单拼成一个节点,共享一根热水管道,调度的结果必然会出问题——因为热能不像电能那样可以瞬时平衡,热水从源侧走到负荷侧需要时间,热量的传递还受到管壁散热的影响。多区域的本质,是让每个区域保留自己的负荷特性和源侧配置,同时通过管网让区域之间具备“富余热量互相支援”的能力。要实现这一点,热网就必须作为一个有拓扑、有参数、有约束的独立模型进入优化框架。
这也解释了为什么很多复现工作卡在第一步:不是优化算法不会写,而是热网模型压根没有建立起来,导致后续所有“区域间调度”的结论都建立在错误的基础上。所以做复现,第一件事不是打开Matlab写代码,而是先把热网模型放在全局框架里想清楚。
1.2 热网模型在水-电-气耦合中的位置与交互关系
多区域综合能源系统的魅力,在于多种能源形式之间的耦合。电、气、热,三种能源各有各的物理特性:电网用线路传输,准瞬时平衡;气网用管道传输,有管存和压力约束;热网用热水或蒸汽传输,有延时和损耗。在这三者中,热网常常是最“迟钝”的——它的动态响应速度最慢,但这种迟钝恰恰让它成为系统柔性调节的关键缓冲。
在我的复现模型里,热网与电网的交互主要体现在CHP机组上:CHP的“以热定电”特性,让电力出力和热力出力强耦合。热网与气网的交互则体现在燃气锅炉和燃气轮机:气网为这些设备供燃料,而热网把这部分热量送出。电-气-热三个网络站各自有自己的平衡方程,但设备层面的耦合约束才是它们之间真正“咬合”的地方。这就引出一个建模时的重要判断:热网模型不能孤立地建,它必须同时接收来自电源侧、气源侧和负荷侧三条线的输入信号。
一个很典型的现象是,在优化模型里,热网的供水温度和回水温度会同时影响CHP机组的电出力上限和热出力上限。如果热网模型过于粗糙,比如把供水温度直接设为常数,CHP的可行运行区间就会被算错,最终影响电功率分配。这些交互关系看似是优化问题的“外围条件”,实际上它们才是决定模型能否收敛、结果是否合理的核心。复现时一定要把设备模型和热网模型放在同一个层级建模,而不是“先建好热网再加设备”。
老实说,我第一次建多区域模型的时候,就想当然了:先搭好热网的物理模型,再把机组当成挂在节点上的“电源”,结果算出来的电出力曲线严重偏离预期,后来追踪了半天才发现是热网回水温度没和机组的抽气量形成联动。耦合关系这事,必须在一开始就放进约束方程组,而不是最后“意思一下”加进去。
1.3 从EI论文到Matlab代码:信息损耗最严重的三个环节
EI论文的复现,难就难在论文里写的是“模型思想”,而代码需要的是“具体实现”。我总结了从论文到代码过程中,信息损耗最严重的三个环节,也是复现者最需要警惕的地方。
第一个环节是参数表。论文里的参数表通常只给范围不给具体值,比如“管道的传热系数在0.8~1.2 W/(m·K)之间”,但你的仿真必须用一个确定值。这一环出问题,会导致整个系统的热损失计算偏离基准算例。我的做法是:把所有找不到具体值的参数集中列成一张待定表,然后用论文中的基准案例结果进行反推和校准。反推结果和论文给出的某一典型日运行结果对不上,就说明参数取值方向错了。
第二个环节是变量维度的对齐。论文里描述的是数学公式,比如公式里的一个下标可能囊括了时间、节点、管道等多个维度,但Matlab编程时矩阵的维度必须严格匹配。我踩过的坑是,论文里写的是“节点热功率平衡”,我把所有节点序列化成矩阵后,忘了某个节点的热源接入位置,导致矩阵运算结果相差了一个数量级却毫无报错。这种维度错误不报错、不提示,隐蔽性极强。
第三个环节是时域离散方式。论文常常用连续时间域描述动态,但代码里只支持离散时间步。热网的动态延时用多少个时间步长来近似,直接关系到计算效率和精度。很多复现代码其实是在这一步“失效”的——表面上看优化问题有解,但热网的动态过程被过度简化,失去了“多区域”的意义。
2. 复现前的数学建模准备:状态量与参数表,一切先于代码的工作
2.1 管网拓扑矩阵化的两种表示方式及选取原则
我一开始就强调,热网模型是全局模型的骨架,而骨架的搭建从管网拓扑开始。Matlab里描述管网拓扑,常见的路子有两条:一条是用节点-支路关联矩阵,一条是用Matlab自带的graph对象。对于复现EI论文的场景,我强烈建议用关联矩阵。
为什么?因为关联矩阵天然和优化模型兼容。优化问题最终要转成矩阵形式的约束条件,比如节点平衡方程 A·f = q,其中A是节点-支路关联矩阵,f是支路流量向量,q是节点注入向量。这种表达在标准优化建模工具(比如Yalmip)里可以直接使用,几乎不需要额外转换。而graph对象更适合路径分析、网络遍历这类图算法,把它塞进优化框架会非常别扭。
具体做法是:先画一张管网拓扑图,确认管段编号和节点编号,再构建一个维度为 [节点数 × 支路数] 的矩阵,每条支路在起点处记1、终点处记-1。值得注意的是,供热管网和回水管网要分别建立关联矩阵,因为热水从热源出发,经供水管到达负荷,再从回水管流回热源,这是一个完整的环路。我在复现时把供水和回水当成两个独立网络分别建模,只在热源设备和负荷设备处通过换热量耦合,这样逻辑最清晰,也避免管网矩阵混乱。
2.2 状态量的选取:温度、流量还是压力?
热网建模最终要落到一组状态变量上。很多初学者看论文时只盯着“供水温度”“回水温度”这两个量,实际建模时会发现,还要决定要不要引入质量流量、要不要算节点压力、甚至管段的流速限值是否要约束。不同的状态量组合,决定了模型的复杂度从线性到非线性跨越多少。
我的建议是分层考虑:水利平衡层压力不必作为优化变量,因为热网的流量分配通常由泵的扬程-流量特性决定,在慢时间尺度的调度模型里可以简化为流量守恒方程;但温度场必须作为核心状态量,因为它直接关联到热负荷满足度和热网管存。质量流量则要作为变量保留,因为它是连接热功率和温度差的桥梁:Q = m·c·ΔT,m是流量,c是比热容,ΔT是供回水温差。
还有一个容易忽略的状态量——热网管道的“热储能”。热水管存相当于储热罐,温度变化会导致管道内存有的热量增减。多区域的互补调度里,这个特性非常有价值:一个区域的富余热功率可以“存入”管道,延迟到另一个时段被负荷取出。论文里经常把这个叫“热网动态特性”或“虚拟储热”,但在代码里必须用温度节点方程显式建模,否则这部分柔性能力是体现不出来的。
2.3 参数校准的闭环逻辑:从论文结果反推未知参数
我在1.3里提到了参数校准,这里展开说下这个操作的完整逻辑。EI论文中给出的参数往往是经过合并、归一化的“等效参数”,并非原始物理参数。比如论文里写的“管道综合传热系数K=0.6 W/(m²·K),管道长度L=500m”,它实际上可能已经包含了保温层、土壤热阻的因素。如果你直接用基础传热学公式计算热损失,结果往往远大于论文中的数值,因为真实工程中有保温措施,论文数据是工程等效值。
我的校准方法是:先让模型跑一个“无优化”的基准场景——固定机组出力,给定固定热负荷,然后只需要算出热网损失这一项。拿这个结果和论文里的某一典型日热平衡表对比,如果偏差较大,就去调整管道综合传热系数、管道长度、供水温度设定档位,直到各项热损失的数值和论文在同一量级。这类似于机器学习里的“反向传播”,只不过梯度是用手动启发式调整的。这个步骤看似粗笨,却是复现工作里性价比最高的一步——参数一来,后续所有优化结果才有参考锚点。
3. 热网模型的Matlab实现:从节点法到变温度场
3.1 节点法方程组的构建细节
热网建模,在学术文献里有节点法、支路法、质调节/量调节等多种建模思路。对多区域IES而言,节点法最合适:它以管网节点为对象建立热平衡方程,把每个节点的混合温度和注入功率用等式联系。
核心方程是每个节点的热平衡:流出节点的热功率总和等于流入节点的热功率总和(忽略暂态效应时),或者考虑管存效应时,等式右边要加上节点的热量变化率。用离散时间表达的话,我会写成:
m_in·c·T_in - m_out·c·T_out + Q_source = Q_load + Q_loss
这个式子里,m_in和m_out是进出节点的质量流量,T_in和T_out是对应的水温,Q_source是该节点连接的热源注入热功率,Q_load是热负荷,Q_loss是管段散热损失。
在Matlab里,我不会一个一个节点手写方程,而是把所有节点的方程写成矩阵形式,用一个for循环遍历所有节点,把每个节点的方程填充到稀疏矩阵的对应行。填充完成后,整个热网的热平衡约束就是一组线性等式约束(部分情况下是线性不等式,取决于温度上限),可以直接交给优化求解器处理。这个矩阵化过程是复现代码的核心部分,务必仔细检查关联矩阵的行列对齐。
3.2 供水温度与回水温度的迭代逻辑
热网模型最绕的地方,在于供水和回水温度并不是独立的。从热源出来的供水温度由热源设定,但回水温度由负荷侧的换热情况决定。换句话说,供水温度向前传播,回水温度由负荷“反射”回来。
具体实现时,我采用了两步迭代:先给定各节点的供水温度初值,计算换热站换热量,得出回水温度;然后用回水温度去反过来修正供水管网的散热损失。如此迭代,直到两次迭代的温差小于收敛阈值。请注意,这个迭代过程是嵌套在优化求解内部的,还是放在优化求解外用固定点迭代求解?论文里一般默认这是“模型”的一部分,但代码实现时,我建议把温度场的“动态演化”过程作为外部循环,优化求解器只负责在给定温度场下分配电、气、热出力。否则,温度作为变量进入优化模型会让原本的线性规划问题变成非线性规划,求解难度直接提升一个维度。
这种“温度场外迭代”的思路,工程上叫做“顺序求解”,很多IES运行优化的代码都是这么做的。缺点是牺牲了一点全局最优性,但换来了求解稳定性和速度,对复现工作来说是完全划算的。后面优化部分我会再细讲为什么这样做能让收敛性大幅改善。
3.3 热网延时特性的离散化处理
热网管道的水流速度有限(一般在0.5~2 m/s),热水从热源走到最远负荷可能需要几十分钟。在24小时优化调度的场景里,这个延时会显著影响热功率的供需平衡时序。有功功率可以瞬时响应,热功率却要“慢半拍”。
离散化处理时,我把管道延时折算成时间步长的整数倍:延时步数 = 管道长度 / (流速 × 时间步长)。比如一根800米的管道,流速1 m/s,时间步长取1小时,那么延时就是0.22个步长,取整之后可以忽略或者归并。但如果时间是15分钟一个步长,延时就是0.89步,接近1个步长,就必须在模型里体现。处理方法是在热平衡方程里引入一个“延时状态变量”——把上一时刻流入节点的热流量记录到当前时刻的节点热平衡中。
实际做下来,延时项的引入会让约束矩阵多出一个时间维度,代码复杂度上升,但是结果更真实。论文复现里如果没把延时写进去,多区域热网的互补调度意义会大打折扣——因为区域间的热能传输,恰恰是靠延时特性来实现“错峰互济”的。延时为零的热网,本质上还是可瞬时传输的“电网”,不是热网。
4. 系统运行优化求解链路:目标、约束与求解器选型
4.1 目标函数设计的三个层次
热网模型建好之后,接下来要做的就是把它放进运行优化的框架里。多区域IES运行优化的目标函数,我拆成三个层次来设计。
第一层是运行成本最小化。这是最核心的优化目标,包括购电费用、购气费用、设备启停费用等。供暖期间,热负荷占比大,这部分成本直接决定了整个系统的经济性。第二层是碳排放最小化。EI论文现在非常重视低碳调度,碳成本会以罚函数的形式进入目标函数。第三层是热网运行平稳性,比如供水温度波动惩罚、机组出力波动惩罚。这个目标通常以小的权重放在目标函数里,相当于正则化项,让解出来的方案不要过于“抖动”。
这三个层次的关键,是确定权重系数。我的做法是用“量纲归一化”来定权重:先把各目标的量纲换算成统一货币单位——运行成本是直接货币,碳排放按碳税折算成货币,平稳性按温度偏差的惩罚价格折算。这样目标函数里所有项都是“钱最多”的,权重系数就自然产生,不至于因为量纲差异导致某一项目标被完全忽略。
4.2 约束条件的层级结构与“隐藏非线性”
运行优化模型的质量,很大程度上取决于约束条件是不是把实际物理过程“约束死了”。我把约束分成三类:
第一类是设备层约束:CHP机组的电热运行区间、燃气锅炉的出力上下限、储能设备的充放功率和SOC上下限。这些通常用线性不等式表示。第二类是网络层约束:电网潮流约束(功率平衡、线路容量)、气网节点压力约束、热网的节点热平衡和管段温度上限。第三类是耦合约束:设备与网络的连接关系、区域间交换功率约束、热网源侧与负荷侧的供需平衡。
这里必须重点提醒的是“隐藏非线性”——这是最坑的一类约束,比如CHP机组的电功率和热功率之间存在一个三角形可行域,严格来说这需要用一组线性不等式近似而不是一个线性表达式。又比如热站的换热效率,它受供回水温差影响,实测效率曲线是一条非线性的S型曲线,但很多论文会简化成常数。这些“隐藏非线性”如果没处理好,求解器给出的解可能在物理上不可行。
我的处理策略是:能用分段线性近似的就用分段线性近似,不能用就把它作为外部循环的修正系数,不直接喂给求解器。这样既保证了求解速度,又不会和物理规律明显冲突。
4.3 Matlab下的求解器选型与参数整定
Matlab里求解优化问题,我觉得路线很清晰:用Yalmip建模,用求解器算。Yalmip最大的优势是你可以随时更换底层求解器,不需要改模型代码。对于我这种复现工作来说,这是第一生产力。
具体选型上,如果问题被建模成混合整数线性规划(MILP),我会选Gurobi或Cplex;如果只是线性规划(LP),Gurobi也够;如果必须上非线性,我会用Ipopt或者外点法自己写一个循环。实测下来,Gurobi在典型日调度的MILP问题上表现非常出色,配合Yalmip做矩阵化建模,求解时间往往在几十秒内。
求解器参数的整定也是一门学问。MIP Gap设置、时间上限、节点数上限这些参数,直接决定了是“要速度”还是“要精度”。复现论文时先放宽MIP Gap至1%(默认是0.01%),快速跑通模型框架,再收紧到0.1%做最终结算。这个“两步走”的思路我强烈推荐给所有复现者,它能帮你快速定位模型bug与参数问题,而不是在求解器里干等。
5. 复现过程中绕不开的坑与排错路径
5.1 坑一:初始化不当引起的“冷启动”失败
热网模型破冻后,最先遇到的坑往往是初始化问题。因为在做优化求解之前,需要先给系统一个“合理的初始可行解”,很多求解器需要这个初始解才能高效启动。尤其当热网温度作为变量进入模型时,初始温度值给的不好,第一轮迭代就发散。
具体表现是:明明约束都写对了,目标函数也正常,但求解器返回inf或nan。我的排查方法是:先把热网模型单独拿出来,固定机组出力和负荷,只做一次热网的热平衡求解,看是否收敛。如果不收敛,问题就出在温度初值或流量初值上——比如初始温度和实际供回水温差差太大,导致节点热平衡方程数值奇异。
处理办法有三个:一是用上一时刻的历史温度作为当前时刻的初值,这在滚动优化中特别有效;二是给温度变量加一个很小的罚项,促使求解器把温度落在合理区间;三是手动做一次“冷启动计算”——先把热网流量设成定值,只求温度场,等温度场稳定后再放开流量变量。这三个办法配合使用,基本能解决90%以上的初始化发散问题。
5.2 坑二:热损失线性化带来的甩负荷假象
热网管道的散热损失与供回水温度差相关,严格来说是温度和流量的非线性函数。很多复现者为了求解效率,把散热损失直接近似成恒定值或者水温线性函数,结果发现优化结果里热源出力比预期小很多,甚至出现“热负荷没满足”的假象。这是第二个大坑。
出现甩负荷假象的原因在于:散热损失被低估或高估后,系统不用付出实际所需的额外热功率,而优化目标又极度希望“省钱”,于是“模型觉得不花钱就能送热”,真实物理里却根本不够。我的做法是:保留散热损失项,但用分时段常数近似——把每天分成几个时段,每个时段内部散热损失系数不变,时段之间根据温度水平调整。这样既保留了对物理过程的敏感度,又避免了完全非线性求解。
检查这个坑有个简单方法:算完优化后,把热网的实际热损失拉出来对比一下论文里典型日热损失数值。如果偏差超过30%,模型里的散热损失近似方式肯定有问题。
5.3 坑三:边界条件写错时,优化器如何“聪明地骗你”
热网的边界条件——管网入口温度、负荷节点的换热量限值、区域间的交换功率上限——这些参数一旦写错,模型往往还能算出结果,但结果“合理得离谱”。这其实是最危险的部分,因为它不会触发报错,只会让结果看似正常。
我印象最深的一次是,区域间的热网联络线最大传输热功率被我多写了一个数量级,优化结果直接显示“区域A向区域B传送热功率来满足B的全部热负荷”,而这在实际管网中根本不可能实现。我一度以为模型写错了,后来逐一检查边界条件,才发现是联络线容量参数写错了。
边界条件排查的要点:一是逐一对比每个参数与论文原文的数值和单位,尤其注意MW和kW的换算、温度用摄氏度还是开尔文;二是多观察变量的物理合理性——管道流量不超过该管径的允许流速,供水温度不超过锅炉承压温度;三是用“边界值测试法”,把某个边界条件拉到极端(比如某区域热负荷为零),看模型给出的结果是否符合物理直觉。一旦发现结果“聪明得反常”,先回头查边界条件。
这一个排查过程是我复现过程中花时间最多、收获最大的部分。整个模型的可靠性,往往就藏在那些不起眼的边界参数里。
6. 热网模型验证与扩展思考
6.1 验证指标体系的建立
完成复现后,不能只看“目标函数值是几十万”就算结束。一个合格的复现工作,应该建立一套可回溯的验证指标体系。我主要看三个层面的指标:
一是供需平衡验证。把优化出的各时段热功率总和与热负荷总和做差,看残差曲线是否在零附近波动。残差大的点,往往就是热网延时约束或热损失近似出问题的时段。二是设备运行状态验证。CHP机组的运行点是否落在可行区间内,燃气锅炉是否频繁启停,储能SOC曲线是否在上下限内平滑变化,这些直接反映了优化解的可执行性。三是热网关键状态量验证。供水温度、回水温度曲线是否在合理范围内,流量是否在管道最大流量以内。
每次迭代代码后都跑一遍这些指标,而不是只看目标函数值的变化,能让你快速定位模型哪里变了、哪里可能坏了。
6.2 从“复现”到“改进”的一条可行路径
一旦完整复现了EI论文的模型,你就拥有了一套基础框架。接下来怎么在这个框架上做改进?我建议从三个方向入手:第一,把热网的动态模型从“恒定流量质调节”改成“变流量量调节”,这会让模型更接近国内实际供热系统的运行方式——末端用热计量控制流量,而不是统一调节供水温度。第二,在优化框架中引入热网的“虚拟储热”参与调峰,用管道蓄热替代一部分电储能,可以显著提升经济性。第三,把确定性优化改成两阶段鲁棒优化或分布鲁棒优化,考虑热负荷预测的不确定性,增加模型的适用范围。
我自己最想尝试的是,把热网模型和控制层的预测控制(MPC)结合起来,做成滚动时域的实时调度。这个方向很可能就是下一篇论文的起点。
6.3 最后分享一点实测体会
整个复现下来,我最深的体会是:热网建模这件事,论文里描写的难度永远小于代码实现时的难度。原因不是数学公式复杂,而是热网涉及的状态量多、时间尺度跨度大、非线性耦合点多,任何一处简化都可能在优化结果里放大成可见的错误。
所以如果让我给刚起步的朋友一个建议,那就是:不要急着写优化代码,先花一周时间把热网模型的每一个方程、每一个参数、每一条约束和论文原文一一对应清楚。这个“笨功夫”下得越足,后面调代码时你就会越轻松。热网模型这个地基一旦打牢,整个多区域IES优化的大楼才能真正盖起来。