做了快一年的综合能源系统优化项目我最大的感受是模型本身不难难的是把“利益博弈”这件事用数学语言说清楚。能源集线器Energy HubEH这种多能耦合单元在电热综合能源市场里到底该怎么建模、怎么求解、怎么实现“自己多赚钱”和“系统低成本”的平衡这个项目我前前后后迭代了好几版今天把这套MATLAB下的双层优化模型完整拆开讲一讲。这套模型的核心是围绕一个场景多个能源集线器作为独立市场主体既向电网购电、又向热网售热同时通过内部的CHP机组、电锅炉、储热等设备做能量转换和存储。市场运营商负责出清电、热价格能源集线器根据价格信号优化自身设备出力最后收敛到一个博弈均衡状态。整个过程用双层优化模型来描述上层是市场运营商的成本最小化问题下层是各能源集线器的收益最大化问题。MATLABYALMIP是我实测最顺手的实现组合下面把建模思路、代码结构、避坑经验一次说完。这篇文章适合谁看正在做综合能源系统优化、虚拟电厂调度、电热市场仿真相关课题的研究生和工程师。不需要你很懂博弈论但最好对线性规划、混合整数规划有基本认知。看完你可以直接照着搭一版自己的双层模型。1. 先把问题看透能源集线器在市场里到底是一个什么样的角色1.1 能源集线器的本质与运行逻辑能源集线器的概念最早是由ETH的Geadert等人提出的核心思想听起来很简单把多种能源输入电网电力、管道天然气、热网热量等汇聚到一个“枢纽”里通过内部的转换设备CHP热电联产、燃气锅炉、电锅炉、热泵和存储设备蓄电池、储热罐按照用户侧的需求灵活输出电、热两种或多种能源形式。打个比方能源集线器就像一个“能源路由器”输入端接的是不同形式的能量输出端根据你当天电价多少、热价多少、负荷高低动态决定“这条路多走点电”、“那条路多烧点气”。本质上它解决的是能源形式之间的时间转移和空间转移问题——哪边便宜就多买哪边哪边贵就少用哪边。这个逻辑在单一能源系统里并不复杂但一旦进入市场环境情况就变了。因为能源集线器不再是“成本最小化的执行者”而变成了“追求自身收益最大化的市场参与者”。它要考虑的不仅仅是自己花多少钱买能还包括自己卖能能赚多少钱以及自己的售能行为会不会反过来影响市场价格。从物理层面看能源集线器的关键是设备模型CHP机组输入天然气同时输出电和热存在电热比这个耦合参数电锅炉输入电输出热效率一般在0.9到0.98之间燃气锅炉输入天然气输出热效率通常在0.85到0.95储热罐类似电池但损耗模型比电池更复杂存在自放热率蓄电池充放电效率、容量约束、爬坡约束一个都不能少。这些设备的耦合关系决定了能源集线器在市场上的“报价能力”和“调节能力”。比如一个装备了大容量CHP的能源集线器在电价高的时段可以通过多发电来获得高额电收益同时余热还能卖到热网这就形成了天然的套利空间。1.2 电热综合能源市场的玩法与前因电热综合能源市场简单说就是电和热放在一起交易的市场机制。电市场相对成熟有现货市场、日前市场、实时市场等多级架构热市场则比较特殊因为热网传输距离短、惯性大、启停慢很难像电力那样做到“瞬间平衡”。把两者放一起建模难点在于时间尺度差异和物理约束差异电需要秒级平衡热允许小时级甚至更长时间尺度的波动电网潮流约束尤其是线路容量严格热网的水力、热力约束更复杂。但在规划层面如果我们关注的是“日前的设备出力计划”和“市场价格形成机制”可以用简化模型来近似——电用节点功率平衡热用节点热量平衡外加网络传输容量约束。这种简化是否合理我的判断是在日前调度和中期规划研究里够用。因为我们要回答的核心问题是“能源集线器如何在市场信号下优化自身行为”而不是“热网管道里的水力瞬变过程怎么分析”。传统做法里能源集线器一般都作为“价格接受者”——给定电价、热价优化内部设备出力追求购能成本最小。这在集中式调度里没问题但在市场环境下有明显缺陷价格不是给定的价格是由所有参与者共同决定的。当你这个能源集线器的规模足够大或者参与市场的EH数量足够多时你的出力决策会影响市场出清价格这时候必须采用“价格影响者”的视角来建模。这就是双层模型出现的根本原因上层市场运营商根据所有EH的申报/出力情况出清价格下层EH根据出清价格调整出力两层之间形成循环迭代的博弈关系。1.3 为什么一定要上双层结构单层模型说不清博弈我在初版模型里也犯过这个“懒”把所有能源集线器的收益加在一起减去系统总成本得到一个“社会总福利最大化”的单层目标函数一次求解就完事。结果做出来之后怎么都感觉不对。问题出在哪里单层模型假设所有参与者会无条件配合系统整体目标但这与实际市场机制不符。现实中每个能源集线器只会关心自己的收益不会因为“社会总成本”更小就主动降低自己的报价或调整出力。如果某个方案对系统最优但对某个EH不利那个EH根本不会执行。双层模型解决的就是这个问题。它把决策过程分层建模上层Leader市场运营商制定电、热出清价格目标是让系统运行成本最小或者让社会福利最大下层Follower各能源集线器在给定价格下独立优化自身收益确定购电、购气、产热、售热等决策。两层之间通过“市场价格”这个信号耦合价格影响下层的优化决策下层的优化结果反过来又影响上层的出清价格。最终收敛到Stackelberg博弈均衡。这种结构与现实的市场交易流程是对应的日前市场先由运营方发布预测负荷和价格信号各市场主体根据价格申报自己的购售能计划运营方汇总后统一出清确定最终价格和出力计划。有了双层模型我们就能在这个流程里回答很多实际问题单个EH该怎么报价多个EH竞争时市场均衡在哪里加装储能设备对市场均衡有什么影响2. 模型架构设计如何用数学语言描述“最大收益与最小成本平衡”2.1 上层市场运营商的成本最小化与社会福利最大化上层的目标函数我采用的表述是系统运行成本最小化也就是从运营商视角看要让整个区域的供电、供热成本尽可能低同时保证供需平衡。这个成本包括向上级电网购电的成本、向天然气网购气的成本以及各能源集线器售电售热给终端用户后运营商需要支付给它们的购能成本。从社会福利的角度上层目标等价于最大化“用户效用减去供能成本”。数学模型可以写成如下形式以市场运营商为主体目标最小化系统总供能成本 $C_{buy}^{elec} C_{buy}^{gas} C_{buy}^{EH_heat}$约束电力平衡约束、热力平衡约束、电网购电上限、天然气限购量、热网节点压力/温度简化约束。这里一个关键的细节是上层决策变量是“出清价格”但价格本身不能直接作为一个自由变量无约束地优化。因为如果价格是自由的上层会倾向于把价格压到最低这样虽然系统成本小但下层能源集线器必然亏损退出就没有市场主体愿意参与市场了。所以必须有下层参与约束保证每个能源集线器在市场出清价格下能获得不低于其“不参与市场”时单独运行成本最小化的收益。这个约束被称为“参与约束”或者“个体理性约束”是双层优化中的一个核心难点。我把上层成本最小化目标写成如下简化形式[ \min \quad \sum_{t} \Big( \rho_t^{e,buy} P_t^{buy} \rho_t^{g} F_t^{gas} \rho_t^{h} Q_t^{EH,heat} \Big) ]其中 (\rho_t^{e,buy}) 是运营商从外部网购电的价格(\rho_t^{g}) 是天然气价格(\rho_t^{h}) 是热市场出清价格。(P_t^{buy}) 是外购电功率(F_t^{gas}) 是天然气总消耗量(Q_t^{EH,heat}) 是所有EH卖给热网的总热量。2.2 下层能源集线器的收益最大化决策下层的主语是每个能源集线器 (i)。它的目标函数非常直接总收益最大化。总收益包括三部分售电收益将内部发电CHP在满足自身电负荷后卖给电网售热收益将CHP余热和燃气锅炉产热卖给热网省下来的购能成本原本需要从电网买电、从气网购气现在一部分由内部机组自产满足。对应的成本项包括购电成本、购气成本、设备运行维护成本、启停成本如果模型里考虑。单一个EH的优化问题写出来是这样的[ \max \quad \sum_{t} \Big( \pi_t^{e,sell} P_{i,t}^{sell} \pi_t^{h} Q_{i,t}^{heat,sell} - \pi_t^{e,buy} P_{i,t}^{buy} - \pi_t^{g} F_{i,t}^{gas} \Big) ]其中 (\pi_t^{e,sell}) 是EH向电网售电的价格(P_{i,t}^{sell}) 是其售电功率。注意这里 (\pi_t^{e,sell}) 和 (\rho_t^{e,buy}) 不是同一个东西——上层出清电价时会有买入价和卖出价之分这个价差是运营商利润空间也是市场机制设计里研究的热点。下层约束包括电功率平衡CHP发电 蓄电池放电 购电 电负荷 电锅炉耗电 蓄电池充电 售电热功率平衡CHP产热 燃气锅炉产热 储热罐放热 热负荷 储热罐充热 售热设备容量约束每种设备的出力上下限爬坡约束CHP、锅炉的爬坡率限制储能设备动态约束SOC荷电状态/蓄热状态动态方程。一个容易踩坑的地方是下层是多EH的每个EH有自己独立的优化问题但它们之间通过上层市场的总需求/总供给耦合在一起。也就是说下层不是一个单一的优化问题而是多个并列的优化问题。求解的时候要么把多个下层问题用聚合的方式处理要么引入迭代算法逐一求解。2.3 平衡策略的具体实现从“你死我活”到博弈均衡“最大收益与最小成本平衡”这句话听起来像是在找两条曲线的交点。实际做起来确实是这样。在这个模型里“最大收益”是每个下层EH的目标“最小成本”是上层运营商的追求。两者是矛盾的运营商想让系统成本最小所以倾向于压低热价、降低向EH购热的成本但热价压低之后EH的售热收益下降就可能减少产热甚至退出市场导致系统热缺口运营商不得不启动更贵的备用热源成本反而上去了。平衡点在哪里在“价格刚好能激励EH提供足够的热量/电量同时系统的总购能成本不至于过高”这个位置。数学上这个平衡点就是Stackelberg博弈的均衡解。求解这个均衡MATLAB里的实现路径我最推荐的方法是通过KKT条件把下层优化问题转化为上层的约束然后采用强对偶定理处理双线性项把整个双层模型转化为单层MPEC带均衡约束的数学规划问题。这一步是整套代码的“题眼”会在下一章详细展开。另外需要强调的是平衡策略不是简单地在目标函数里把“收益最大”和“成本最小”加一个加权系数那样做是在“和稀泥”不是在“找均衡”。真正的平衡是市场机制产生的结果——每个主体都按自己的利益行事最终达到一种“谁都没动机单方面改变策略”的状态也就是博弈论里说的Nash/Stackelberg均衡。3. MATLAB实现与求解路径从模型到代码的完整落地3.1 求解思路选型为什么我选了KKT强对偶转MPEC双层优化问题的求解学术界和工业界有几条路线路线一把下层问题用KKT条件替换转化为单层MPEC问题再用商业求解器CPLEX、GUROBI求解路线二采用启发式迭代算法比如粒子群、遗传算法外层搜索价格内层求EH最优响应路线三用CCG列与约束生成或者Benders分解把双层问题拆成主问题和子问题迭代求解路线四使用元模型或强化学习比如用DQN、PPO训练出价格-出力响应函数嵌入上层模型。路线一最贴近传统优化框架求解可控性最好而且在目标函数和约束都是线性的情况下转化出来的MPEC是一个MILP或MIQP商业求解器可以直接处理。我最终选的就是这条路径。转化过程分三步第一步写出下层EH优化问题的Lagrangian函数。每个EH的优化问题是一个线性规划如果储能连续性建模则是LP离散则需处理对应有等式约束的对偶变量 (\lambda) 和不等式约束的对偶变量 (\mu)。第二步写出KKT条件拉格朗日函数对各决策变量梯度为零stationarity、原始可行性primal feasibility、对偶可行性duality feasibility、互补松弛条件complementary slackness。其中互补松弛条件是非线性的形式是 (\mu \cdot g(x) 0)。第三步处理非线性项。互补松弛条件是大麻烦(\mu \cdot (P_{max} - P) 0) 这种乘法项直接扔给求解器会得到一个非凸问题。解决办法是引入二进制变量用Big-M法把互补松弛条件线性化把问题变成MILP。强对偶在这里的作用是用来处理上层目标函数里“价格 × 下层出力”这种双线性项。上层目标函数里含有 (\pi_t^{h} Q_{i,t}^{heat,sell})而下层的 (Q_{i,t}^{heat,sell}) 又是下层决策变量这就导致上层问题中出现了两个变量的乘积是非线性的。利用强对偶条件下层EH的最大收益可以通过其对偶问题的目标函数等价表示从而把双线性项转化成只含对偶变量的线性表达式。这个转化过程是整个模型最核心、也最容易出错的一步。网上不少论文直接跳过推导过程导致读者自己复现时怎么都对不上。我这里把关键步骤的直觉讲清楚强对偶的核心是用“对偶函数值等于原问题最优值”这个性质替换掉下层问题的最优目标值从而消去上层问题里的决策变量耦合项。3.2 YALMIP环境配置与变量定义用MATLAB做优化建模如果不用YALMIP那就是在给自己找麻烦。YALMIP是瑞典Lund大学的Lofberg开发的一个免费优化建模工具箱统一封装了CPLEX、GUROBI、MOSEK等底层求解器的接口写约束、查结果都非常顺手。环境配置方面我自己的开发环境是MATLAB R2023bYALMIP最新版从GitHub或者官网拉取更新频繁建议版本R2021之后的求解器GUROBI 10.0学术许可免费MILP和MIQP性能都很强备选求解器CPLEX 12.10、MOSEK如果你主要做二阶锥规划MOSEK很好用。安装YALMIP很简单下载后把文件夹加入MATLAB路径即可。不需要额外编译。但有一个地方要记得YALMIP和MATLAB版本之间有兼容性差异比如R2023b下建议用较新的YALMIP版本否则有时会报“Unable to determine solver”之类的奇怪错误。变量定义这一步我习惯按模块组织% 每个时段的变量 n_h 24; % 调度时段数 n_eh 3; % 能源集线器数量 % 决策变量定义YALMIP风格 P_buy sdpvar(1, n_h, full); % 运营商外购电功率 F_gas sdpvar(n_eh, n_h, full); % 各EH天然气耗量 P_chp sdpvar(n_eh, n_h, full); % 各EH燃气机组发电功率 H_chp sdpvar(n_eh, n_h, full); % 各EH燃气机组产热功率 Q_sell sdpvar(n_eh, n_h, full); % 各EH售热功率 P_buy_eh sdpvar(n_eh, n_h, full); % 各EH从电网购电功率 P_sell_eh sdpvar(n_eh, n_h, full); % 各EH向电网售电功率 SOC_heat sdpvar(n_eh, n_h, full); % 各EH储热罐热状态这里有几个容易踩坑的细节sdpvar默认是方形矩阵要定义非方阵需要显式加full参数2维变量矩阵的行列含义要固定我习惯行EH编号列时段后面所有约束引用行列时统一用(i, t)避免写混对偶变量的定义要先理清楚等式约束对应dual类型变量不等式约束对应dual且带符号约束。3.3 单层MPEC的目标函数与约束构建把下层EH优化问题全部转为KKT条件之后原本的“上层问题包含多个下层优化”就变成了“上层问题包含一组KKT约束”。这个单层模型的结构是目标函数上层目标线性化之后约束上层本身的约束 每个EH的原始可行性约束 发电机/储能设备的容量约束 对偶可行性约束 线性化的互补松弛约束求解器直接调用GUROBI求解MILP核心的KKT转换代码我用一个函数来组织避免把主脚本撑爆function [Constraints, obj_expr] build_EH_kkt(eh_idx, P_chp, H_chp, ...) % 输入EH索引、相关决策变量 % 输出KKT线性化约束、目标函数中对偶表达式 Constraints []; % 该EH的电平衡约束 eq_power P_chp(eh_idx, :) P_buy_eh(eh_idx, :) ... - P_boiler_e(eh_idx, :) - P_sell_eh(eh_idx, :) ... P_batt_dch(eh_idx, :) - P_batt_ch(eh_idx, :) ... P_load(eh_idx, :); % 产生对偶变量 lambda_p dual(eq_power); % 关键点dual()函数用于设置对偶变量 % 设备出力上限约束 upper_p P_chp(eh_idx, :) P_chp_max(eh_idx, :); mu_upper dual(upper_p); % 互补松弛线性化Big-M方法 M 1e5; % Big-M 参数需要反复调 z_comp binvar(n_h, 1); % 引入二进制辅助变量 Constraints [Constraints, ... upper_p, ... mu_upper 0, ... P_chp_max(eh_idx, :) - P_chp(eh_idx, :) M * (1 - z_comp)];Big-M参数选取是特别需要关注的。M取值太小会导致约束失效得到一个不真实的解M取值太大会让MILP的松弛问题数值病态求解时间剧增甚至不可行。我个人的经验是M的取值要比所有相关变量的量级大1到2个数量级即可。比如设备出力上限是500M取1e4到1e5就够。另外在每个互补松弛项里设置独立的Big-M比全局共用一个M要更稳定虽然代码写起来麻烦一点但求解器收敛速度快很多。3.4 迭代出清主流程与结果分析模型搭建完之后主程序的结构大致是这样的输入基础数据设备参数、负荷曲线、外购能源价格初始化设置出清价格初值比如取历史均值构建YALMIP模型加入所有变量、约束和目标函数调用求解器求解MILP提取结果包括出清价格、各EH的出力计划、各设备运行状态校验检查各EH的KKT残差、互补松弛是否满足若残差过大则调整Big-M或模型系数重新求解输出结果到表格和绘图。主程序的调用代码大概是% 构建优化模型 Constraints []; Objective 0; % 上层目标 Objective Objective sum(rho_e_buy .* P_buy) sum(rho_g * sum(F_gas, 1)) ... sum(rho_h .* sum(Q_sell, 1)); % 添加所有EH的KKT约束 for i 1:n_eh [c, obj_i] build_EH_kkt(i, P_chp, H_chp, ...); Constraints [Constraints, c]; Objective Objective obj_i; % 强对偶转化后的下层目标表达式 end % 上层约束 Constraints [Constraints, ... P_buy 0, P_buy P_buy_max, ... sum(Q_sell(:, t)) sum(H_boiler(:, t)) H_demand(t), ... ...]; % 求解 options sdpsettings(solver, gurobi, verbose, 2, debug, 1); optimize(Constraints, Objective, options);这里面最需要注意的是调试模式。YALMIP的debug选项设为1可以在模型不可行时告诉你哪个约束导致了冲突这在排查KKT转换错误的时候是救命的功能。4. 参数与算例3个能源集线器跑出来的平衡效果4.1 算例设定与设备参数我验证模型用的是一个小规模算例3个能源集线器1个市场运营商调度周期为24小时单位时段为1小时。三个EH的设备配置略有差异目的是观察不同技术路线在同一个市场环境下的博弈表现。具体参数如下参数EH1EH2EH3CHP容量kW300500200电锅炉容量kW200100250燃气锅炉容量kW400300500储热罐容量kWh500300400电负荷峰值kW320380280热负荷峰值kW280360300CHP的电效率设定为0.35热效率0.45总效率0.8供电煤耗成本折算成天然气价格波动情景储热罐自放热率3%/h充放热效率95%。外购电价采用分时电价峰时1.05元/kWh平时0.68元/kWh谷时0.32元/kWh。热网侧运营商对EH制定的购热价格是决策变量初始区间设在0.25到0.5元/kWh之间。这些数据不是随便填的。CHP的电热比大约0.78这是在0.35/0.45效率比下算出来的储热罐容量取“能覆盖该EH约2小时峰值热负荷”这个尺度在工程实践里比较常见。你如果自己跑算例不需要完全照搬但参数之间的量级一致性要保证否则算出来的均衡价格会偏离合理范围。4.2 典型日结果价格怎么变设备怎么动求解完成后我重点观察了三类结果出清价格曲线、各EH的购售电热计划、储能设备的运行状态。一个比较有代表性的结果在夜间低谷电价时段0点到6点电价低至0.32元/kWh三个EH都不约而同地选择“多买电、启动电锅炉产热、把热卖给热网或者存入储热罐”。这个行为逻辑非常直接电锅炉的产热成本大约等于电价除以电热效率大约0.32/0.95≈0.34元/kWh而热价出清价格在0.31到0.35元/kWh区间刚好有微利可图。白天电价升高后CHP成为主力机组因为它每发1度电的同时还能产出约0.78度热摊薄下来综合成本明显低于燃气锅炉单独产热。这个结果说明了一个很重要的机制能源集线器在电热市场里不是“被动响应者”而是在主动寻找电-热之间的价差套利空间。当电价低时它用电制热当电价高时它用CHP同时产电产热。这个策略转变不需要任何人告诉它只是价格信号变化后优化模型自动作出的决策。这就是市场机制的魅力也是双层模型的输出价值所在。再看成本与收益的平衡点。初始迭代中运营商把热价压到0.26元/kWh结果EH2CHP容量最大的那个减少售热转向更多售电热网出现缺口运营商被迫从备用燃气锅炉补热系统总成本反而上升了。经过第3轮价格调整热价稳定在0.33元/kWh附近时所有EH的售热意愿和运营商的热成本取得了一个微妙的平衡——EH2售热收益达到预期热网不缺口系统总成本也比低价策略下降了约7%。这个算例直接证明了“最小成本不等于最低价格”系统成本最小化的价格往往不是对供应商压价最狠的价格而是能激励供应商高效供给的“激励价格”。这个认知对做热电市场机制设计的人尤其重要。4.3 双层模型与集中式模型的结果对比为了说明双层模型的价值我把同一个算例改成了单层集中式优化目标设置为系统总成本最小化但决策权集中各EH没有独立的收益目标。对比结果用一个表列出来指标集中式优化双层博弈均衡差异系统总运行成本元12850134204.4%EH1收益元81094616.8%EH2收益元1020113411.2%EH3收益元64072613.4%热出清价格均值元/kWh0.280.3317.9%电网售电收益元42503980-6.4%集中式优化下系统成本更低是因为它把利益分配权也“集中”了本质上牺牲了部分市场主体的利益来换取整体最优。但在真实市场里这样的结果不可持续——收益分配不均会直接导致部分主体拒绝参与或者退出市场。双层博弈均衡结果虽然系统总成本高了约4%但每个EH的收益都有明显提升运营商通过购售电和购售热差价仍然有稳定盈利整体是可持续的市场均衡。这里有一个重要的工程启示如果你做的项目只是企业内部的多能互补调度不涉及多个独立利益主体用集中式优化完全没问题但只要涉及多主体参与的市场环境就必须用双层模型或者多代理博弈模型。这个边界想不清楚后面做了多少优化工作都可能白费。5. 常见问题排查与复盘心得5.1 双层模型求解中最容易翻车的5个坑这套模型我做了好几版每次出问题都集中在相似的位置这里整理最典型的5个坑。第一互补松弛条件线性化用的Big-M值不合适。这个问题最隐蔽M太小最优解被错误截断模型得到一个“假的最优值”结果看起来合理但实际不满足KKT条件M太大数值病态求解时间指数级增长。我的经验是先用小规模算例做敏感性分析观察M从1e2到1e7变化时最优解怎么变选一个最优解不再明显变化且求解时间可接受的区间。第二对偶变量符号方向搞反。KKT条件里不等式约束 (\leq) 对应的对偶变量要满足 (\geq 0) 的符号约束写反了会导致对偶可行性约束失效。这是KKT代码里最典型的笔误排查方法是用一个小规模的线性规划验证单独求解下层问题然后用dual()提取对偶变量值去核对KKT条件是否满足。第三强对偶替代之后遗漏了“原问题目标函数必须等于对偶问题目标函数”这个条件。没有这个等式约束转化后的数学模型不等价于原双层问题求出的解没有经济解释。这个等式约束要显式加在MPEC模型里很多初学的人会漏掉。第四多个下层问题同时进入MPEC时变量索引写串。比如EH1的CHP出力写成了EH2的或者时段索引写错这类错误轻则结果错乱重则模型维数爆炸。我的经验是所有变量都定义成(eh_idx, time_idx)的统一索引并在构造约束时用循环变量明确引用不要凭“记忆”写下标。第五求解器直接报“Infeasible problem”却又找不到原因。这种情况九成是约束冲突而不是模型表达问题。先用YALMIP的debug模式定位冲突约束再逐个检查约束的量纲是否一致。我之前就犯过把功率单位MW和kW混用的错误导致一组设备容量约束互相矛盾花了两天才排查清楚。5.2 平衡策略的参数敏感性分析心得模型跑通之后我对几个关键参数做了敏感性分析这里分享两个最有价值的发现。一个是储能容量对均衡价格的影响。把储热罐容量从200kWh逐步增加到900kWh系统热出清价格下降了约12%EH的总收益只上升了约8%。储能增加对系统整体是“压价”的因为储热让EH可以在低价时段多蓄热、高价时段少产热降低了高价时段的供给紧缺程度。但这个收益中有一部分被“压价效应”吃掉了储能的投资回报率并没有直觉那么高。这对做储能规划的人是一个提醒收益预测不能只看设备本身的套利空间还要考虑它对市场价格的反馈影响。另一个是天然气价格波动对博弈均衡的影响。天然气价格从2.0元/m³涨到3.0元/m³时CHP发电成本显著上升三个EH都减少了CHP出力电价出清价格上涨热价也随之上涨最终系统总成本涨幅达到22%。这说明在天然气依赖度较高的系统里气价波动会沿着“CHP成本→电力价格→热力价格”的链条传导到整个系统出现电热联动涨价。设计市场机制时这部分风险传导需要被明确考虑否则在极端气价下可能出现市场主体大面积亏损甚至退出。5.3 模型还可以往哪个方向扩展最后聊一下扩展方向如果你打算在这个基础上继续做我个人觉得有三个方向性价比最高。第一加入网络约束。当前模型是“单节点输能容量约束”的简化假设适合区域级市场。如果做城市级或者园区级的实际系统电网潮流和热网水力特性往往不能忽略可以在下层加入热网管道约束和电网潮流约束模型会变成双层网络优化求解复杂度上一个台阶但更能贴近工程现实。第二加入不确定性。用随机规划或者鲁棒优化处理风光出力和负荷预测误差可以分析市场在不确定环境下的均衡偏移。我试过用场景生成的方法把风电出力场景砍到30个左右双层模型依然能在可接受时间内求解但随机场景增多后MPEC规模增长很快需要配合场景削减技术。第三引入碳交易机制。给电热市场加入碳价和碳配额约束之后EH的行为决策会发生变化——高碳的CHP机组和燃气锅炉受到约束而电锅炉在电力结构清洁化背景下相对更占优。这个方向正好契合当前政策导向相关论文的发文热度也在明显上升。最后说一点个人体会。做这个项目最深的感触是真正的难点不在MATLAB代码本身而在于你是否理解“市场主体理性”这件事。代码只是把博弈逻辑翻译成求解器能识别的数学形式翻译完之后求解器会告诉你一个冷冰冰的均衡价格和一套出力计划。但如果你不理解为什么均衡会落在那里遇到结果不合理时就会无从下手。把经济逻辑和数学求解结合起来才是这类项目真正的核心能力。这套代码我反复迭代了三个版本每一步都是从报错和不符合预期的结果里打磨出来的如果你也在做类似的问题希望这篇内容能帮你少走几个我当时走过的弯路。