做电力系统方向的研究生,十有八九会碰IEEE33这个系统。我接触它至少四五年了,从最初的潮流计算到配网重构,再到今天要说的韧性提升,几乎所有的配电网研究都能在这个系统上做实验。前两年我开始做极端天气下的韧性课题,第一步就选了IEEE33节点配电网加混合储能、OLTC、SVC这个组合,用Matlab做协调优化仿真。实测下来,这套方案在台风、冰灾这类多重故障场景下,能把失负荷率压得很低,代码稳定性和可复现性也都经得起考验。
这篇文章我会把整套思路从头到尾捋一遍,重点解决三个问题:一是为什么韧性调度需要同时用这三种设备而不是只加储能;二是在IEEE33系统里,这些设备怎么建模、优化模型怎么列才不会跑飞;三是Matlab里具体怎么实现、有哪些反复踩过的坑。无论你是刚接触配电网优化的研究生,还是已经在做韧性方向但卡在复现环节的工程师,按这个路线走,应该能少走不少弯路。
1. 项目背景与整体设计思路
1.1 配电网韧性到底在解决什么问题
先说个概念层面的东西。配电网韧性(resilience)和传统的可靠性(reliability)不是一回事。可靠性关心的是日常随机故障下系统能否持续供电,讲究的是N-1准则、故障率、平均停电时间这些指标。但台风、冰灾、暴雨这种极端事件不一样,它往往是多条线路同时故障,甚至整个区域大面积停电,超出了传统可靠性设计的覆盖范围。
韧性研究的就是系统在遭受这种低概率、高影响事件时,能不能"扛得住"并且在故障持续期间尽量多供电、故障结束后快速恢复。说白了就是给电网加一层"免疫力"。这个项目属于运行层面的韧性提升,核心是在故障发生后,通过调度混合储能、OLTC、SVC这些已有设备,让系统在部分线路断开的情况下仍然维持尽可能多的负荷供应。
为什么选极端天气这个场景?因为最近几年的实际运行经验已经很清楚了:极端天气造成的电网损失占停电总损失的比例越来越高,而且这种事件具有明显的时间和空间耦合性。比如台风来临前负荷会激增,台风过境时多条线路同时跳闸,这时候单纯靠传统保护动作或者人工抢修,恢复速度远远跟不上需求,运行层面的主动支撑就变得很关键。
1.2 为什么是混合储能、OLTC、SVC这个组合
可能有人问,直接加大容量储能不就行了?我在做方案选型的时候也纠结过这个问题。后来实际跑下来发现,单靠一类设备局限性太明显,具体来说:
OLTC(有载调压变压器)是配电网里最基础的电压调节手段,它通过改变变压器变比来整体抬升或降低馈线出口电压。但它有两个硬伤:一是只能离散调节,档位变化是非连续的;二是分接头动作次数有限制,频繁调节会严重缩短设备寿命。所以OLTC适合做慢速、大范围的电压水平调整,不适合应对短时快速波动。
储能就比较灵活,有功无功都能调,响应速度也能到秒级甚至更快。电池储能能量密度高,能持续支撑较长时间,但瞬时功率冲击反而受限;超级电容功率密度大、响应极快,但容量小,撑不了太久。把两者组合成混合储能,就是典型的"长时能量支撑+短时功率缓冲"互补。
SVC(静止无功补偿器)是电力电子设备,本质是一个可连续调节的无功源,响应速度极快,能有效支撑节点电压。但它只能发无功或者吸收无功,对有功缺额无能为力。不过它的优势在于成本相对低、寿命长、维护简单,所以在电压薄弱点配置SVC性价比很高。
这三种设备放在一起,各自的调节维度是互补的:储能管有功缺额和短时冲击,SVC管动态电压支撑,OLTC管全局电压水平。我在后面的仿真里做过对比,只用储能时电压支撑能力明显不足,末端节点电压很容易越下限;只用OLTC和SVC时一旦有功缺额太多,频率和负荷恢复也跟不上。三者协调起来,效果是1+1+1>3。
1.3 整体技术路线与模块划分
这套Matlab程序我按模块划分,每个模块独立封装,方便单独调试和替换。整体流程是先搭系统数据,再生成故障场景,然后建立优化模型并求解,最后做结果评估和可视化。
| 模块 | 核心作用 | 主要输出 |
|---|---|---|
| case33.m | 定义IEEE33拓扑、线路参数、负荷数据 | bus/branch结构体 |
| gen_scenario.m | 生成指定故障线路或随机故障场景 | 线路可用状态、负荷系数 |
| build_model.m | 建立目标函数和全部约束,调用求解器 | 优化结果结构体 |
| solve_model.m | 求解MISOCP/MILP并处理异常 | 决策变量取值 |
| plot_results.m | 绘制电压、储能SOC、OLTC档位等曲线 | 图表 |
| resilience_metrics.m | 计算失负荷量、恢复率、最低电压等韧性指标 | 指标表格 |
这个模块划分的好处是:换故障场景只需要改gen_scenario,换设备配置只需要改case33和build_model里对应的约束块,不会牵一发动全身。我后来做随机场景扩展的时候,基本没动主程序。
2. 系统建模与核心公式
2.1 IEEE33节点系统参数与数据预处理
IEEE33节点系统是个经典算例,基准电压12.66 kV,基准容量一般取10 MVA,总共有33个节点、32条支路,原始总有功负荷约3.715 MW,无功负荷约2.3 Mvar。最理想的点在于它规模适中,单时段潮流计算毫秒级完成,做多时段优化也不至于算到天荒地老。
拿到原始数据后第一件事是标幺化。很多初学者直接拿欧姆值去建模,结果量纲错乱。正确做法是先算阻抗基值:
Z_base = U_base^2 / S_base = 12.66^2 / 10 = 16.0276 Ω
然后所有线路电阻电抗都除以Z_base转换为标幺值。负荷功率则除以S_base转换为标幺值。我一般在case33.m里就一次性完成这个转换,后面所有约束和计算都用标幺值,避免单位混乱。
下面给出部分支路数据,完整参数网上都能搜到,但网上的版本有时候负荷功率单位不一致(有的是kW/kvar,有的是MW/Mvar),用之前一定要核对清楚。
| 支路编号 | 首端节点 | 末端节点 | r(Ω) | x(Ω) | 末端有功负荷(kW) | 末端无功负荷(kvar) |
|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 0.0922 | 0.0470 | 100 | 60 |
| 2 | 2 | 3 | 0.4930 | 0.2511 | 90 | 40 |
| 3 | 3 | 4 | 0.3660 | 0.1864 | 120 | 80 |
| 4 | 4 | 5 | 0.3811 | 0.1941 | 60 | 30 |
| 5 | 5 | 6 | 0.8190 | 0.7070 | 60 | 20 |
| 6 | 6 | 7 | 0.1872 | 0.6188 | 200 | 100 |
这里有个细节容易被忽略:IEEE33的末端节点31负荷是200 kW + 600 kvar,无功功率远大于有功,这是原始算例故意设置的薄弱点,用来暴露电压问题。后期配置SVC时,这种节点就是我优先考虑的位置。
2.2 极端天气故障场景的构造方法
故障场景是韧性研究的心脏,场景设计不合理,后面优化做得再花哨也没用。我在这个项目里用了两种方式来生成场景。
第一种是指定故障场景,最直接也最适合调试。参考典型台风灾害的破坏模式,我选了三组关键线路故障:支路8对应线路8-21、支路12对应线路12-22、支路25对应线路25-29。这三条线路分别位于系统的主干道和两条分支末端,同时断开会让系统出现明显的电压跌落和部分负荷失电。同时我在场景里加了10%~20%的负荷系数,模拟极端天气下负荷激增的情况。这个场景设计在代码里就是几行数组的事:
% 支路状态: 1=正常运行, 0=故障断开 branchStatus = ones(32, 1); branchStatus([8, 12, 25]) = 0; % 模拟台风导致三条线路同时断开 loadFactor = 1.15; % 极端天气负荷系数第二种是蒙特卡洛随机场景,用来做更严谨的韧性评估。思路是先给每条线路建一个与风速相关的故障概率模型,然后生成成百上千个随机故障场景,再对这些场景做聚类削减,挑出代表性的几个参与优化调度。风速-故障概率模型我推荐用Sigmoid型函数:
P_failure(w) = 1 / (1 + e^{-0.2(w - w_cr)})
其中w_cr是临界风速,大概取25 m/s左右,等于说风速超过这个值时线路故障概率急剧上升。这个模型虽然简化,但能很好反映极端天气下线路故障概率随灾害强度非线性上升的特征。
实际调试时我的建议是先用指定场景跑通全流程,后续做随机场景分析时再加蒙特卡洛。一上来就生成2000个场景去跑多时段优化,大概率第一天全耗在求解器等待上了。
2.3 混合储能、OLTC、SVC的设备建模
设备建模直接影响优化结果的可靠性,这部分我会把每个设备的数学约束写得尽量清楚。
混合储能这部分,我选择的是电池储能(BESS)加超级电容(SC)的组合,两者通过DC/DC变换器并联到公共直流母线,再经PCS接入交流系统。电池储能容量1 MWh,最大充放电功率0.5 MW,SOC运行范围0.1~0.9,充放电效率取0.95;超级电容容量0.1 MWh,最大充放电功率1 MW,SOC范围0.2~0.9,效率取0.98。两者的核心约束就是SOC递推方程和功率上下限。
SOC递推方程是:
SOC(t+1) = SOC(t) + (η_ch * P_ch(t) - P_dis(t) / η_dis) * Δt / E
其中P_ch和P_dis分别是充电和放电功率,都是非负变量。这里有个坑:充电时实际存入电池的能量需要乘以充电效率η_ch,放电时从电池里放出的能量需要除以放电效率η_dis,二者方向不同,不能写反。
充放电不能同时进行这个约束,我在Optimization里用一个二进制变量对实现:
b_ch + b_dis <= 1; % 互斥约束 P_ch <= P_ch_max * b_ch; P_dis <= P_dis_max * b_dis;这样写有一个好处:即使求解器在数值精度上略微违反互斥,二进制约束也能把越界限制在极小范围内。
OLTC的建模,我选择把它放在根节点出口处,等效为改变馈线首端电压。变比k在0.95~1.05 pu之间按17档离散取值,每档步长约0.00625 pu。在优化模型里,用二进制变量做档位选择:
tap_select = binvar(nTap, T, 'full'); Constraints = [Constraints, sum(tap_select, 1) == 1]; % 每时段只能选一档 U_root = tapRatioSq * tap_select; % 根节点电压平方 = 变比平方这里的tapRatioSq是每个档位对应变比平方的行向量。用平方而不是直接用变比,是为了和DistFlow里的电压变量U_i = V_i^2保持统一,避免转换误差。
SVC的建模就简单很多,本质上是一个可调无功源,约束只有一个容量范围。我配置了两台SVC,分别接在节点18和节点33,容量范围±0.5 Mvar,也就是既可以向系统注入无功也能吸收无功:
Q_svc_min ≤ Q_svc ≤ Q_svc_max
实际设备响应速度很快,在静态优化模型