搞综合能源系统模型的人应该都有过这种经历明明调度算法已经在跑整个系统的成本也能算出来但一旦被人问“那这个节点上的电、气、热到底该按什么价格结算”回答起来就非常尴尬。电有节点电价气有管输价格体系热更是连一个公认的定价基准都难找。更麻烦的是三个网络各算各的价算完以后发现加在一起根本对不上账——因为能价这东西不是三个独立价格简单拼出来的它在物理上应该反映“每一度电、每一方气、每一单位热能注入系统后全网总成本的边际变化”。我这次复现的研究内容正好就是把这个账算清楚。这篇论文的完整思路是在同时求解电、气、热三种网络潮流的前提下把碳排放成本也塞进统一的能价计算框架里最后给出每个节点上电、气、热三种载体各自的节点能价。复现过程中最折磨人、也最有价值的一块就是把电热气潮流从“分网迭代耦合”做成“同一个方程组的真耦合”。这篇博文把整个过程拆开讲包括模型怎么建、碳成本怎么进定价公式、耦合求解的坑在哪、以及最终算出来的价格信号长什么样。1. 为什么节点能价不能由三个网络各算各的价拼出来1.1 能价在物理上到底意味着什么先说结论节点能价的本质是系统总成本对某个节点负荷变化的边际灵敏度。在电力系统里这个概念已经很成熟叫节点边际电价LMP它的值是优化问题里节点功率平衡约束对应的拉格朗日乘子。乘子大说明这个节点供能紧张乘子小说明这个节点供能充裕。同样的逻辑可以推广到天然气网络和热力网络但推广的时候有个隐含前提容易被忽略——天然气节点和热力节点的“供需平衡”不是独立成立的它们中间隔着燃气轮机、燃气锅炉、热电联产机组、电锅炉这些耦合设备。这就意味着你没法只靠电力潮流或只靠热力潮流来定义“某个节点上的热价格”。热网的某个负荷突然增加系统里可能有三种应对路径让附近的热电联产机组多烧气、让燃气锅炉顶上去、让更远处的热源多加负荷通过管网送热。三种路径的成本不同、碳排放不同、对电网潮流的影响也不同最终的边际成本只能由一个多网络联合优化模型给出而不能靠把三个单网络模型的结果粘在一起。1.2 碳排放成本在这条逻辑链中的位置碳排放成本进入能价的方式也不是简单地把发电成本加一个碳税系数。现实里碳成本是按一次能源消耗量计的天然气燃烧产生碳排放但燃气轮机发出的电和回收的余热都来自同一批天然气的化学能。那么碳成本应该摊到电价里还是摊到热价里这个问题的答案会直接影响设备调度结果如果把碳成本全部摊给发电出力热电机组的电出力会被压低热出力反倒相对便宜如果按燃料量的热值比例分摊到电和热上设备运行区间又会完全不同。论文的做法是把碳成本作为目标函数中的一部分让优化问题自己去决定碳成本如何通过设备运行状态在电、气、热三种载体之间分配。能价计算在这种设定下不是一个独立的环节而是联合优化问题求解后拉格朗日乘子的直接输出这就是它跟传统“成本核算再分摊”做法最大的不同。2. 电、气、热三种网络如何建模才能实现真正的混合潮流求解2.1 电力网络直流潮流在能价研究中够用且稳定电力网络部分我采用了直流潮流模型这也是大多数综合能源系统能价研究的共同选择。直流潮流假设节点电压幅值恒定、支路电阻远小于电抗、相角差足够小于是有功潮流方程可以简化成线性形式$$P_{i j}B_{ij}\left(\theta_i-\theta_j\right)$$节点功率平衡写为$$P_{g,i}P_{\text{coup},i}-P_{d,i}\sum_{j\neq i}B_{ij}\left(\theta_i-\theta_j\right)$$之所以不用交流潮流核心原因是能价研究本质上做的是经济性分析线路网损对边际价格的贡献在直流模型中已经能体现而交流潮流带来的无功功率和电压幅值变量会让混合优化问题的非线性程度陡增对气网和热网的非线性方程来说极度不友好。直流潮流中的支路传输约束写成P_ij_max上限配合发电机组出力上下限就构成了电力网络的全部不等式约束。2.2 天然气网络管道方程、节点压力与简化技巧天然气网络的建模是整个复现过程中第一个让我真正卡住的地方。天然气管道的稳态流量可以用威茅斯方程Weymouth描述$$f_{m n}K_{m n},\mathrm{sgn}\left(\pi_m^2-\pi_n^2\right)\sqrt{\left|\pi_m^2-\pi_n^2\right|}$$其中π是节点压力f是管道流量K是管道常数。这个方程天然带有平方根和非光滑的符号函数在优化求解器中非常难处理。论文里用于能价计算的部分没有把这个问题复杂化而是采用了流变量和管段两端的压差变量同时保留的方式让求解器自己去折中。实际问题在于K值的数量级。天然气网络中管道常数通常很小而节点压力动辄几兆帕两者放在同一个优化问题里会导致数值病态。我的处理方式是对所有变量做标幺化压力基准取系统最大允许压力流量基准取气源总供应量K值也随之折算为单位量级。这步看起来不起眼但对后续联合求解的收敛性影响极大。压缩机我用了最简单的定升压比模型给定入口压力比为一个常数。这在能价计算里够用因为压缩机的影响最终主要体现在天然气节点价格的抬高幅度上升压比越大下游节点的能价越高。2.3 热力网络温度变量与水力变量的耦合才叫热网模型热力网络建模是“电热气潮流耦合”里最容易应付了事的环节。很多文献直接把热负荷当成一个功率注入量然后假装网络满足了能量平衡——这不叫潮流计算。真正意义上的热网潮流至少需要描述质量流量和温度场的共同演化。热力网络的基本结构是供水管网和回水管网。节点处有四个状态量供水温度、回水温度、注入网络的功率、节点处的质量流量。主流模型用节点功率方程连接这些变量$$\phi_i\dot{m}i c_p\left(T{s,i}-T_{r,i}\right)$$管道沿线的温度下降采用苏普夫-迈耶Sughara-Meyer型指数衰减模型$$T_{s,out}\left(T_{s,in}-T_0\right)e^{-a L}T_0$$其中T_0是环境温度a是管道的热损耗系数L是管长。这意味着热网的状态量之间存在着强非线性耦合一个供热节点改变送水温度下游所有节点的回水温度都会跟着变进而改变全网各节点的供热功率又反过来影响热源的流量分配。我在复现时把热网的节点分为热源节点热电联产、燃气锅炉、热负荷节点和纯中间节点。热源节点需要给定供水温度控制策略负荷节点的回水温度由管网结构决定。这里必须注意质量流量在热网中不是自由变量它要满足各节点流量的Kirchhoff流量守恒也就是每个节点的净流量为零。这个约束使热网求解从单纯的温度场问题变成了“水力热力”联立问题也正是题目里那句“真正的潮流耦合”中的一部分含义。2.4 耦合元件把三个网络拧成一条方程组电热气三个网络各自建模完成后真正把它们绑在一起的是耦合设备。我在模型中用了三类最常见的耦合元件热电联产机组CHP消耗天然气同时输出电力和热力。出力特性用线性化可行域描述耗气量F电出力P热出力H三者满足 $F a_0 a_1 P a_2 H$同时受电热工作区间约束。燃气锅炉耗气F输出热H η_b F相当于只把天然气转成热力。电锅炉/热泵耗电P输出热H η_e P 或 H COP × P。每个耦合元件在三个网络的节点平衡方程里各产生一个注入或抽取项。比如一台装在电网节点i、气网节点j、热网节点k的热电联产机组它同时给电力节点i注入P给天然气节点j抽取F给热网节点k注入H。三个网络的潮流方程通过这个设备的运行变量连在一起最终拼装成一个大的联立方程组求解。“真耦合”和“弱耦合”的区别就体现在这里。弱耦合的做法是先算电网潮流把电出力结果喂给热电机组模型算出热出力后再算热网把热网结果反回去调整电网的机组出力迭代几十轮直到两个网络的结果不再变化。真耦合则是把电、气、热所有的状态变量放在同一个非线性方程组里用统一的牛顿-拉夫逊迭代或优化求解器一次性解出来。前者的缺点非常明显气网压力的变化会引起热电机组耗气量变化进而改变热出力热网温度变化又会影响热负荷分布环环相扣迭代极难收敛而且即使收敛也没有严谨的数学保证。后者则直接面对大规模稀疏方程组的数值性质问题处理得当后稳定性远优于前者。3. 碳排放成本在定价模型里的数学角色3.1 碳成本进目标函数而不是进约束把碳成本放进综合能源系统优化问题最常见也最容易被接受的思路是把它作为目标函数中所有一次能源消耗项上的一个惩罚系数。对于任意消耗天然气的设备目标函数里都会多出一项碳成本$$C_{\text{carbon}} \lambda_{CO2}\sum_{k\in\mathcal{G}} e_k F_k$$其中F_k是设备k的耗气量e_k是单位天然气的二氧化碳排放系数λ_CO2是碳价单位可以取元/吨二氧化碳。这样处理以后碳成本不再是碳捕集、碳交易等外部政策的附加说明而是直接参与机组调度决策的边际成本。调度器会在“多烧气多发一度电”和“少烧气少发一度电”之间做比较碳价越高系统就越偏向于高效机组、更远距离的气源以及更高效率的热电联产方式。这里有一个容易误入的歧途有些人把碳成本写成碳排放量的硬性上限约束然后再把约束对应的乘子当成碳价去用。这在数学上没问题但在能价语义上很别扭因为约束条件下的乘子含义是“再增加一吨排放配额带来的成本”只有在你真正面临配额限制时才成立。而本篇论文的处理逻辑是在碳税或碳市场机制下碳价是一个已知的外部参数调度结果在给定碳价下自然找到最小成本运行点。3.2 碳成本进入能价公式的路径KKT乘子整个节点能价的计算可以统一表述成一个多网络联合最优潮流问题$$\min_{\mathbf{x}}; \left(\sum_{i\in G_P} C_i(P_i)\sum_{j\in G_G} C_j(F_j)\sum_{k\in G_H} C_k(\phi_k)\lambda_{CO2}\sum_{m}\epsilon_m F_m\right)$$约束包括三个网络的节点平衡方程、设备运行约束、网络传输约束、耦合元件约束。对这个优化问题构造拉格朗日函数电力节点i的功率平衡约束对应的对偶乘子λ_P,i就是该节点电能的节点边际价格天然气节点j的流量平衡约束对应的对偶乘子λ_G,j就是该节点天然气的节点边际价格热网节点k的热功率平衡约束对应的对偶乘子λ_H,k就是该节点的热能边际价格。论证的逻辑链是这样的如果该节点负荷增加一单位为了让约束仍然成立系统必须调整各机组的出力调整的方式和目标使总成本增量恰好等于该节点的影子价格。由于目标函数里已经带上了碳排放成本项这个乘子自然而然包含了碳排放因素。这就是“计及碳排放成本的节点能价”这条说法的来源。不需要在计算出能价之后追加减排附加费之类的操作那样反而会导致价格双算。碳成本早就通过机组燃料消耗进入了设备边际成本再经KKT条件传递到每个节点的能价上。3.3 碳排放通过耦合设备在三个网络间转移的特殊现象耦合设备让碳排放成本的传导出现了电力系统里没有的路径。举一个典型例子以天然气为一次能源的热电联产机组承担了全部碳成本但它同时发出电力和热力。假设某个节点接入了一台热电联产机组和一台燃气锅炉碳价升高之后优化结果大概率是让热电联产承担更多热负荷、减少燃气锅炉的出力因为热电联产用同样的天然气量能同时产出电和热综合效率更高。这个决策在能价上的反映是不仅电气节点的价格因碳成本上升热网节点的价格也会随碳价上升而且不同热节点上升的幅度并不一样。取决于该节点周边热源的结构——燃气锅炉比例高的节点热价上升更多热电联产覆盖比例高的节点热价上升更少因为联产机组分摊碳成本的能力更强。这种价格分化的现象如果不用完整的联合潮流模型是不可能捕获的。这也是我复现过程中觉得最有价值的部分之一。4. 节点能价的计算流程与实现细节4.1 能价的三大构成与统一能源基准复现完成后我习惯把节点能价拆成三个部分来看能量成本部分、网络传输成本部分、碳成本部分。这个拆法并不影响最终数值纯粹是为了便于分析和展示。能量成本部分反映该节点所在网络里边际机组的燃料成本。主要指煤、气等一次能源的采购价格对终端能价的贡献。网络传输成本部分反映该节点在网络中的位置。输电阻塞、供热管道损耗、天然气管道压降都会抬高远离边际供给源的节点的能价。碳成本部分反映碳排放成本经过优化分摊后落在该节点上的配额。三种载体之间的比较需要一个统一的基准。电力能价的单位是元/兆瓦时热力能价也是元/兆瓦时按热量计但天然气的常规计量单位是元/立方米。为了让三者进入同一个定价体系我把天然气按低位热值折算成元/兆瓦时1标准立方米天然气热值约36兆焦换算成9.9千瓦时所以1元/立方米约折合100元/兆瓦时。这个换算工作在代码里就是一个常数但要特别注意热值基准是否一致不同地区的天然气组分热值不同换算结果会有百分之几的偏差这一点在论文对比时极易被忽略。4.2 从KKT乘子到节点能价的实现流程具体落地到计算流程上我按照下面这几步操作基本可以稳定复现出论文中的结果。第一步搭建三网络拓扑数据。电网用节点-支路导纳矩阵气网用节点-管道连接关系加管道常数热网用节点-管道连接关系加管长、管径和环境温度。所有网络节点编号统一到一个全局编号体系电网节点从1到N_e气网节点从N_e1到N_eN_g热网节点从N_eN_g1往后排。耦合设备的位置用三元组记录。第二步写联合优化模型。目标函数包含发电机组成本函数、气源购气成本函数、热源燃料成本函数以及碳排放成本项。约束包括电网节点功率平衡、气网节点流量平衡、热网节点功率平衡、气网管道威茅斯方程、热网管道温度衰减方程、机组出力限值、线路传输限值、耦合设备的电热关系。第三步求解非线性优化问题。我用的是带内点法的求解器逐次迭代到KKT条件满足为止。这一步的核心注意事项是变量尺度前面提过的压力标幺化、流量标幺化都要在这里落实不然后端求解器会报警收敛失败。第四步从求解结果中提取KKT乘子。内点法求解器在第一阶段得到最优解之后拉格朗日乘子作为对偶变量一并输出直接取值即可。注意数值精度的检查乘子的值应该与目标函数的量纲一致如果某节点的电力能价出现明显超出正常边际成本范围的情况大概率是该节点对应的约束中出现了数值问题。第五步输出能价并做校验。校验最简单的方法是把优化问题里某个节点的负荷人为增加一个小量比如1兆瓦重新求解观察总成本的增量。这个增量应当与KKT乘子给出的该节点能价一致偏差超过5%就说明参数或模型有误。整个流程写起来就四五百行代码但真正把这五步跑通我在每一处都遇到过不止一次翻车。5. 复现中最难啃的硬骨头多网络潮流联合求解的收敛问题5.1 我最初踩的坑分网迭代求解价格“断层”复现第一步我图省事把三个网络拆开做迭代求解先解电网最优潮流再把电网的机组出力传给气网和热网的耦合设备解完气热网络后再把耗气量和热出力反馈回电网如此循环。结果非常不理想。最典型的问题是价格“断层”电网节点的能价变化平缓热网节点的能价却在两轮迭代之间剧烈跳动。原因其实好理解——在弱耦合迭代里热电机组的运行点每一轮都在变上一轮电网迭代要求机组多发一度电这一轮热网迭代又要求机组多供一单位热重新解电网后电出力可能又变了。两个工况点之间的边际成本相差很大乘子自然在大幅值之间来回摆最终的“收敛”很多时候只是迭代次数到了而不是严格意义上的收敛。这个失败的尝试让我彻底转向联合优化求解。事实证明只有把三个网络的平衡约束放在同一个牛顿-拉夫逊或内点迭代里乘子才不会出现这种系统性振荡。5.2 变量归一化最不起眼却最关键的操作联合求解器的第一版实现放到测试案例上就报错求解器提示矩阵条件数过大。定位之后才发现问题出在数量级悬殊电网相角量级是0.01弧度热网温度量级是几十到上百摄氏度气网压力量级是几百万帕放在同一个雅可比矩阵里矩阵最大元素和最小元素相差超过十个数量级数值代数上基本是灾难。针对这种情况唯一的正路是变量归一化。我的做法是分载体归一电网相角除以全网最大相角基准气网压力除以管网额定压力热网温度用供回水温差除以额定温差变成无因次量。这样做之后矩阵的条件数瞬间恢复到可控水平求解器一次迭代就能收敛。这件事在论文里通常只用一句“所有变量标幺化”带过但实际调试时它占了我复现时间的四分之一。5.3 威茅斯方程的平方根带来的非线性震荡气网管道方程里的平方根项是另一个收敛杀手。在联合求解的早期迭代中压力初值如果取得不合适迭代点可能跳到压力平方差为负的区域平方根函数直接失效甚至导致整个迭代矩阵奇异。处理办法有两个层面。第一个层面是初值设计所有气网节点压力初始化为入口压力的90%左右而不是统一给一个固定值这能让首轮迭代的管道流量方向判断正确。第二个层面是方程平滑化在管道方程中用一个近似方法处理开方项也就是把威茅斯方程改写成 $f_{mn}^2 / K_{mn}^2 |\pi_m^2-\pi_n^2|$ 的形式再引入一个很小的非负松弛变量避免绝对值内部为负。这样求解器在迭代过程中表现为两个连续可微函数联立不会因为符号跳变导致矩阵震荡。5.4 耦合设备碰到运行边界时的“临界抖动”热电联产机组的电热可行域是一个凸多边形当优化解落在某个顶点上时KKT乘子会在几条约束的交界处发生数值抖动表现为同一运行点在不同初值下解出的能价略有不同。这种抖动的根源是顶点处存在多条有效约束乘子值在某些约束空间的退化方向上不唯一。解决方式是在优化模型中引入一个极小的人工正则项比如给耦合设备的燃料消耗量加上数值为10的负六次方量级的平方惩罚。这个正则项的规模远小于实际成本不会改变解的经济含义但能有效消除乘子数值上的多重解问题。我在给论文复现做敏感性分析时发现这个细节几乎决定最终价格是稳定在两位数还是在小数点末位飘忽不定。6. 算例验证拿什么系统复现、结果长什么样6.1 测试系统一个微型电-气-热联合网络为了快速验证方法我没有直接上大规模标准算例而是先用了一个自己搭建的微型测试系统电网取IEEE 14节点系统的结构只保留电力部分气网用6节点系统包含两个气源、一条带压缩机的长输管道和四条供气支线热网用8节点系统包含两台热源一台热电联产、一台燃气锅炉供水温度基准设为70摄氏度回水温度按管网计算结果浮动。三个网络的耦合点选了两处第一处是电网节点3、气网节点2、热网节点1接入同一台热电联产机组第二处是电网节点8、气网节点5、热网节点4接入燃气锅炉和一台电锅炉。这样可以同时观察到热电联产“电热同产”和燃气锅炉“纯热转化”两种耦合路径对能价的不同影响。每个节点的负荷设为固定值不引入负荷弹性方便聚焦在价格传导机制上。6.2 基准工况下的潮流耦合结果不加入碳排放成本、碳价为零时系统能耗价格的分布规律与电力系统节点电价高度相似远离主电源节点的电网节点能价偏高这是因为线路传输约束在这些节点附近接近满载气网能价的分布受管道压降影响压缩机下游节点能价明显高于气源节点热网能价的分布则受管道热损耗控制距离热源越远管网散热越大供到负荷端的等效能量成本越高。这个工况还比较容易跑但已经能观察到“真耦合”带来的微妙效应热电联产机组在电网节点3发的电不仅影响电网价格还把气源节点2的天然气价格和热网节点1的热价格拉在了一起。气网节点2的压力如果因为上游气源不足而下降热电联产机组为了维持耗气量就需要抬高购气价格同时机组热出力增加热网节点1的热价反而可能下降。这种跨网络的连锁反应在分网独立求解时几乎不可能被正确捕捉。6.3 碳排放成本进入后的价格分化加入碳价参数后我做了三组对比碳价分别取0元/吨、200元/吨、400元/吨。结果很清楚地显示了碳价传导的非线性。碳价从0升到200时热电联产机组的运行点发生明显变化它的电出力和热出力同时增大把原本由燃气锅炉承担的供热任务抢了过来因为同等天然气量下热电联产的能效更高单位热量的碳排放更低。这个变化直接反映在能价上热网节点4因为离燃气锅炉近热价上升幅度明显大于热网节点1而燃气锅炉所在的天然气节点5和热网节点4的能价变动也呈现几乎相同的趋势。这说明在碳排放成本约束下耦合设备会把碳成本的负担从低效设备转移到高效设备并最终通过所在节点的价格信号呈现给用户。碳价从200再升到400时价格增幅显著放缓原因是系统里已经没有更多的设备调度空间可供优化碳成本的边际影响趋于平缓这时的能价增量基本就是碳价的直接线性传递。这个饱和效应如果不在足够宽的碳价区间里扫描很容易被误读成碳成本对能价没有影响。6.4 对节点能价结果的基本校验我习惯用“扰动校验法”来确认KKT乘子解出来的价格没有理解偏差。做法是把某个节点的负荷增加0.1兆瓦重新求解联合优化模型观察系统总成本的增量再把这个增量除以0.1兆瓦换算成单位能价增量。如果扰动法算出的增量与KKT乘子值偏差在合理范围内就说明能价计算链条没有错误。微型系统的所有负荷节点都通过了这项校验误差基本在0.5%以内。值得警惕的是在校验时不能选择耦合设备所在节点做扰动因为那里的价格受多个网络交互影响扰动法的非线性效应较强容易产生误导性的偏差。校验的对象应该选纯负荷节点。7. 给同样走复现路线的人几条实在建议折腾这一个项目下来最深刻的体会是复现一篇综合能源系统能价计算的论文难点根本不在“看懂公式”而在“让公式里的每个变量在你的代码里活着”。第一条建议不要跳过变量归一化。凡是涉及气网压力、热网温度和电网相角同时出现在一个方程组里的模型不做归一化基本不可能收敛。这件事要在一开始做不要等问题出现了再回头改不然整个代码的重构成本非常高。第二条建议尽量使用成熟的内点法求解器不要试图自己造轮子写KKT求解器。能价计算的核心价值在研究定价机制和网络交互不在数值代数。拿现成的高质量非线性优化库能省掉大量调试时间。第三条建议所有能价结果都要做扰动校验。KKT乘子直接输出的数值有时候看起来合理实际上可能是局部极值点或数值噪声的产物。扰动校验虽然耗时但它是确认价格语义正确的最后一道防线。第四条建议把碳成本从零逐渐升高的扫描作为标准测试项。这个操作能极其有效地暴露模型里的错误逻辑——如果碳价升高后某个节点的能价反而出现大幅度下降几乎可以肯定是耦合设备的碳成本和出力约束拟合出了问题。这套方法跑通之后我对“节点能价”的理解有了明显改变。以前我看它像一套电价的简单外推现在我看它更像一个多网络经济信号的交互描述每一个数字背后都是整个系统在某个运行点上的边际取舍包括燃料、损耗、阻塞、排放以及所有通过耦合设备传递过来的跨网络影响。你要是也卡在电热气多网络能价计算这条路子上不妨沿着这个思路把三个网络先拧成一根绳再谈定价。
阅读完成 · 觉得有帮助?