做配电网方向的同学,十有八九绕不开IEEE33节点系统。我在做主动配电网优化仿真的时候,也是从这套33节点系统起步的。项目本身听起来不复杂——在IEEE33节点配电网里接入风电、光伏和储能,然后跑优化,把网损、电压、运行成本这些指标调优。但真正动手之后才发现,从“标题看起来简单”到“结果能写进论文或者报告”,中间隔着不少模型细节和调参的坑。
这篇文章把我完整的建模思路、优化框架和踩坑记录整理出来。如果你正在做含风光储的主动配电网仿真,或者刚接触IEEE33准备搭第一个仿真环境,这篇内容应该能帮你省下不少试错时间。我会从系统选型、风光储建模、优化算法到结果解读,一条线讲完,中间穿插实际参数和经验教训。
1. 项目整体思路:为什么选IEEE33这个“试验田”
1.1 主动配电网到底“主动”在哪里
传统配电网是单侧供电、被动消纳负荷,电源都集中在变电站根节点,潮流方向非常固定。分布式电源大量接入之后,配电网的运行逻辑被改变了:光伏和风电的出力随时波动,负荷高峰和电源大发时段可能错开,极端情况下还会出现功率从末端倒送回变电站的情况。如果还按传统方式被动管理,常见的后果就是节点电压越限、线路过载、继电保护误动。
主动配电网的核心变化,就是把这些分布式电源、储能、无功补偿设备纳入统一协调控制。你可以把传统配电网理解成一根单向水管,从水厂往用户端送水;主动配电网则像一根双向水管,家家户户都可能往管道里注水,水压过低时还得有人调节泵站和蓄水池。储能在这里的角色就是一个可充可放的缓冲池,光伏和风电是波动性很强的“注水口”,优化算法则相当于调度员,负责决定什么时候充、什么时候放、哪些节点多出力、哪些节点少出力。
1.2 IEEE33节点系统是配电网研究的“标准小白鼠”
IEEE33节点系统是Baran和Wu在1989年提出的经典辐射状配电网测试系统,几十年来一直作为配电网研究的标准算例。它的基础参数很清晰:基准电压12.66kV,基准功率10MVA,一共33个节点、32条支路,根节点是节点1,系统总负荷大约3715kW加上2300kvar无功。这类标准系统最大的优点是复现门槛低,任何人在论文里引用的数据都一样,结果具有可比性。
我在选择测试系统时也考虑过IEEE69节点、IEEE123节点,但最后还是选了33节点。原因很简单:做主动配电网优化的初期,重点应该放在控制策略和优化算法上,而不是在复杂网络上花太多精力。IEEE33节点规模适中,潮流计算速度快,接入几处分布式电源之后电压问题依然明显,非常适合验证“风光储联合优化”这类思路。等整套框架跑通了,再迁移到更复杂的系统也不迟。
1.3 这个项目要解决什么问题
明确了平台之后,我再梳理一下项目要解决的核心矛盾。光伏和风电的出力受天气影响,中午光伏大发、晚上负荷高峰但光伏为零;风电则可能在后半夜出力较大。这种时间错配会导致很尴尬的局面:光伏大发时负荷用不完,功率向上倒送还可能抬高电压;傍晚负荷上升时分布式电源却帮不上忙,电压又往下掉。
储能就是用来解决这个时间错配的。优化目标可以概括成:在满足电压约束和储能运行约束的前提下,合理调度储能的充放电功率、调节分布式电源的无功出力,让配电网的网损尽量小、电压偏差尽量小、运行成本尽量低。听起来只是几个目标函数,实际操作时却要处理数据时序、模型参数、算法收敛等一系列问题,这也是我写这篇文章的原因。
2. 基础模型搭建:从IEEE33到含风光储的仿真系统
2.1 先搞定IEEE33的潮流计算
搭建整个系统之前,必须先把IEEE33的基础潮流计算跑通。配电网通常是辐射状结构,最常用的潮流算法是前推回代法(Backward/Forward Sweep),原理很直观:先假定各节点电压为额定值,从末端节点向根节点回代求支路电流和功率,再根据根节点电压前推算出各节点电压,反复迭代直到收敛。
我在MATLAB里实现潮流时,第一步是录入网络拓扑数据。IEEE33系统的每条支路都有起点、终点、电阻、电抗,每个节点都有有功和无功负荷。网上能找到的版本很多,但不同论文里的个别参数可能有出入,我建议以Baran和Wu原始论文中的支路数据为准,并把根节点电压设为1.0 p.u.。这一步看起来很基础,却是最容易翻车的地方——我一开始直接套用网上某份数据,算出来的总网损和标准结果对不上,后来逐条核对才发现是支路数据里有一行抄错了。
2.2 风电出力模型:别迷信随机数,先看物理规律
风电建模的核心是风速到输出功率的转换关系。常见的风电机组出力分段函数是这个形式:风速低于切入风速或者高于切出风速时,出力为零;风速在切入风速和额定风速之间时,出力随风速的三次方变化;达到额定风速之后,出力稳定在额定功率。我用的典型参数是切入风速3m/s、额定风速13m/s、切出风速25m/s,风机额定功率400kW。
风速时序数据怎么来?两种常用做法:一种是直接用某地区典型日风速实测曲线,另一种是用威布尔分布随机抽样生成。我自己的经验是,验证优化算法时没必要把随机模型搞得太复杂,直接把一天24小时的风速曲线列出来,按公式转成出力序列就够了。这样结果可复现,排错也方便。等算法逻辑验证完毕,再换成更精细的风速时序模型也不迟。
2.3 光伏出力模型:光照、面积和温度三件套
光伏出力模型的经典公式是:P_pv = η × S × G_t × [1 - β × (T_c - T_ref)],其中η是光伏板效率,S是光伏阵列面积,G_t是光照强度,T_c是电池板温度,T_ref是参考温度,β是温度系数。实际仿真里,很多项目会简化成基于标准测试条件的近似式:P_pv = P_stc × (G/G_stc) × [1 + γ × (T_c - 25)]。
我在项目里设定光伏装机容量600kW。关于“装机容量怎么定”,我的习惯是不超过区域峰值负荷的30%到40%。光伏渗透率太高时,午间出力远超本地负荷,潮流倒送会让节点电压抬得很高,单靠储能很难完全压住。这个数值也是后面反复调了很多次才定下来的。如果你只是做纯学术验证,也可以按你需要的渗透率场景来设计,但至少要保证潮流能收敛、电压不越限。
2.4 储能建模:别只做SOC,还要考虑衰减
储能模型比风光模型要稍复杂一些,因为它涉及时间上的耦合——今天充的电,明天才能放。核心状态是SOC(荷电状态),离散化的更新公式是:放电时SOC(k+1) = SOC(k) - P_dis × Δt / (η_dis × E_b),充电时SOC(k+1) = SOC(k) + η_ch × P_ch × Δt / E_b。注意这里的充放电效率不能省略,不同效率对一天的能量平衡影响很大。
除了SOC,我在这个项目里还加了储能衰减建模。储能电池循环寿命和放电深度DOD直接相关,放电深度越深,可用循环次数越少。简化做法是把电池容量衰减率建模成循环次数的线性函数:C_loss = c0 + c1 × N_cycle,每次深度放电循环过后容量衰减一点。这样做的好处是优化的时候不会只顾着眼前一天,而毁掉电池寿命。虽然短期仿真里衰减量不大,但把这个因素放进目标函数里,能显著降低优化出的充放电策略的“暴力程度”,避免出现每天深充深放的极端方案。
2.5 接入位置和容量:不能拍脑袋定
风光储接入哪些节点,直接决定优化结果好不好看。IEEE33系统末端节点离电源远,电压偏低,比如节点18、节点17附近的电压在重载时可能掉到0.95p.u.以下。把光伏和储能放在这类电压薄弱节点,优化效果最明显。储能则要考虑它跟光伏、风电的配合关系,通常放得离波动源近一些,方便就地平抑功率。
容量配置上,除了前面说的光伏不超过峰值负荷40%之外,储能容量我按“削峰电量”来估算:统计典型日负荷曲线中高于平均负荷的部分,把多出的电量累加起来,再除以放电深度上限(一般取80%),得到的最小能量就是储能下限。我这个场景算下来大约是600kWh,最后取了800kWh留出余量。至于储能功率,很多人问“工商业储能放电功率一半是多大”,其实就是按“两小时充放”的工程惯例来的:800kWh的系统配400kW功率,再用典型负荷曲线校核一下峰值转移效果,不够就加大功率,够用就保持。
3. 优化问题定义与算法实现
3.1 目标函数:网损、电压偏差、运行成本一个都不能少
优化目标设计是整个项目的灵魂。我用的目标函数是三个指标的加权和:系统网损、节点电压偏差、储能运行成本(含衰减成本)。三个量纲不一样,必须归一化处理。网损耗用相对于无优化基准网损的比值,电压偏差用各节点电压偏离1.0p.u.的总和,运行成本则用储能充放电功率折算后的费用与容量衰减成本之和。
权重怎么定?我的做法是先用几组典型场景做敏感性测试:比如让网损权重占0.5、电压偏差占0.3、成本占0.2,观察优化出的储能充放电曲线和系统电压曲线。如果网损降低很多但储能充放电极其频繁,说明成本权重太小;如果SOC波动平缓但电压仍然越限,说明电压偏差权重不够。反复调几轮之后,基本能找到一组让你满意的权重。
3.2 约束条件:忘了哪一条都会出幺蛾子
优化问题最怕约束考虑不全。我整理了一下,至少要包含下面这几类:潮流等式约束、节点电压上下限约束(通常0.95到1.05p.u.)、支路电流不越限约束、DG有功无功出力范围约束、储能功率上下限约束、储能SOC上下限约束,以及同一个时刻不能同时充电和放电的互斥约束。
这里特别容易踩坑的是SOC末端约束。如果只设置SOC的范围而不约束调度周期结束时的SOC值,优化结果往往会在最后一个时段把储能彻底放空,第二天没法继续运行。我一般加一个SOC终值约束,让一天结束时SOC回到初始值附近,比如52%到55%,这样整个优化策略才是可持续的。加了这个约束之后,储能曲线看起来就合理多了。
3.3 算法选型:PSO、GA,还是二阶锥规划
IEEE33含风光储优化是一个带非线性约束的连续优化问题。我用过的方案主要有三种:粒子群算法(PSO)、遗传算法(GA)和二阶锥松弛优化(SOCR)。先给个直观对比:
| 维度 | PSO | GA | SOCR |
|---|---|---|---|
| 实现难度 | 低 | 中 | 高 |
| 收敛速度 | 较快 | 一般 | 确定性收敛 |
| 全局搜索能力 | 中等 | 较好 | 依赖建模精确度 |
| 对约束的处理 | 罚函数即可 | 罚函数即可 | 需潮流凸化 |
| 适合场景 | 连续控制变量 | 含离散变量 | 规范潮流建模 |
PSO和GA处理目标函数灵活,但得到的解不一定全局最优;SOCR用YALMIP加CPLEX或Gurobi求解,能拿到严格最优解,但前期要把潮流方程改写成凸形式,建模门槛比较高。我在这个项目里主用PSO,因为它实现快,对连续控制变量(储能功率、DG无功出力)效果好,而且后期加约束、改目标函数都很方便。等框架稳定后,可以用SOCR验证一次最优性,两者配合着用是最稳的组合。
3.4 PSO参数调整心得:别再默认设0.729了
粒子群算法最容易忽略的就是参数调优。我用的是惯性权重线性递减策略,w从0.9递减到0.4,这样前期全局搜索能力较强,后期局部精细搜索能力较强。种群规模取40,迭代次数设100次。如果你直接抄网上默认参数(w=0.729,c1=c2=1.494),结果大概率不理想,因为这个参数组合是针对无约束标准测试函数设计的,跟含强约束的配电网优化场景差距很大。
约束处理是我用PSO时最需要注意的地方。我采用罚函数法,把电压越限量和SOC违反复加到目标函数里,罚因子取得足够大,比如10的5次方量级,让违反约束的方案在迭代中自然被淘汰。这里有个小经验:罚因子不能一开始就拉满,不然种群早期会集中在一个可行域很小的地方,失去多样性。我一般前30代用相对较小的罚因子,让粒子能跨越边界探索,后面再把罚因子逐渐加大。
4. 仿真流程与结果分析
4.1 场景设计:天气、负荷、网架缺一不可
仿真不是把典型日数据往模型里一丢就算完事,场景设计要覆盖不同运行状况。我设计了三个典型场景:场景一是夏季晴天,光照充足、负荷偏高,重点看光伏大发时段电压是否越限;场景二是大风多云天气,风电出力波动大,重点看储能跟随波动的效果;场景三是冬季负荷高峰且光伏风电均偏小,重点看在分布式电源帮不上忙时,系统电压是否还能保证。
每个场景都用96点数据,即15分钟一个采样点。选择96点而不是24点,是因为1小时粒度会把光伏午间的快速波动抹平,优化结果会偏乐观。虽然96点让计算时间增加了好几倍,但结果更真实。如果你在调代码阶段,先用24点跑通再切换到96点,效率会高很多。
4.2 仿真主流程:数据、优化、回验三步走
整套仿真流程我总结成三步:第一步,初始化IEEE33系统参数和风光储模型参数,生成96点时序数据;第二步,用PSO迭代求解调度策略,得到未来一天的储能充放电计划和DG无功出力计划;第三步,把优化后的控制指令回带到潮流计算里,验证系统电压、网损、支路电流是否满足限值。
核心代码的骨架大概是这样的:
% 初始化系统数据 bus_data = load_ieee33_bus(); % 33节点负荷数据 branch_data = load_ieee33_branch(); % 生成风光时序出力 P_pv = pv_model(irradiance, temp); P_wt = wt_model(wind_speed); % PSO主循环 for iter = 1:max_iter for i = 1:pop_size [P_bess, Q_dg] = decode(position(i, :)); [P_loss, V_min, soc_end] = evaluate(P_bess, Q_dg, P_pv, P_wt); fitness(i) = w1 * P_loss / P_loss0 ... + w2 * delta_U / delta_U_max ... + w3 * cost_ess / cost_max; end update_position(); end % 回验潮流 final_result = run_powerflow(P_bess_opt, Q_dg_opt, P_pv, P_wt);回验这一环节很多新手容易跳过,直接用优化器里的潮流中间量代替最终结果,这是不对的。PSO迭代过程中为了省时间会用简化潮流模型,最终结果必须用完整的前推回代法重新算一遍,确保所有约束都被满足。
4.3 结果怎么看:网损、电压剖面和SOC曲线
优化结果出来了,怎么看呢?我习惯看三样东西。第一是网损曲线,无优化场景下网损峰值一般出现在晚峰时段,优化之后峰值明显削低,这是储能错峰放电起的作用。第二是电压剖面,优化前的末端节点电压曲线在傍晚可能跌破0.95p.u.,优化后整体抬升,尤其光伏出力大和储能放电时段改善最明显。第三是储能SOC曲线,一个合理的SOC曲线应该光滑、无明显跳变,且在一天内完成“充—放—充”的循环,终值回到初始值附近。
我常跟别人说,SOC曲线是整个优化模型好坏的“照妖镜”。如果SOC曲线锯齿状剧烈跳变,说明目标函数缺乏平滑性约束,或者储能功率上限设得太大;如果SOC一天之内纹丝不动,说明储能没有被有效利用,可能是目标函数里投资收益权重太低,或者削峰填谷的激励不够。
4.4 方案对比:有和没有储能,差距有多大
仿真做完之后,我做了几个对照方案,这样结果更有说服力。方案一是原始IEEE33,不接任何分布式电源;方案二只接风电和光伏,不配储能;方案三是风光储全接,且储能参与优化调度。结果对比如下:
| 指标 | 原始IEEE33 | 仅风光 | 风光+储能优化 |
|---|---|---|---|
| 日网损/kWh | 约202 | 约171 | 约148 |
| 节点电压最低值/p.u. | 0.919 | 0.943 | 0.962 |
| 电压越限节点数 | 8 | 3 | 0 |
| 储能日等效循环次数 | - | - | 1.2次 |
从表格里能清楚看到:只接风光虽然能降低网损,但电压改善有限,而且午间还可能局部越上限;加了储能并优化之后,网损进一步下降,电压越限完全消除。这说明储能的作用不只是削峰填谷,它还是维持电压稳定的关键调节资源。
5. 常见问题与排查技巧实录
5.1 潮流不收敛,先检查这几个地方
我遇到过三次潮流不收敛的情况,原因各不相同。第一次是支路数据抄错,导致拓扑连接出错;第二次是DG出力设置过大,末端节点电压超过1.1p.u.,前推回代法迭代发散;第三次是储能放电功率在某个时段突破了线路传输极限。排查的顺序建议是:先看拓扑数据有没有问题,再看根节点电压和总负荷量级,最后看DG和储能功率有没有超出线路承载能力。如果DG容量过大导致潮流不收敛,试着把容量降下来,或者把部分DG从PQ节点改成PV节点。
5.2 储能充放电过于频繁,加一个切换惩罚
优化结果里最让人头疼的问题,就是储能功率曲线高频振荡:这一小时充电,下一小时放电,再下一小时又充电。这种情况在数学上可能没问题,但工程上完全不可行,储能逆变器和电池都受不了。我的解决办法是在目标函数里增加一个充放电切换惩罚项,只要相邻时段充放电状态发生翻转,就加上一个惩罚成本。加了这个惩罚之后,储能的充放电次数从一天十几次降到了一天两三次,曲线平滑了很多。
5.3 粒子群早熟收敛,试试反向初始化
PSO最怕过早收敛到局部最优。我这个项目里有段时间优化结果始终不如预期,网损总是在某两个值之间来回跳,一看就是陷在局部最优里了。后来检查发现是初始种群分布不够均匀,粒子全部集中在可行域的一侧。我改成反向初始化策略:先随机生成一半种群,再对每个粒子生成一个反向粒子,取适应度较好的一半作为初始种群。这个改动虽然简单,但能明显提升最终解的质量,迭代曲线也更平滑。
5.4 时间尺度选1小时还是15分钟,别想当然
如果你只是想验证算法逻辑,24点的时间尺度完全够用,算得快,调试方便。但如果你的目标是反映真实运行情况,或者结果要用于工程参考,至少要用96点。我做过一次对比实验,同一套风光数据,24点优化结果和96点优化结果的储能充放电计划差异很大,24点方案在真实15分钟尺度下回验时甚至会出现电压越限。原因很简单:1小时平均抹掉了光伏短时波动的峰值,优化结果自然偏乐观。以后你要是写报告或者论文,时间尺度这一项一定要写明,否则结果可信度会打折扣。
6. 最后分享一点个人的实操体会
做这个项目最大的感受是:主动配电网优化的难点不在算法,而在模型和数据。算法框架拆开来就是目标函数、约束条件、求解器三件事,任何一个懂优化的人都能写;但要把风光储的时序特性、储能的运行损耗和衰减、电压约束这些因素都妥帖地放进一个模型里,才是最花时间的地方。
我踩过最大的坑就是刚开始太执着于用高级算法,把灰狼算法、混合整数规划轮着试,结果模型本身粗糙,算法再好也救不回来。后来老老实实把IEEE33基础潮流跑稳,把PV和风速转成时序曲线,把储能SOC更新公式写对,再回头做优化,结果一下就顺了。如果让我重新做一遍,我会更早开始做方案对比表,因为只有把“无优化、部分优化、全优化”的指标放在一起,你才能真正看清储能和分布式电源各自贡献了多少价值。
后续这个框架还可以扩展的方向很多。比如把网络重构的联络开关状态变量加进优化,或者接入电动汽车充电负荷、需求响应资源,甚至把一天前的预测数据和实时滚动优化接起来,做成模型预测控制。希望这篇文章能帮你在IEEE33上少走几步弯路,把时间省下来用在更有价值的部分。