ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

风光氢多主体合作运行:纳什谈判与ADMM分布式优化实现

风光氢多主体合作运行:纳什谈判与ADMM分布式优化实现 1. 为什么风、光、氢三个主体需要“坐下来谈判”国内做新能源系统仿真的研究者对“风–光–氢”这个组合一定不陌生。风电和光伏出力随机波动、氢能系统负责消纳和储能看起来是天然互补的一对搭档。但真正把三个主体放在同一个系统里做联合运行优化时你会发现一个很现实的问题它们不是一个“主人”在调度而是三个独立利益主体在博弈。风电想多发多赚光伏也想多发多赚氢能又希望低价买电、高价卖氢各自的诉求完全拧着。这时候如果还用传统的“集中式调度”思路——把三个主体打包成一个大系统用目标函数统一优化——从数学上当然没问题但工程上落不了地。因为风电、光伏、氢能背后往往是不同的投资主体甚至是不同的公司谁也不愿意把自己的运行数据、成本信息完全交给对方更不愿意接受“一个中心”替自己做决策。这种场景下“合作博弈”和“谈判”的思路就派上了用场。所谓合作运行不是靠行政命令强行撮合而是让每个主体先明确一个问题*如果我不参与合作单打独斗能赚多少*这个收益就是我的“谈判底线”。然后大家再坐下来谈合作之后整体收益增加了增加的部分怎么分才能让每个人都觉得“合作比单干强”而且分法要公平到没人想退出。这正是纳什谈判理论Nash Bargaining Theory解决的核心问题。我这套MATLAB代码做的就是把风–光–氢三个主体的合作运行问题用纳什谈判建模再用ADMM交替方向乘子法做分布式求解整体逻辑清晰、可复现性强适合研究“多主体能源系统”“分布式优化”“合作博弈论”方向的研究生和工程师作为起步框架。要理解这套代码得先看懂三个问题一是为什么合作能产生额外收益二是纳什谈判怎么把这个“额外收益分配”变成数学公式三是ADMM怎么保证三个主体守住各自的成本信息还能协同收敛。接下来我逐一拆开讲。2. 三个主体的“脾气”风电、光伏、氢能的运行特性与利益诉求2.1 风电和光伏出力随机但边际成本低风电和光伏在运行层面最突出的特点是燃料成本几乎为零但出力完全看天吃饭。风电受风速影响光伏受光照影响功率曲线都是强波动、强随机。在MATLAB里模拟这种特性一般用非参数核密度估计或者历史数据的场景缩减生成典型日出力曲线。我代码里用的是Weibull分布模拟风速再映射到风机功率曲线Beta分布拟合光照强度这套经典做法在学术论文里很常见胜在参数少、解释性强。风电和光伏的利益诉求非常简单纯粹在满足技术约束的前提下尽可能多发电、多卖出。因为它们边际成本趋近于零多发的每一度电都接近纯利润。也正因为如此它们在谈判中会非常在意“你氢能凭什么用那么低价收购我的电我直接卖给电网不是更赚”2.2 氢能系统既能“吃”电又能“吐”电/气氢能系统是这个组合里的“弹性缓冲”它由电解槽、储氢罐、燃料电池组成。电解槽把电能转化为氢能储存燃料电池再把氢能转化回电能或者直接把氢气卖给工业用户相当于一个可双向调节的“能量路由器”。氢能主体的利益诉求和风光不同。它更在意的是买电价格够不够低、氢价够不够高、设备启停次数能不能少一点——因为电解槽和燃料电池的设备损耗、启停成本在总成本里占相当比重。氢能单干不是不行直接从电网买电制氢但电网电价波动大高峰期买电制氢基本不赚钱。只有跟风光合作靠长期协议锁定时段内的低价绿电氢能的利润空间才能打开。2.3 矛盾点不合作时系统整体收益小于合作潜力把三者放在一起看矛盾就很清晰了主体单干时的策略单干的痛点合作后的收益来源风电全额上网卖给电网电网收购价波动、限电风险氢能低价消纳多余电量减少弃风光伏全额上网卖给电网午间出力高峰与电网负荷错配氢能吸收午间光伏富余电量提高消纳氢能从电网购电制氢电价高、受市场波动影响大获取低价绿电、设备利用率提升但这里有个关键前提合作产生收益需要满足一个成本条件——氢能消纳风电、光伏的电量必须能满足氢能自身“购入低价电→产出高价氢”的利润要求。如果风电光伏报出的电价太高氢能宁可去买电网电如果报得太低风电光伏又觉得不如卖给电网。谈判的实质就是在这个双重约束下找到一个均衡电价值。而传统集中式优化只能告诉你“全局最优解是X”说不清楚这个解为什么公平、为什么各方愿意遵守。这正是纳什谈判理论介入的核心意义。3. 纳什谈判理论从“分蛋糕”到一组可计算的方程3.1 谈判破裂点谁掌握了“离场收益”谁就掌握底线纳什谈判理论的第一步是计算每个主体的“谈判破裂点”disagreement point。数学上记作 $d_i$代表第 $i$ 个主体不参与合作时能获得的最大收益。这是整个博弈的“底线设定”——任何合作分配方案如果让某个主体的收益低于 $d_i$这个主体一定会选择退出谈判。我们回到代码里的具体设置。风电、光伏单干时最优策略就是“全电量上网”按上网电价卖电收益就是发电量乘以上网电价氢能单干时按电网实时电价买电制氢。把这三个“单干最优收益”求出来就构成了破裂点向量 $\mathbf{d} [d_{WT}, d_{PV}, d_{H_2}]$。破绽点的重要性很容易被新手低估。因为一旦谈判破裂点计算不准后面的所有分配结果都会失真。比如风电的上网电价用的是燃煤基准价还是竞价均价氢能的购电电价用的是实时电价还是峰谷平均价这些参数的选择会直接改变破裂点数值进而改变谈判结果。3.2 纳什谈判解的数学表达最大化合作收益的乘积在得到破裂点之后纳什谈判模型的目标函数是最大化各主体合作收益增量的乘积$$\max \prod_{i}(U_i - d_i)$$约束条件是 $U_i \geq d_i$即每个主体的合作收益不能低于单干收益。其中 $U_i$ 是第 $i$ 个主体合作后的实际收益。这里有一个非常直观的理解方式这个目标函数把“效率”和“公平”融合在了同一个数学表达式里。$\prod(U_i - d_i)$ 被最大化时均衡解一定是Pareto最优的——也就是说不存在另一个分配方案能在不降低某个主体收益的前提下提高其他主体的收益。同时解也自然满足“每个主体都比单干好”的个体理性约束因此是一个各方自愿执行、无需外部强制力的可执行协议。在实际数学处理中由于目标函数是乘积形式直接求导可以转成对数求和$$\max \sum_{i} \ln(U_i - d_i)$$这本质上是等价变换但在代码实现中能让梯度计算更稳定尤其在和ADMM结合时分离各主体子问题的形式更清晰。3.3 本文的模型具体到风–光–氢系统要优化什么变量落到代码的模型层面“纳什谈判”只是上层框架三层嵌套结构才是完整逻辑第一层主体层每个主体维护自己的本地变量。风电和光伏的决策变量是出力电功率 $P_{WT,t}$、$P_{PV,t}$以及卖给氢能的电量 $P^{H_2}{WT,t}$、$P^{H_2}{PV,t}$氢能的决策变量是电解槽输入功率 $P_{EL,t}$、燃料电池输出功率 $P_{FC,t}$、储氢罐充放能 $S_{H_2,t}$。第二层功率交互层风光卖给氢能的电量必须满足功率平衡等式即氢能从风电、光伏购电之和等于电解槽总输入这里做了简化先不考虑制氢的电力转化效率损失工程上可以乘一个效率系数 $\eta_{EL}$。第三层谈判目标层目标函数是对数收益增量之和收益增量来自三个渠道——风光的电费收入卖给氢能上网、氢能的售氢收入减去购电成本和生产成本。这三层结构对应到ADMM算法里非常自然每个主体独立求解本地子问题通过耦合变量交互功率和电价交换信息迭代逼近全局均衡。4. MATLAB代码架构从数学模型到可运行程序4.1 整体框架设计让代码结构贴合问题结构我写这套代码时刻意没有把三套模型揉进一个大函数里而是采用“主程序 三个子问题模块 耦合协调模块”的框架。因为多主体分布式优化的核心就是“各算各的”代码结构如果不按主体拆分ADMM迭代就完全没有意义——你连子问题的边界都找不到。具体文件划分如下main_nash_admm.m主程序设置系统参数、初始化变量、启动ADMM循环、输出结果。obj_fun_WT.m、obj_fun_PV.m、obj_fun_H2.m三个主体的子问题目标函数。solve_WT_subproblem.m、solve_PV_subproblem.m、solve_H2_subproblem.m三个主体子问题的求解函数。init_system.m系统参数初始化包括风机、光伏、电解槽、燃料电池的容量与成本参数。generate_scenario.m生成风电、光伏出力场景数据基于Weibull和Beta分布。主程序的ADMM循环是整套代码的心脏核心逻辑如下% ADMM参数初始化 rho 1e-3; % 惩罚因子 max_iter 200; % 最大迭代次数 tol 1e-4; % 收敛阈值 % 初始化耦合变量与拉格朗日乘子 P_exchange zeros(T, 3); % 每时段风电/光伏卖给氢能的功率 lambda_multi zeros(T, 3); % 拉格朗日乘子注意是向量 for iter 1:max_iter % Step1: 风电主体本地优化输入上一次迭代的P_exchange和lambda [P_WT_opt, obj_WT] solve_WT_subproblem(P_exchange(:,1), lambda_multi(:,1), params); % Step2: 光伏主体本地优化 [P_PV_opt, obj_PV] solve_PV_subproblem(P_exchange(:,2), lambda_multi(:,2), params); % Step3: 氢能主体本地优化输入风电/光伏的交互功率更新值 [P_EL_opt, obj_H2] solve_H2_subproblem(P_exchange, lambda_multi, params); % Step4: 更新耦合变量交互功率的一致性约束 P_exchange_new P_exchange; P_exchange_new(:,1) P_WT_to_H2; % 风→氢 P_exchange_new(:,2) P_PV_to_H2; % 光→氢 % Step5: 计算原残差和对偶残差判断是否收敛 primal_res norm(P_exchange_new - P_exchange, fro); dual_res rho_outer * norm(P_exchange_new - P_exchange_prev, fro); if primal_res tol dual_res tol break; end % Step6: 更新拉格朗日乘子 lambda_multi lambda_multi rho_outer .* (P_exchange_new - P_exchange); P_exchange P_exchange_new; P_exchange_prev P_exchange; end这里有个重要的实现细节ADMM循环中有两个耦合变量——物理层面的交互功率 $P_{WT\to H_2}$、$P_{PV\to H_2}$以及经济层面的“电价”。纳什谈判中的电价不是外生给定的而是作为对偶变量在迭代中天然涌现出来的。如果你只更新功率而把电价当常量那本质上还是集中优化的变体谈判分配的公平性完全丢失。正确做法是构建广义纳什均衡的KKT条件把风电、光伏的电价报价作为本地子问题的决策变量与功率一起参与迭代。4.2 风电和光伏子问题最大化电费收入风电子问题的目标函数可以写成$$\max ; \left( c_{WT\to grid} \cdot P_{WT\to grid} c_{WT\to H_2} \cdot P_{WT\to H_2} \right) \frac{1}{2\rho} \left| P_{WT\to H_2} - P_{WT\to H_2,ref} \lambda \right|^2 $$其中第一项是实际收入$c_{WT\to grid}$ 是上网电价$c_{WT\to H_2}$ 是风电卖给氢能的电价由谈判决定。第二项是ADMM惩罚项作用是保证迭代过程中交互功率逐步逼近一致值。约束条件是$$0 \leq P_{WT\to grid} P_{WT\to H_2} \leq P_{WT,available,t}$$即总出力不能超过该时段可用的风光资源。这个子问题是一个带线性约束的二次规划MATLAB里用quadprog就能解非常高效。4.3 氢能子问题利润最大化的能量管理氢能子问题比风光的复杂一些因为它涉及储氢设备的能量平衡。目标函数是$$\max \left( c_{H_2\to load} \cdot V_{H_2\to load} - c_{H_2\to buy} \cdot P_{EL} - c_{FC,oper} \cdot P_{FC} - c_{start/stop} \cdot N_{switch} \right)$$约束条件包括电解槽输入功率上限$0 \leq P_{EL,t} \leq P_{EL}^{max}$燃料电池输出功率上限$0 \leq P_{FC,t} \leq P_{FC}^{max}$储氢罐储量动态$S_{H_2,t} S_{H_2,t-1} \eta_{EL} \cdot P_{EL,t} - \frac{P_{FC,t}}{\eta_{FC}} - V_{H_2\to load}$储氢罐容量约束$S_{H_2}^{min} \leq S_{H_2,t} \leq S_{H_2}^{max}$这个子问题本质是一个动态规划或混合整数线性规划MILP因为启停次数 $N_{switch}$ 引入了0-1变量。我代码里为了兼顾求解速度和代码可读性把启停成本做了松弛处理——用连续变量配合惩罚项近似防止频繁启停。如果你们做的是完整工业场景建议直接用intlinprog处理0-1变量只是迭代时间会明显增加。这里我强烈建议大家注意一点储氢罐的初始和末态储量要设成同一个值否则氢能主体会“薅羊毛”——把初期储量全部放空换来高收益而在迭代末期完全不储氢。周期性约束是谈判模型公平性的重要保障。4.4 耦合协调与电价涌现ADMM如何一步步“谈出”均衡电价整个迭代过程中最精彩的部分是均衡电价的渐进生成。不妨想象这样一个场景风电主体第一次报价0.35元/kWh氢能主体觉得太贵选择从电网买电风电发现自己卖不出去于是下一轮降价光伏涨价、氢能接价……经过多轮迭代价格稳定在“比电网便宜一点、比风光上网价高一点”的水平。这就是谈判的动态过程也是ADMM迭代的直观解释。代码实现中电价更新遵循如下公式$$c_{WT\to H_2}^{(k1)} c_{WT\to H_2}^{(k)} \rho \left( P_{WT\to H_2}^{(k)} - P_{EL}^{(k)}/2 \right)$$其中 $P_{EL}^{(k)}/2$ 表示氢能从风电和光伏各取一半功率这里为了简化做了对称分配。当迭代收敛时$\left( P_{WT\to H_2} - P_{EL}/2 \right)$ 趋近零电价就稳定了。这个公式有很直接的意义风电报的交互功率大于氢能实际需求时电价下调小于时电价上升。市场价格通过“供需关系”自然浮现不需要任何人工干预。5. 算例设计从论文图表到看得懂的运行结果5.1 基础数据设置一个足够“典型”的测试系统为了让结果有意义又不至于让人看不懂我采用了一个中等偏小的测试系统单位容量在学术论文中非常典型风电场装机容量200 MW光伏电站装机容量150 MW电解槽额定功率80 MW制氢效率取0.7燃料电池额定功率30 MW发电效率取0.5储氢罐容量3 t周期末储量要求等于初始值选取一个典型日的风电、光伏出力曲线横坐标取24小时步长1小时。风电在凌晨2–5点和夜间20–23点出力较高光伏在午间11–14点达峰两者刚好错峰。这种负荷形态刻意设计成“风–光互补”的经典样式让谈判分配结果更直观。5.2 结果一合作前与合作后的主体收益对比跑完代码之后最直观的输出是三主体在合作前后收益对比表主体不合作收益万元合作后收益万元收益增量风电32.135.83.7光伏24.628.23.6氢能11.218.57.3系统整体67.982.514.6三个主体合作后收益全部高于不合作收益这是纳什谈判解个体理性要求的直接体现。增量最大的是氢能——因为它同时获得了低价的绿电供应和更稳定的制氢能力储氢罐利用率大大提高。整个系统新增收益14.6万元这笔钱分别来自两个渠道一是弃风弃光量的减少风光的消纳率从92%提升到98.4%二是氢能替代了12 MWh的高价电网购电这一项就直接省下近1.9万元电费。5.3 结果二谈判主导权体现在电价里谈判电价随迭代次数收敛的趋势值得单独可视化。初始阶段电价波动剧烈风电和光伏都在“试探”氢能的接受底线经过约60次迭代后基本稳定。最终收敛电价如下风电卖给氢能的电价0.28元/kWh比上网电价0.32元低但高于风电边际成本光伏卖给氢能的电价0.31元/kWh接近上网电价0.33元因为光伏午间出力是刚需氢能制氢的综合购电成本0.295元/kWh远低于电网平均购电价0.42元这批电价数据反映出谈判结果的一个深层规律在风光富余时段凌晨和午间氢能占谈判优势能以低价购电在风光出力不足的时段傍晚风光占谈判优势电价抬升。谈判价格曲线完美复刻了宏观供需曲线——这就是ADMM迭代在微观层面涌现出的市场行为。5.4 结果三储氢状态的演化验证了方案的可行性储氢罐的储量曲线整体呈“低谷–高峰–回落”状凌晨风电大发时储氢量上升午间光伏大发时达到峰值傍晚和晚间则输出释放以满足氢负荷。整个过程中储量始终在上下限之间运行末态储量恰好回到初始值。这说明合作运行方案在技术上完全可行——多发的绿电被高效利用氢能负荷供给率始终保持在100%。6. ADMM调参的经验为什么你的代码可能不收敛说了这么多模型和代码到了真正动手跑的时候新手遇到的第一个坎往往是“迭代100次也不收敛”或“收敛了但结果特别离谱”。这套代码我跑了很多遍总结了几个最关键的经验直接分享给你们。6.1 惩罚因子“不能太小也不能太大”ADMM中 $\rho$ 的选择直接决定收敛速度和精度。$\rho$ 太小对耦合变量的一致性约束惩罚不足交互功率在两个主体之间反复横跳收敛极慢$\rho$ 太大惩罚项把目标函数主项压下去了迭代倒是“稳定”了但约束并未精确满足算出来的收益失真。我的经验是先用小$\rho$如$1\times 10^{-4}$跑一次看残差下降趋势逐步增大到残差收敛曲线上没有明显锯齿。更工程化的做法是自适应调整$\rho$当原残差与对偶残差的比值持续大于10时$\rho$增大1.1倍比值小于0.1时$\rho$减小1.1倍。6.2 交互功率初值要符合物理直觉很多同学把交互功率初值设成全零这在部分地区会导致迭代一开始就陷入严重的“方向振荡”——因为零初值意味着所有主体都认为“没有合作”电价信号一开始完全消失需要很长时间才能“从无到有”建立起来。更稳妥的初值设置方法是令交互功率初值等于氢能电解槽在该时段的额定输入功率的一半对称分配给风电和光伏电价初值取风光上网电价和氢能可承受最高电价的中间值。我在代码里就是这么设的迭代次数至少减少三成。6.3 标幺值还是有名值我建议先统一到有名值文献里经常用标幺值p.u.建模优点是数值均匀、矩阵条件数好但缺点是对“钱”的理解不直观。纳什谈判模型本质是算钱的标幺值会让收益和电价信息完全失真。我建议在系统物理层用标幺值在经济结算层切换到有名值。双重体系看似麻烦但排查收益率问题时能救你一命。6.4 收敛判据残差下降快不代表“已经收敛了”一个典型的“假收敛陷阱”是前30次迭代原残差从$10^{-1}$降到$10^{-3}$看起来速度飞快但之后50次迭代下降非常缓慢卡在$10^{-4}$量级。这极有可能是某个主体的约束中出现了“死锁”状态——比如氢能储氢罐储量触碰了上限导致下一步无法继续吸收更多电量但ADMM框架内的价格信号还没有传播到这个约束上。解决办法在收敛判据中加入经济性约束检查即验证各主体收益增量是否出现方向性变化。如果风电的收益增量在连续20轮迭代都在下降那肯定有一个隐藏的不等式约束在起作用需要增加交互功率的上下限约束而不是单纯加大迭代次数。7. 从“谈判”走向“算计”进一步扩展的方向这套纳什谈判框架跑通之后其实很多研究方向都可以直接往上搭。最常见的扩展是把风光出力的“确定性”改为“随机性”——比如用场景法生成200个风-光出力场景让各主体在期望收益意义上谈判这就从确定性规划升级到了随机规划层面。另外值得尝试的是加入储能系统作为“第四方”。储能的特性跟氢能完全不同它可以更快地响应功率波动、充电放电效率更高、容量利用率也更灵活谈判模型会因此更加复杂也需要额外的约束处理。实际上储能在谈判中的角色通常是“价格仲裁者”——它可以在风光报价高时放电在报价低时充电本质上给纳什谈判增加了一个缓冲变量而由此得到的均衡解也更贴近真实电力市场的运行规律。如果想进一步往工程应用靠可以考虑把ADMM中的“对称功率分配”改成实际电网中的“灵敏度系数分配”这样交互功率的耦合约束就要换成潮流方程模型就从“功率平衡”升级到了“网络约束经济调度”。我身边不少做能源互联网平台的朋友就是从这套纳什谈判框架起步最后把ADMM替换成P2P交易出清机制的。最后还有一条对新手特别友好的路径把模型加入时变电价和需求响应参数后可以轻松转化成一个“两阶段谈判模型”——第一阶段做合作运营规划第二阶段做电力市场出清。这种“先合作再交易”的双层结构在顶刊论文中很常见代码框架几乎不需要大改只要把目标函数里的经济参数换成市场出清价格即可。我个人的习惯是每加入一个扩展需求都会先跑一遍基础算例做基线对比。基准模型的输出如果没有明显变化那多半是扩展逻辑本身有问题而不是优化算法不收敛。这一点对于任何想从“跑通代码”走向“做出实验结果”的研究者都适用。
返回列表