我们做配电网优化调度的人,这两年讨论最多的话题之一就是"共享储能"。原因很简单:单个微电网独立配储能,容量按峰值负荷去配,一年到头利用率可能不到百分之三四十,投资回收遥遥无期。但如果把储能从"私有资产"变成"共享服务",让多个微电网按需租用容量、错峰充放、余缺互济,整体投资能降下来,每个微电网的用能成本也能跟着降。这其中的关键问题就变成了:共享储能运营商怎么定价?微电网怎么决策租多少、充多少、放多少?多个微电网各打各的算盘时,系统还能不能稳定运行?
这个项目做的就是这件事,而且是拿Matlab代码完整跑通的一整套仿真解决方案:多个微电网接入配电网,共享储能运营商作为上层领导者制定租赁价格,下层各个微电网作为独立利益主体响应价格、优化自身调度,用Stackelberg博弈描述这种主从决策关系,最终得到一组均衡解。实现方法上,上层用粒子群搜索价格,下层用YALMIP调用Cplex求解,下层微电网之间又构成Nash博弈,通过迭代求解收敛。整套代码在Matlab R2023b环境下实测运行稳定,适合电力系统方向的研究生、算法工程师以及对含分布式资源的配电网优化有兴趣的从业者参考。
1. 项目整体设计与思路拆解
1.1 为什么多微电网需要共享储能
先算一笔账。假设一个工业微电网光伏装机5MW,晚高峰负荷4MW,如果完全自建储能,按"充放1C、2小时"的典型配置,至少要配4MWh的电池,按当前磷酸铁锂系统价格折算,初始投资在几百万元量级。可实际运行中,真正需要满充满放的时段可能不足全年时间的20%,大部分时间储能就是在那里吃灰。
多个微电网组合在一起情况就不同了。A微电网是白天光伏多的厂房负荷,B微电网是夜间生产多的高耗能企业,C微电网是商业综合体、早晚两峰。三条负荷曲线错开之后,合计需要的"同时最大充放功率"远小于三个微电网分别配置储能的功率之和。共享储能的本质,就是利用这种负荷错峰特性做"容量聚合",用一份储能资产服务多个用户,在保证各微电网调度灵活性的前提下大幅降低单体投资门槛。
但共享储能不是免费的,它需要有一个运营商负责投资建设、运维、调度。这就引出了利益分配问题:运营商要赚钱,微电网要省钱,二者目标天然不一致。如果沿用传统集中式优化思路,把所有微电网和运营商当成一个整体求最优,算出来的结果在数学上很漂亮,但实际执行不下去——因为某个微电网可能被分配到较高的储能租金和较差的充放电时段,它为什么要配合全局最优方案?博弈论在这里的价值,就是让每个参与方都能在追求自身利益的过程中达成一个各方都能接受的状态。
1.2 为什么用博弈论而不是集中式优化
集中式优化的问题在于"公平性"缺失。我们可以把整个多微电网系统看成一个公司里的几个独立核算部门,公司总部做全局优化时,考虑的是一整盘棋,这个月的总利润最大化是第一目标,至于哪个部门被牺牲,往往排不上优先级。部门负责人如果发现自己长期处于被牺牲状态,当然不会配合总部的调度指令。
共享储能租赁场景下,更贴近现实的做法是"市场机制引导":运营商公布储能租赁价格(容量租金+电量租金),各微电网看到价格后,根据自身光伏出力、负荷需求和电网购电电价,决定租多少容量、什么时候充放电。微电网的决策是个体最优的,但价格信号本身反映了储能资源的稀缺性和供需关系,个体最优的叠加结果又反过来影响运营商调整价格。这种"上层定价、下层响应"的结构,就是典型的Stackelberg主从博弈。而下层微电网之间同时也在互相竞争——大家都想租便宜的电、在低谷电价时段抢充电——这种平级主体之间的竞争关系,又是Nash博弈的范畴。
用博弈视角建模还有一个好处:求解结果天然具备"可执行性"。因为均衡状态下,没有任何一个参与方愿意单方面改变自己的策略——涨价会赶跑用户,降价会损失收益,微电网调整充放电策略也会使自己成本上升。这种稳定性是集中式最优解不具备的。
1.3 整体框架与调度架构
整套仿真架构分三层,对应物理模型中的三种角色。
最上层是配电网。配电网负责从上级电网购电并向各微电网供电,同时承担电压安全责任。潮流模型采用DistFlow支路潮流方程,用二阶锥松弛处理非线性项后可以直接交给求解器。配电网层不参与博弈决策,只提供物理约束——各微电网从配电网节点取用的功率必须满足潮流方程和节点电压上下限。
中间层是共享储能运营商(Shared Storage Operator,简称SSO)。SSO拥有储能资产,决策变量是充放电功率、储能SOC变化,以及最重要的——向各微电网收取的容量租赁电价和电量租赁电价。运营商的收益来自租赁收入减去储能运行维护成本和从配网购电的成本。
最下层是各个微电网。每个微电网包含光伏、柴油发电机、本地负荷以及从共享储能租用的容量。微电网的决策变量是柴油机出力、与配电网的交换功率、储能充放电计划。目标是最小化总运行成本,包括向配网购电费用、柴油机燃料费用和储能租赁费用。
层与层之间的关系是:上层SSO先制定价格,下层微电网看到价格后独立求解自身经济调度问题,把租用的储能功率计划上报给SSO,SSO汇总后计算自身收益并调整价格,如此迭代直至收敛。整个博弈在Matlab中的实现就是这样一个多层嵌套循环结构。
2. 核心模型构建与数学原理
2.1 共享储能运营商的收益模型
SSO的决策目标是最大化日收益:租赁收入减去从配电网购电给储能充电的成本,再减去储能充放电造成的损耗和维护成本。目标函数可以写成:
- 租赁收入 = 容量租赁价格 × 各微电网租用容量 + 电量租赁价格 × 各微电网实际充放电量
- 购电成本 = 分时电价 × 储能从配电网吸收的功率
- 运维成本 = 单位功率维护成本 × 充放电功率绝对值之和
这里需要特别说明"容量租赁"和"电量租赁"两个概念的差异,这是整套模型能否收敛的关键设计。容量租金针对微电网"租了多少容量",不管用不用都要付基础费,这保障了SSO的固定收益;电量租金针对"实际充放了多少电",体现的是使用强度。两类价格共同作用,可以引导微电网既不过度占用容量,也不过度频繁充放。
储能本身的运行约束包括:充放电功率上下限、SOC状态转移方程、充放电互斥约束(同一时刻不能既充又放)、日末SOC恢复约束。SOC的状态转移方程是:
SOC(t+1) = SOC(t) + (η_ch × P_ch(t) - P_dis(t) / η_dis) × Δt / E
其中η_ch和η_dis分别是充放电效率,实际工程中建议充电取0.95、放电取0.90,如果做保守评估可以统一取0.90。Δt是调度步长,96点调度方案下每步15分钟,24点方案下每步1小时。
2.2 微电网经济调度模型
每个微电网接收到SSO发布的租赁价格后,独立求解自己的日内经济调度问题。目标函数是最小化四项成本之和:
- 向配电网购电成本:分时购电电价 × 从配网取用的功率
- 柴油发电机燃料成本:通常用二次函数拟合,C_fuel = a×P^2 + b×P + c
- 储能容量租赁费用:容量租赁价格 × 租用容量
- 储能电量租赁费用:电量租赁价格 × 实际使用的充放电量
微电网的约束包括:功率平衡约束(光伏出力 + 柴油机出力 + 储能放电 + 购电 = 负荷 + 卖给配网的功率 + 储能充电)、柴油机出力上下限和爬坡约束、与配电网交换功率上限约束、储能充放电功率不超过租赁容量约束。
这里面有一个很容易踩坑的地方:储能租赁与储能"私有"在建模上的根本差异。私有储能只需要保证整体容量约束,充电和放电用同一个容量上限;租赁储能则精确到每个微电网的充放电"权利"——你租了500kW,那么充电最多500kW,放电最多也是500kW,而且最终调度结果中所有微电网的充放电功率之和,必须等于储能实际运行状态,这个耦合约束由SSO在汇总时校验。
2.3 配电网潮流与安全约束
配电网采用DistFlow分支潮流模型。对于辐射状配电网,每条支路的潮流方程为:
P_ij = sum(P_jk) + p_j + r_ij × l_ij Q_ij = sum(Q_jk) + q_j + x_ij × l_ij U_j^2 = U_i^2 - 2×(r_ij×P_ij + x_ij×Q_ij) + (r_ij^2 + x_ij^2)×l_ij
其中l_ij = (P_ij^2 + Q_ij^2) / U_i^2,这一项是非线性的,需要用二阶锥松弛:
|| 2P_ij 2Q_ij (U_i^2 - l_ij) ||_2 ≤ U_i^2 + l_ij
松弛之后整个潮流问题变成二阶锥规划(SOCP),可以用Cplex、Gurobi这类商业求解器直接求解。节点电压约束一般设为0.95 p.u.至1.05 p.u.,这个约束在共享储能场景下特别有检验价值——储能集中充电时段往往会造成末端节点电压跌落,电压约束能不能满足,本身就是一个衡量调度方案可行性的硬指标。
2.4 博弈求解思路:KKT与迭代法的选择
双层的Stackelberg博弈求解,理论上有两条路线。
第一条是"单层化"路线:用下层微电网的KKT最优性条件替换下层优化问题,把双层问题转化成带互补约束的单层数学规划(MPEC),再用大M法把互补约束线性化,交给求解器一把梭。这种方法的优点是理论上严谨,一次求解得到全局最优的KKT点;缺点是公式推导繁琐,大M参数的选取需要经验,M太大会导致数值病态,M太小又会砍掉可行域,而且在多微电网场景下下层有多个优化问题,MPEC规模会膨胀到难以调试。
第二条是"迭代求解"路线:上层用启发式算法(粒子群、灰狼等)搜索租赁价格,下层对每个价格方案调用Cplex精确求解微电网的混合整数二次规划问题,将下层得到的最优响应返回上层评估收益。上下层交替迭代直到均衡。这个方案的优点是工程实现简单,下层模型改动不需要动上层算法框架;缺点是启发式算法的收敛没有理论保证,每次运行结果可能略有差异,需要设置合适的迭代次数和收敛判据。
这个项目采用的是第二条路线,核心原因是可以把"上层定价"和"下层调度"完全解耦,代码结构清晰,也方便后续把单个微电网模型从确定性优化扩展成鲁棒优化或者随机规划。实际运行下来,3个微电网、24时段、上层50个粒子迭代100轮的算例,Matlab环境下大约5到10分钟可以收敛,这个效率对研究用途完全够用。
3. Matlab代码实现与关键环节解析
3.1 开发环境与工具链配置
代码在Matlab R2023b下开发,优化求解依赖YALMIP工具箱和Cplex求解器。很多人在环境配置这一步就卡住了,我把踩过的坑列一下:
- YALMIP是一个建模语言层,不是求解器。它负责把优化模型翻译成求解器能识别的标准形式。安装时把整个文件夹解压后添加到路径即可,但要注意Matlab当前路径下不能有其他同名函数,否则会静默调用错误版本。
- Cplex安装后需要确认Matlab接口是否能识别。在命令窗口执行"cplex.getVersion"或者直接运行"yalmiptest",看到"Found solver CPLEX"才算配置成功。
- 如果只有Gurobi用没有Cplex,也可以,只需要把代码中的"sdpsettings('solver','cplex')"改成"sdpsettings('solver','gurobi')"。两者对SOCP和MIQP的支持都很好,算小算例结果基本一致。
- 建议用24时段而不是96时段的配置先跑通流程,确认模型没有语法错误再切到96时段。96时段下变量规模翻四倍,初始调试排查问题的体验会差很多。
3.2 代码结构设计
整套代码按照"主程序-数据生成-功能模块-结果分析"四个层次组织,模块划分如下:
- main.m:主入口函数,负责调用数据生成模块、设置博弈参数、执行双层迭代循环、输出结果。
- case_data.m:生成微电网数量、负荷曲线、光伏曲线、分时电价、储能参数、配电网拓扑参数。这个文件相当于算例的信息库,想换算例只需要改这一处。
- ss_operator.m:共享储能运营商优化模块,输入租赁价格,输出储能最优充放电计划和运营收益。
- mg_operator.m:单个微电网优化模块,输入租赁价格和微电网数据,输出微电网调度方案和运行成本。
- distflow.m:配电网潮流优化模块,负责校验各微电网功率注入下的节点电压和支路潮流约束。
- equilibrium.m:均衡判断与价格更新模块,采用粒子群算法搜索电价并判断迭代是否收敛。
- plot_results.m:结果可视化模块,绘制储能SOC曲线、各微电网功率平衡图、成本对比柱状图、电压分布图。
这种结构的优势是每个模块可以独立调试。我最开始的版本把微电网模型和潮流校验写成一个大函数,结果出现问题时根本分不清是调度不满足功率平衡,还是潮流不收敛。拆开之后每个环节都可以单独喂假数据测试,定位问题的速度快了不止一倍。
3.3 核心代码解读:微电网下层的YALMIP建模
下层微电网优化是整个博弈中调用最频繁的模块(每轮迭代每个微电网都要算一次),它的求解效率和模型准确性直接影响整体效果。核心代码如下:
function [cost, schedule] = mg_operator(mg_data, price_cap, price_energy, rent_cap) % mg_data: 微电网基础数据 % price_cap: 容量租赁价格 % price_energy: 电量租赁价格 % rent_cap: 租用的储能容量 T = 24; % 调度时段数 yalmip('clear'); % 决策变量 P_buy = sdpvar(1, T); % 从配网购电功率 P_diesel = sdpvar(1, T); % 柴油机出力 P_ch = sdpvar(1, T); % 储能充电功率 P_dis = sdpvar(1, T); % 储能放电功率 u_ch = binvar(1, T); % 充电状态标记 u_dis = binvar(1, T); % 放电状态标记 % 目标函数 obj = sum(mg_data.buy_price .* P_buy) + ... sum(mg_data.diesel_a * P_diesel.^2 + mg_data.diesel_b * P_diesel + mg_data.diesel_c) + ... price_cap * rent_cap * T + ... price_energy * sum(P_ch + P_dis); % 约束条件 constraints = []; constraints = [constraints, P_buy >= 0, P_buy <= mg_data.p_grid_max]; constraints = [constraints, P_diesel >= 0, P_diesel <= mg_data.p_diesel_max]; % 功率平衡: 光伏 + 柴油机 + 储能放电 + 购电 = 负荷 + 储能充电 constraints = [constraints, mg_data.P_pv + P_diesel + P_dis + P_buy == ... mg_data.P_load + P_ch]; % 储能租赁容量约束 constraints = [constraints, 0 <= P_ch <= rent_cap]; constraints = [constraints, 0 <= P_dis <= rent_cap]; % 充放电互斥约束 constraints = [constraints, u_ch + u_dis <= 1]; constraints = [constraints, P_ch <= u_ch * rent_cap]; constraints = [constraints, P_dis <= u_dis * rent_cap]; ops = sdpsettings('solver', 'cplex', 'verbose', 0); diagnosis = optimize(constraints, obj, ops); if diagnosis.problem ~= 0 error('微电网%d优化求解失败: %s', mg_data.id, yalmiperror(diagnosis.problem)); end cost = value(obj); schedule.P_buy = value(P_buy); schedule.P_ch = value(P_ch); schedule.P_dis = value(P_dis); schedule.P_diesel = value(P_diesel); end几个细节值得注意。充放电互斥约束用两个二进制变量控制,虽然在实际SOC连续模型里,大多数情况下最优解本身就不会出现同时充放电(因为同时充放等于白交损耗钱),但加了互斥约束后求解稳定性更好,尤其是当租赁价格成本低于购电价格时,不排除求解器给出同时充放电的怪异方案。功率平衡约束必须写成"等号",不能写成大于等于或小于等于——否则求解器会利用不等式漏洞做能量凭空消失或凭空产生的操作。
3.4 双层迭代与收敛控制
上层价格更新采用粒子群算法。每一轮迭代中,每个粒子代表一组储能租赁价格向量(含容量价格和电量价格),通过调用下层微电网模型得到每个微电网的调度方案和需求容量,再把结果汇总给SSO计算收益,收益值作为粒子的适应度。核心逻辑如下:
for iter = 1:max_iter for p = 1:num_particle price = particles(p, :); % 下层: 各微电网基于当前价格独立优化 total_rent_cap = 0; total_energy = 0; for k = 1:num_mg [mg_cost, schedule] = mg_operator(mg_data(k), ... price(1), price(2), price(3) * rand_factor(k)); total_rent_cap = total_rent_cap + schedule.rent_cap; total_energy = total_energy + sum(schedule.P_ch + schedule.P_dis); end % 上层: 计算SSO收益 fitness(p) = price(1) * total_rent_cap * T + ... price(2) * total_energy - ... storage_op_cost(total_energy); % 记录下层响应,用于后续潮流校验 response{p} = store_response(schedule, mg_data); end % 更新粒子速度和位置 [pbest, gbest] = update_pso(particles, fitness); % 收敛判断: 最优适应度变化小于阈值则跳出 if abs(gbest_fitness - gbest_fitness_prev) < 1e-3 break; end end收敛控制有两个要点。第一个是价格更新步长不能太大,粒子群速度上限建议设为价格区间宽度的10%到15%,否则前期搜索震荡剧烈,大概率在中后期陷入局部最优。第二个是增加一个"均衡校验"环节:收敛后把得到的均衡价格代入下层重新求解一次,对比前后两轮下层微电网的租用容量和成本变化,如果变化超过1%,说明还没真正达到均衡,需要继续迭代或者重新调整算法参数。
4. 算例分析与结果解读
4.1 算例设置与场景设计
算例采用IEEE 33节点配电网拓扑作为物理基础,在节点12、22、30分别接入3个微电网,共享储能安装在第85个节点附近的公共连接点(具体节点位置根据你手头的配电网数据模型调整)。3个微电网的配置如下:
- MG1:工业负荷为主,峰值2MW,光伏装机1.5MW,白天负荷高、光伏出力大。
- MG2:商业负荷为主,早晚双峰,峰值1.2MW,光伏装机0.8MW。
- MG3:居民负荷为主,晚高峰明显,峰值1.5MW,光伏装机0.5MW。
储能系统容量2MWh,最大充放电功率1MW,充电效率0.95,放电效率0.9,初始SOC 0.2,日末SOC要求回到0.2。分时电价采用典型工商业峰谷电价:峰时段08:00-11:00和18:00-23:00为1.2元/kWh,平时段11:00-18:00为0.75元/kWh,谷时段23:00-08:00为0.4元/kWh。
为了验证共享储能的价值,设置了三个对比场景:场景一,无储能,各微电网独立从配网购电;场景二,各微电网自建储能,容量按各自峰值负荷15%配置;场景三,采用共享储能租赁模式。
4.2 成本对比与收益分配
运行测算后得到的一组典型结果如下表(金额单位:元/天):
| 场景 | MG1成本 | MG2成本 | MG3成本 | 储能投资折算 | 总社会成本 |
|---|---|---|---|---|---|
| 无储能 | 21450 | 13180 | 15860 | 0 | 50490 |
| 自建储能 | 19620 | 12240 | 14350 | 3210 | 49420 |
| 共享储能租赁 | 18230 | 11460 | 13690 | 0(租金已含) | 43380 |
共享储能模式下三个微电网的日成本分别下降了15.0%、13.0%、13.7%,同时储能运营商通过租赁获得的日均收益在3060元左右,扣除储能运维成本和充电购电成本后净收益约1190元/天。这个收益水平折算成年化投资回报率大约在13%到15%之间,对储能资产投资来说是比较有吸引力的数字。
从博弈视角看更有意思的一点是:共享储能模式下MG1这样的"大用户"租赁的储能容量最多,但支付的单位租金并不会因为量大而明显降低,原因在于MG1租用的容量多、在用电高峰期充电需求旺盛,给SSO带来的边际成本也高。这体现了博弈均衡的"按边际定价"特征——每个微电网支付的价格反映了它对储能资源稀缺性的边际贡献。
4.3 储能SOC曲线与弃光改善
分析充电时段分布会发现一个典型规律:储能主要集中在夜间低谷时段和午间光伏大发时段充电,在早晚两个负荷高峰时段放电。这正是共享储能相对私有储能的优势——不同微电网的峰值时段错开,MG2的晚峰在18-20点,MG3的晚峰在20-22点,储能可以"一波能量打两波峰",利用率自然上去了。
弃光率的改善也同样明显。不共享储能时,MG1午间光伏大发而自身负荷不足以消纳,又因为自建储能容量不足,必须弃掉一部分光伏功率,弃光率约8%。共享储能模式下,MG1午间可以多租用储能容量把多余光伏存起来,晚上再放出来给自己或者通过配电网供其他微电网使用,弃光率降到2%以下。如果你手头的光伏渗透率更高,这个改善幅度会更夸张。
4.4 灵敏度分析与扩展思考
跑完基础算例之后建议做一组灵敏度分析,可以非常直观地理解系统行为的边界条件。首选分析"储能容量变化对租赁价格的影响":把储能容量从1MWh逐步增大到5MWh,观察均衡租赁价格的变化趋势。实测结果是:储能容量增大时,容量租赁价格先缓慢下降,因为可用容量变多了、竞争压力变小;但当容量超过4MWh后,价格下降幅度显著减缓,因为已经接近"供过于求"的临界点。这组数据对接下来的储能扩容决策非常有用。
其次可以分析"光伏出力不确定性对博弈结果的影响"。把光伏曲线的预测误差设为±15%,用蒙特卡洛生成100组场景,分别跑一遍博弈模型,统计三个微电网的成本分布区间。你会发现成本波动主要由MG1承担,因为它光伏占比最高。这个结论指向后续的改进方向:引入鲁棒优化或条件风险价值(CVaR)来刻画微电网的风险偏好,让每个微电网根据自己的风险承受能力选择不同的调度策略。
5. 常见问题与排查实录
5.1 求解器报错:Infeasible problem
这是跑这个模型最容易遇到的问题,几乎每个初学者都会碰上。模型出现不可行,最常见的原因是约束条件互相矛盾,按照出现频率排序:
| 问题现象 | 常见原因 | 解决方法 |
|---|---|---|
| 微电网下层优化报Infeasible | 功率平衡约束、租用容量、购电上限三者冲突 | 检查租用容量是否过小,导致无法同时满足负荷和储能充电;适当增大rent_cap或放宽购电上限 |
| 储能SOC约束不可行 | 日末SOC恢复约束与充放电效率、时长约束冲突 | 增大储能容量,或者把日末SOC恢复约束改为软约束(允许一定偏差并加惩罚项) |
| 配电网潮流不可行 | 所有微电网集中充电导致节点电压越限 | 给潮流模型增加电压约束后,需要在博弈迭代中把潮流校验结果反馈到价格更新中 |
遇到Infeasible不要盲目改代码。先在Matlab中用YALMIP的diagnosis.problem输出错误类别,然后把约束条件逐个注释掉重新求解,用"二分法"定位是哪条约束导致的不可行。这个调试技巧用过一次就离不开了。
5.2 双层迭代不收敛或震荡
迭代不收敛是最折磨人的问题。我遇到过的典型场景是:前20轮迭代价格一直在两个值之间反复跳跃,呈现明显的振荡模式。原因是价格更新步长过大,下层微电网对价格过度敏感——价格略降一点,所有微电网都扩大租用容量,SSO收益暴涨;价格略升一点,所有微电网又都缩小租用容量,SSO收益暴跌。
解决办法有三个,按性价比排序:
- 减小粒子群速度上限,让价格搜索更平缓;
- 引入阻尼因子,把每次价格更新设成"上一轮价格 + 阻尼系数×(优化出的新价格 - 上一轮价格)",阻尼系数取0.3到0.6比较合适;
- 检查下层微电网是否出现"批发式"响应的集中效应。如果三个微电网的负荷曲线高度相似,同时充电同时放电,系统本身缺乏错峰能力,博弈结果天然不稳定,需要考虑引入储能的时段差异化定价来引导错峰。
5.3 求解时间过长
3个微电网、24时段、初始参数下跑一轮完整博弈需要5到10分钟,这个耗时还能接受。但如果把微电网数量增加到10个以上,或者时段切到96点,求解时间可能膨胀到小时级。优化的方向有三个:
- 用并行计算:粒子群算法天然适合并行,把每个粒子的适应度计算用parfor替代for循环,核数多的话能提速3到5倍;
- 削减冗余约束:检查微电网模型中有没有永远不起作用的约束,比如某些时段由于爬坡约束的存在,柴油机出力上限本来就不可能达到,这类约束可以在生成sdpvar变量时直接缩小取值范围;
- 底层求解器参数微调:Cplex里把MP整数的MIP gap从默认的0.01%放宽到0.1%,对最终结果影响很小,但求解速度能提升30%以上。学术研究里这个精度损失完全可接受。
5.4 结果不合理:某个微电网成本反而更高
有一种情况让我一度怀疑模型写错了:把共享储能模式的结果和无储能场景对比,发现某个微电网的成本不仅没降,反而还涨了。后来分析发现这其实是博弈的正常现象——这个微电网的负荷曲线正好和其他微电网高度叠加,它租用储能的边际价值本来就低,租赁价格对它来说并不划算。它之所以还参与租赁,是因为它是一个独立决策主体,在SSO给定的价格下它选择少租甚至不租才是理性选择。
这个现象在那里反而是模型正确性的证明:博弈模型允许参与方"退出"。如果一个模型强制让所有微电网都必须租用一定比例的储能,那反而违背了"租赁"的市场本质。实际算例中我们观察到MG2就是那个"小租户",它只租了很小一部分容量,主要用于光伏午间消纳,成本下降幅度也最小。不过从系统整体看,它付出的租赁费用是自愿的,整体社会成本依然下降了。
6. 代码扩展方向与实用建议
跑通当前版本之后,有几个扩展方向我认为非常有价值,按工作量从低到高排列。
第一个是接入需求响应机制。在多微电网框架里加入可平移负荷和可中断负荷,让微电网在电价尖峰时段主动削减一部分负荷,这样不仅能进一步降低微电网成本,还能缓解配电网的峰值压力。实现难度不大,只需要在微电网模型中增加负荷调整变量和对应的补偿费用项,博弈结构完全不用动。
第二个是考虑不确定性的鲁棒优化版本。光伏出力和负荷预测不可能完全准确,当前模型是确定性优化,实际调度时若光伏比预测少,微电网可能面临购电成本超出预期的问题。将下层微电网模型替换为鲁棒优化模型(箱式不确定集),用YALMIP配合线性的对偶变换即可实现,代码结构依然兼容。
第三个是把多微电网之间的P2P电能交易纳入框架。当前模型里微电网之间只能通过共享储能间接互动,如果允许微电网之间直接交易多余的光伏电量,会形成"电能交易+储能租赁"的双层市场。这个扩展对博弈框架的改动比较大,需要把下层Nash博弈的求解从逐个独立优化改为联立求解,或者设计分布式ADMM算法迭代求解。我目前正在做这方面的测试,等出结果了单独写一篇。
最后给两个实操建议。第一个:代码运行前务必把Matlab工作区里的旧变量清干净,我看到太多人在同一次会话里跑了多组算例,结果因为残留变量导致数据串了,花半天时间排查最后发现是变量冲突。第二个:给每个算例设置一个随机数种子,粒子群的初始化是随机的,没有固定种子的话每次结果会有细微差异,这在写论文做对比实验的时候会是致命伤——审稿人让你复现数据,你复现不出来就尴尬了。加上rng(2025)这种固定种子的操作,一键锁定结果,省心省力。