资讯动态

综合能源系统节点能价计算复现:计及碳排放成本的多能流耦合全记录

发布时间:2026/10/8 15:55:04 来源:尧图企业网站定制
几年前我拿到一篇方向挺新的论文复现任务题目是“计及碳排放成本的电-气-热综合能源系统节点能价计算方法研究”。当时这个方向正好是综合能源系统研究里比较热的细分课题论文里最抓人的一句话就是“真正做到了电热气潮流耦合”。等我把论文里的算法一行行敲进代码、反复调参到崩溃才明白这句话的分量多能流联立求解跟单网络计算完全不是一个难度等级而节点能价的提取更是把优化问题、潮流计算、碳排放成本全部揉在一起。这篇内容就是把我那次复现的全过程、踩过的坑、以及最后如何验证结果和论文对得上完整记录下来给同样在做综合能源系统、多能流耦合或者能价方向的同学做个参考。无论你是刚入门的硕士生还是正在搭综合能源仿真平台的工程师这篇东西都能帮你省掉大把试错时间。我尽量把模型思路讲透把实现细节落到能直接“抄作业”的程度遇到的关键难点会单独标出来说明原因。1. 复现前的全局认知这篇论文到底在算什么拿到一个复现任务第一件事不是急着看代码和公式而是先把论文的“骨架”抽出来。因为很多论文写得很含蓄真正的技术路线藏在摘要、图表和算例描述里。这篇论文表面上是“计算方法研究”实际做的是三件事的叠加把传统电力系统的节点边际电价思想推广到电、气、热三个网络把碳排放成本作为一项显性成本写进优化目标再把三条网络通过耦合设备联立求解获得每个节点的统一能价。1.1 节点能价不是简单平均电价要追到KKT乘子我第一次看“节点能价”这个词的时候以为就是把发电成本、气源成本、热源成本加起来再平均分到每个节点。这个理解大错特错。节点能价的内在逻辑是边际定价单位能量在某个节点上的价值等于“在该节点多供应一单位能量时整个系统总成本的变化量”。这个定义听起来抽象其实跟电网里的LMP节点边际电价是同一个思想。要让这个“边际变化量”变得可计算标准做法是把综合能源系统运行问题写成带约束的优化模型然后通过KKT条件求极值。系统总成本最小化是目标函数电网的功率平衡、气网的气流平衡、热网的水力和热力平衡、所有设备运行上下限都是约束条件。在最优点上每一个约束对应的拉格朗日乘子就是这个约束的“边际价值”。具体到节点能价计算核心就是抓住每个节点的能量平衡约束对应的对偶乘子再把它拆成能量分量、网络分量和碳分量。能量分量反映边际生产成本网络分量反映线路、管道、热网造成的能量输运损耗和阻塞碳分量反映碳排放成本对定价的影响。三者相加就有了论文标题里的“计及碳排放成本的节点能价”。我复现时最深刻的一个体会如果只把优化模型解出来、拿到总成本最小值这不叫复现完整因为能价完全不在目标函数里而是在KKT乘子里。很多人复现不成功多半是在这里“断了线”。1.2 碳排放成本进模型的两种方式选错会导致结果对不上论文题目点出了“计及碳排放成本”但怎么“计及”是个关键分岔路。我在实际建模时发现主要有两种做法选哪一种会影响能价公式的结构也会影响最终数值分布。第一种是把碳排放成本直接写进目标函数。具体来说每个碳排放源燃气轮机、CHP机组、燃气锅炉等都有碳排强度系数乘以当前碳价和出力大小就得到一个与出力相关的成本项。这样碳成本就变成了目标函数的一部分在求解KKT条件时碳价自然进入节点能价的表达式中。第二种是把碳排放总量写成约束条件比如“全系统碳排放不得超过某个配额”然后由约束的对偶乘子给出碳排放的影子价格。这种方式需要额外指定碳配额边界算出来的能价里碳分量来自配额松紧程度而不是直接的碳价。原文的标题用的是“计及碳排放成本”一般来说默认是第一种方式也就是碳价直接参与目标函数构成。我复现时也采用的是第一种因为它在数学上更直观而且碳价参数敏感性分析更好做直接把碳价从50元/吨改到200元/吨观察各节点能价的变化幅度和方向论文里的算例图就是这样得到的。如果你决定复现第二种也完全可以做但要跟论文里的“碳成本”表述保持一致。我建议先找论文底层的能源枢纽模型细节看它是把碳放在成本项还是约束项。这一步判断错了后面的能价数值会差一截而且很难通过调参弥补。1.3 真正的电热气潮流耦合顺序迭代还是统一联立题目里那句“真正做到了电热气潮流耦合”是我在整个复现过程中反复琢磨的点。很多文献里的多能流计算实际上是“顺序求解”先算电网潮流把结果代入天然气网络计算再把气网结果代入热网计算然后回到电网重新迭代直到收敛。这种解耦迭代方法实现简单而且每个子系统可以复用成熟的单网络工具但缺点在于它会丢失跨网络的同时性效应并且高负荷场景下容易迭代发散。论文采用的是统一联立求解方法也就是把电网潮流方程、气网节点流量平衡方程、热网水力与热力方程放到同一个非线性方程组里用牛顿-拉夫逊法一次性联立求解。此时电网、气网、热网的未知变量一起迭代电压幅值、电压相角、气网节点压力、热网节点温度、热网管道流量等全部在同一轮迭代中更新。我可以用一个生活化的类比来解释顺序求解就像一个人先吃三口饭、又喝三口汤再回头吃饭但肠胃在每一时刻只处理一种东西统一联立求解则是把饭和汤搅成糊状一次吃下去让身体按整体需求调配消化资源。后者确实更“耦合”但也更考验初值和矩阵处理能力。这一条不光是计算层面上的差异。它直接影响能价的物理含义在统一解下电、气、热每个节点都是同一个系统状态空间中的点节点能价才能作为统一信号去引导多能互补调度。如果只是顺序迭代能价就很难反映跨网络的耦合效应也只算“半吊子”耦合。2. 模型细节拆解三个网络的方程和耦合元件建模到这一步我基本清楚了论文的技术架构下面就是把数学模型落到实处。这个部分是最枯燥、也最容易出错的。三个网络的物理规律完全不同参数单位不同方程形态也不同要把它们放进一个统一方程组里需要大量细节处理。2.1 电网、气网、热网各自的核心约束与量纲问题电网部分用的是交流潮流模型节点分成PQ、PV和平衡节点三类。每个节点满足有功功率平衡和无功功率平衡方程形式就是传统的极坐标牛顿法方程。需要注意的是电网里所有参数要用标幺值表示基准容量通常设为100MVA这样电压幅值、相角、注入功率的量级比较均衡雅可比矩阵的条件数也更友好。天然气网的核心是管道流量方程。论文里通常采用稳态模型管道从节点i到节点j的流量跟两端压力平方差直接相关。典型形式是流量等于管道常数乘以节点压力平方差的平方根方向由压力高低决定。实际复现时我建议采用带符号的Weymouth方程避免流量符号判断出错。热网比电网和气网都要麻烦。热网不仅要算水力工况管道流量、节点压力还要算热力工况节点温度、供回水温度。水力方程是管道压降与流量的关系热力方程包括节点功率平衡、管道温度降、节点混合温度方程。温度变量的迭代范围特别容易越界初值稍微给得不好温度就会冲到几百摄氏度然后整个雅可比矩阵就“飞了”。量纲统一是联立求解的第一道关卡。电网明明用标幺值、气网压力用MPa或kPa、热网功率用kW或MW、流量用kg/s如果不做统一缩放雅可比矩阵里某些元素可能是1e-6另一些是1e6数值上直接病态。我的做法是先把所有功率统一到MW气网压力取MPa热网功率也统一到MW流量统一到kg/s再在雅可比矩阵组装时把天然气、热网子块做比例缩放保证所有变量都在1e-2到1e3这个区间内。2.2 耦合元件CHP、燃气轮机、电锅炉与P2G电、气、热三张网络不可能凭空耦合在一起它们必须通过具体的能量转换设备来交换功率这类设备在综合能源系统里常被叫作耦合元件。我复现时用了四类耦合元件它们的输入输出关系就是联立方程组里的“连接桥”。燃气轮机和燃气锅炉比较简单。燃气轮机消费天然气输出电力和高温烟气烟气进入余热锅炉后还可以输出热力这就是CHP热电联产。论文里一般用热电比来刻画电出力和热出力之间的关系给定电出力时热出力就是电出力乘以一个热电比系数。电锅炉则是消耗电力、输出热力P2G电转气是消耗电力、输出天然气。在复现时P2G的效率通常取50%到65%这也就意味着1MW的电进去只能产出0.5到0.65MW热值的气。这些设备的耦合关系在优化模型里是等式约束在能价的KKT分解里它们会产生“跨网络乘子传递”也就是电力网络节点能价的上升会通过P2G通道传导到天然气网络的节点能价上。有一件事特别重要所有耦合元件都有容量上限和运行效率这些边界条件必须写进约束集。否则求解器会在一开始就“自我满足”把电价高网络里的电疯狂转成气或者把气疯狂转成电最后得到完全不合理的能价结果。2.3 从KKT乘子到节点能价分解公式的路子当你把综合能源系统优化问题写成带等式约束和不等式约束的形式并用拉格朗日函数展开后能价提取就变成了乘子整理问题。我实现时的具体步骤是先用内点法求解优化问题得到最优解然后从求解器输出中读取每个节点能量平衡等式约束对应的拉格朗日乘子。电网的节点乘子对应电平衡气网的节点乘子对应气平衡热网的节点乘子对应热平衡。在这些乘子基础上叠加网络支路的阻塞乘子以及设备耦合乘子的影响再剔除电源边际成本直接贡献的基准项就能分解出“能量成本分量”“网络损耗与阻塞分量”“碳排放成本分量”。需要注意对不同网络来说乘子的单位不同。电平衡乘子的单位是元/MWh气平衡乘子则是元/m³或者元/kg热平衡乘子是元/GJ。为了让三者可以在统一能价体系下比较必须把气价、热价乘子统一折算到元/MWh这个统一能量价位。折算公式就是单位换算1m³天然气按热值折算成对应的MWh数1GJ直接乘以1000/3600换算到MWh。我在代码里专门写了一个单位换算工具函数避免每次手动算错折算系数。这一块是整个复现里最体现“数学内功”的部分。如果只是机械调用求解器根本不知道乘子对应哪个约束。我建议复现时先把优化模型写清楚把每个约束按照“网络节点”“支路设备”“耦合设备”三个层次分组再逐组对应到能价分解公式的各个分量。这样代码实现时逻辑清晰调试时也能快速定位乘子异常。3. 实操复现从搭建算例环境到解出能价模型理论上理通了剩下的就是动手。这一部分我说说实际复现的整个流程包括算例系统选择、求解器方案、雅可比矩阵拼装方式以及最初几次失败是怎么定位和修复的。3.1 复现环境搭建与测试系统选择我用的环境是MATLAB YALMIP IPOPT。选这套组合的原因是综合能源方向的论文大多用MATLAB体系YALMIP建模语言能快速把优化目标、约束写出来IPOPT是开源内点法求解器能直接返回对偶乘子正好满足KKT乘子提取需求。如果不想用MATLABPython下的CasADi加IPOPT也能做到同样效果语法上更符合现代工程习惯。测试系统方面我没有一开始就上论文里的大型算例而是先搭了一个简化测试系统验证模型正确性一个小型系统包含电网3节点、气网3节点、热网2个热源节点外加一台CHP机组和一台电锅炉。跑通之后再扩展到带24节点电网、20节点气网和13节点热网的复杂算例。小系统最大的好处是能手动验算把节点能价结果跟手工推导的简化案例对一下确认模型没写错。在确定算例数据时我参考了经典综合能源系统测试系统的公开参数电网部分采用IEEE 24节点系统的负荷和线路数据气网部分采用了比利时20节点天然气系统的部分数据做了本土化改造热网部分采用了论文常用的13节点辐射状热网。这种做法在论文复现中非常常见因为原文里的全体数据往往不完整需要靠公开测试系统补齐。3.2 统一潮流联立求解雅可比矩阵的拼装思路与核心代码很多复现者倒在这一步因为统一联立求解要求把三个网络的非线性方程以及耦合设备方程一起组装进牛顿法的雅可比矩阵。我拆开来分析电网子块对应电压幅值和相角的偏导数气网子块对应节点压力的偏导数热网子块对应节点温度、回水温度、管道流量的偏导数。耦合元件的偏导数则负责跨子块传递。代码实现上我会把未知量排列成一个大向量 x。排列方式是电网络变量在最前面天然气变量在中间热力变量在最后。对应的雅可比矩阵就是按这个变量顺序分块。x [theta; V; p; T_s; T_r; m]; % 电网相角/电压幅值、气网压力、热网供/回水温度、管道流量 J zeros(n, n); J(1:n_elec, 1:n_elec) dElecResidual_dElecVar; % 电网块 J(1:n_elec, n_elec1:n_elecn_gas) dElecResidual_dGasVar; % 电-气耦合块 % 同理组装其他分块如果你用的是YALMIP加IPOPT就不需要手写雅可比矩阵IPOPT会自动计算导数。但“自动计算”不等于“万事大吉”模型的约束如果不连续或者存在平方根函数导数的定义域处理不对依然会报错。比如气网管道流量方程里那个平方根如果压力平方差算成负数平方根就成了非实数内点法直接跳出可行域。我建议无论如何都要先实现一版手写雅可比矩阵的潮流求解器因为只有手写过你才会真正理解每个变量之间的耦合关系。验证通过之后再用YALMIP做优化求解和乘子提取两个工具互相验证出问题时不至于手足无措。3.3 能价计算的最后一步把乘子转换成节点能价优化问题求解完成后IPOPT会返回每个约束的拉格朗日乘子。在YALMIP里可以通过dual函数访问。我当时的代码流程大致是这样% 假设 constraints 是YALMIP约束对象objective是目标函数 ops sdpsettings(solver, ipopt, verbose, 2); optimize(constraints, objective, ops); % 提取能量平衡约束乘子 elec_lam dual(Constraints_electric_balance); gas_lam dual(Constraints_gas_balance); heat_lam dual(Constraints_heat_balance); % 单位统一转换为元/MWh gas_price_per_kWh gas_lam / gas_heat_value_mwh; heat_price_per_mwh heat_lam * 0.27778; % GJ转MWh单位换算别在这里写错因为我前面吃过亏。1GJ等于0.2778MWh所以热网的元/GJ乘子乘以0.2778就得到元/MWh天然气如果按kg算流量需要先把kg折算成标准立方米再按热值折算成MWh。这个换算链路一错整个能价图全部跑偏。拿到初始乘子之后我还会做一次校验对于没有任何网络约束的自由出力节点能价应该等于边际机组的边际成本有阻塞或损耗的节点能价会在这个基准上向上浮动高碳排放节点的能价相比低碳节点会有一个跟碳价线性相关的增量。这一条校验在后文还会展开说明。4. 常见问题排查实录一周复现踩过的五个典型坑复现阶段不是一帆风顺的我前后大概花了五天半才把整个流程稳定跑通。这里面有些问题非常有代表性单独记录下来比看十篇原理文章都有用。我把它们整理成表格加详细说明方便你遇到同样报错时直接对照排查。4.1 实际复现中遇到的主要问题速查表问题现象直接原因解决方法牛顿法迭代发散残差越来越大初值设置不当气网压力或热网温度越界设置合理初值电压1.0pu相角0气网压力0.5MPa热网供水温度110℃、回水70℃优化求解器报“NaN or Inf”平方根函数定义域崩溃气网Weymouth方程加sign函数处理压力平方差加极小正数约束雅可比矩阵奇异无法求逆变量冗余或设备耦合模型重复计及检查CHP电热出力是否被重复写入电网、热网两个约束节点能价出现负值乘子符号约定搞反或目标函数未正确包含成本项统一按“目标函数最小化-等式约束乘子为正”的约定读取dual值碳价变化但对能价影响微弱碳排放成本未正确进入目标函数检查碳排强度系数单位是否与成本单位匹配确认碳成本项在目标函数中生效4.2 量纲不一致导致雅可比矩阵病态这是我在扩展到大算例时遇到的第一个严重问题。小系统能跑通但扩到242013节点之后牛顿法开始出现假收敛迭代好几步残差下降得很慢最终结果是错的但程序并不会报错。我检查雅可比矩阵的条件数发现达到了1e12量级。原因也很直接电网变量电压幅值大概在1.0附近相角在0附近但热网管道流量在几十到几百kg/s气网压力平方差在0.01到0.1MPa²之间。所有变量拼在一个大向量里数值范围差了三个数量级以上雅可比矩阵自然病态。解决办法不是重新推导方程而是做变量归一化。把所有变量按照物理基准归一到类似量级比如压力以0.5MPa为基准、流量以100kg/s为基准、温度以100℃为基准雅可比矩阵条件数降到1e4左右迭代收敛速度和稳定性立刻改善。这个操作在代码里只是简单添加缩放系数但对整体求解性能的提升非常明显。4.3 气网压力初值对收敛性的致命影响气网是最难伺候的。我分别试过三种初值全部节点设为同一压力0.4MPa、全部设为2MPa、以及按照论文算例的典型压力估算。结果只有第三种能稳定收敛。原因是气网方程是典型的非线性平方根方程对初值敏感度远超电网潮流。我后来处理的方法是两步走先用一个简化的水电类比模型计算气网压力分布也就是把每条管道流量粗算再按Weymouth方程反推节点压力把这个结果作为初值传给完整模型。这种做法很粗糙但给出的初值方向基本正确配合牛顿法的局部收敛性质能快速进入正确的收敛域。如果你用的是IPOPT这种全局优化算法初值影响会小一些但依然不要随便给。IPOPT是局部优化算法不是全局优化算法初值太离谱一样会陷入不可行域。4.4 热网温度越界与迭代震荡热网温度变量比气网压力更敏感。供回水温度通常设置在110/70℃附近但迭代过程中如果某个节点因为热功率不平衡导致流量调整温度很容易在迭代初期冲到300℃以上然后系统直接崩溃。我在热网部分做了一层保护在每次迭代步骤之后对温度变量加上边界检查如果超出设定范围就把它拉回上一轮迭代的旧值。这种做法从数学上相当于对迭代步长做限制对最终收敛结果没有影响但能极大提高迭代稳定性。另外热网水力方程和热力方程的解耦处理也很重要先求管道流量再在流量固定的条件下求温度分布可以有效降低热网子块的耦合强度。4.5 碳价参数对能价分布的影响验证最后一个坑不是报错而是结果不符合物理直觉。我最开始设碳价为100元/吨算出的节点能价与不设碳价时几乎没有差别这显然不对。检查后发现碳排放强度系数写错了单位我把燃气轮机的碳排强度写成了g/kWh却直接与元/吨的碳价相乘差了整整1000倍。修正过后节点能价中碳分量的变化规律就很明显了离燃气机组越近、气网输送成本越低的节点能价里的碳分量越接近边际燃气机组的碳排成本乘以碳价离气源远、压降大的节点因为需要更多气网压力驱动天然气输送能价会更高。净负荷高且气网供气受限的区域碳分量在能价中的占比能上升5到8个百分点。论文里那张能价分布图基本就是靠这样的碳价扫描实验得到的。5. 结果验证与扩展建议怎么判断复现结果是可信的复现到最后最怕的就是程序不报错结果却完全不对。我总结了一套“三信号检查法”每次跑完新算例都会依次检查确认能价结果在物理上是可信的。5.1 三个信号判断复现是否成功第一个信号是基准对比。把碳价设为0系统退化为普通的多能流经济调度。此时所有不受网络约束的节点能价应该趋于一致数值等于边际机组的发电成本。如果等值节点出现价格差异说明网络约束或线路损耗模型有误。第二个信号是碳价敏感性。逐步提高碳价高碳排节点的能价增长斜率应当与碳排强度呈正比。具体来说如果某个节点的边际供能来自燃气轮机碳价每上升1元/吨该节点能价增加量应等于该燃机单位发电碳排放量。这个线性关系如果被破坏就说明碳成本项没有正确进入KKT乘子。第三个信号是耦合分量方向。P2G设备的效率通常低于1所以电能转成气之后必然有能量损耗这会导致气网节点能价与电网节点能价的差值不能小于能量转换损耗。简单说气网节点能价应为电网节点能价除以P2G效率再叠加气网输运成本。如果气网节点能价比电网节点能价还低那一定哪里错了。这三个信号我在每次改动模型或参数后都会跑一遍相当于回归测试。比单纯看“程序没有报错”可靠得多。5.2 能价结果怎么解读从算例数据回到实际问题拿到一张节点能价分布图之后不能只停留在“有数可看”。我分析结果时习惯从三个角度入手空间维度的能价差异能反映网络阻塞程度跨网络能价差异能反映耦合设备的转换效率和碳成本传导强度碳价敏感性能反映不同供能路径的低碳属性。在我的复现结果里电负荷重且靠近燃机节点的地方节点能价明显高于电负荷轻且靠近可再生能源的节点天然气网络末端因为压力降低导致输运效率下降节点能价比气源附近高约8%左右热网因为温度降损失末端节点热价明显高于热源节点。这些空间差异直接指向了一个工程结论只按统一平均价结算会掩盖系统真实成本按节点能价结算更有助于多能流系统高效运行和投资选址。5.3 我个人复现过程中的心得体会回过头看这次复现能跑通最大的功臣是“先小后大、分阶段验证”的工程流程。如果一开始就直奔大型算例遇到问题根本不知道是模型错误、初值问题还是数值病态排查起来毫无头绪。小系统虽然简单但它能让你手动验算每一个乘子和能价分量是建立信心的关键一步。另外代码组织的模块化也很重要。我把电网方程、气网方程、热网方程拆成了独立的函数模块每个模块都有单独的测试脚本。这样在尝试改变某类设备参数时不需要担心破坏其他模块的运行。后期扩展比如加入氢能、储能或者碳捕集装置时只需要增加新模块和对应耦合项不会推翻整套框架。最后想提醒一点论文复现的本质是“用代码还原作者的数学逻辑”而不是“让代码能跑”。所以每一条公式、每一个乘子都要能对应回论文里的推导。我复现时坚持做了一份总共四十多页的注释文档每段代码都标注了对应论文公式编号和物理含义。这份文档在后续扩展研究和写论文时帮了大忙我也建议你复现时养成同样的习惯。这次复现的项目到这里已经完整收尾模型建立、统一求解、能价提取、碳排放成本分析、异常排查、结果验证全部走通。如果你正好也在做多能流耦合或者节点能价方向的课题希望这篇内容能帮你把路走得更顺一些。

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

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

免费获取报价 →
↑