拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于PSO的IEEE 33节点配电网储能优化调度详解

简介针对33节点配电网经济调度与储能协同优化问题基于粒子群优化PSO算法的MATLAB实现代码包提供了完整解决方案适合电力系统、微电网及智能优化算法方向的本科生和研究人员学习参考。压缩包共5个文件包含3个.m源码文件对应PSO主程序、适应度函数与约束处理模块、1个.mat结果数据文件保存寻优后的调度参数及收敛过程数据和1个.asv自动备份文件整体仅8KB结构紧凑。目前已有260人浏览学习代码可在MATLAB中直接运行便于观察粒子群迭代寻优、储能充放电状态切换及经济调度约束处理的具体实现。通过研读这份代码读者能掌握33节点系统经济调度的建模思路、PSO参数设置与改进策略理解储能在平抑负荷波动和降低运行成本中的作用并可进一步扩展为多目标优化或含新能源不确定性的调度研究。1. 先搞清楚33节点PSO调度到底在算什么如果只搜“PSO调度”出来的大多是抽象例子落到“33节点储能”之后问题就具体了IEEE 33节点配电网是经典测试系统12.66kV、32条支路、5个联络开关常用来验证各种配电网优化算法。把粒子群算法接到这个系统上做储能调度本质是求解一个带约束的非线性优化问题——在储能容量和功率限制下决定未来24小时每个时段的充放电功率让网损、电压偏移或运行成本这类目标函数最小化。这类问题的价值在于储能介入后“何时充、何时放”往往比“装多少”更影响效果。光伏大发时段充电、晚高峰放电听起来简单配上潮流约束、SOC连续性和分时电价之后人工经验很难逼近最优解PSO这类不依赖梯度的群体智能算法就成了常见选择。适合正在做配电网优化研究的工程师以及准备数学建模竞赛——比如2017电工杯A题微电网日前优化调度——刚接触群体智能的参赛者。2. 把33节点系统和储能约束写成PSO能优化的目标函数2.1 IEEE 33节点系统为什么适合做调度测试IEEE 33节点系统最初是配电网重构的基准网络后来被广泛用于各种配电网场景。它的大小刚好节点不多手写潮流也能跑但拓扑有分支、末端电压偏低能看出优化算法对电压分布的影响。这个特征对储能调度很有意义——把储能放在电压偏低节点附近不只是做能量搬移还能改善电压剖面。用pandapower或matpower读现成模型数据是最省事的办法。常见做法是把matpower的case33.m转成pandapower的net结构或者按IEEE标准数据逐行录入支路参数然后跑一次潮流验证根节点电压和总网损是否与基准值一致。33节点系统在根节点电压1.0p.u.、全部额定负荷接入时总网损约202.68kW这是校验网络建模是否正确的基准。如果偏差超过2%优先检查支路阻抗单位Ω与p.u.以及功率基准值。提示pandapower不直接内置33节点数据转换case33.m时注意线路单位是Ω还是标幺值本人在第一步吃过亏。2.2 储能设备的建模SOC是状态变量不是决策变量储能建模是调度问题里最容易出错的部分。常见错误是把SOC当决策变量直接编进粒子结果相邻时段SOC跳变充电量和放电量对不上物理上根本不成立。正确做法是SOC是状态变量决策变量是每个时段的充放电功率P_b(t)SOC通过时域递推关系算出来。递推关系一般写成SOC(t) SOC(t-1) (η_c * P_c(t) - P_d(t) / η_d) * Δt / E_b这里η_c和η_d是充放电效率Δt是时段长度小时E_b是储能额定容量kWhP_c(t)和P_d(t)分别是充电和放电功率kW。同一个时段不能既充电又放电否则等于能量凭空增减这是物理约束。充电和放电的功率不能超过额定功率SOC也有上下限。按天循环运行时通常设定SOC(24) ≈ SOC(0)否则第二天无电可放时间耦合就断了。一个完整的SOC更新函数如下def update_soc(soc_prev, p_b, dt1.0, eta_c0.95, eta_d0.95, e_b1.0): p_b为正表示放电负表示充电 if p_b 0: soc soc_prev - p_b / eta_d * dt / e_b else: soc soc_prev - p_b * eta_c * dt / e_b return soc参数说明p_b是当前时段的储能出力正值放电、负值充电dt是时段长度典型取1小时e_b是储能容量。这个函数与后面PSO适应度函数里的SOC计算逻辑完全一致如果两边对不上优化结果会在诡异的地方飘。储能模型里的常见参数范围如下表。参数符号典型取值范围备注额定容量E_b0.5~2 MWh按配电网峰值负荷的5%~10%估算最大充放电功率P_max0.2~0.5 MW与容量匹配C倍率约0.5C充电效率η_c0.90~0.95锂电池典型值放电效率η_d0.90~0.95一般与充电效率一致SOC下限SOC_min0.1~0.2避免过放SOC上限SOC_max0.9~1.0避免过充2.3 目标函数按场景拆解网损优先还是经济优先目标函数决定优化方向。最常见的是技术性目标网络有功网损最小还有经济性目标运行成本最小涉及分时电价和储能折旧。建议先把两者分开跑再按业务需要做加权。网损通过潮流计算获得电压目标取电压偏差累计和经济目标则对比购电成本和储能损耗f_cost sum(P_grid(t) * price(t) * Δt) sum(α * |P_b(t)| * Δt)P_grid(t)是向上级电网购电功率price(t)是分时电价α是储能单位放电成本。这样优化结果能反映“电价低时充电、高时放电”的套利逻辑。但一定别忽略储能循环寿命代价否则算法会把储能当成无限寿命的理想设备结果算出来的收益在现实里根本兑现不了。3. 用Python和pandapower搭一个PSO储能调度框架3.1 粒子编码每个粒子的维度从哪来用PSO求解储能调度时每个粒子代表一个完整的调度方案。假设有N_ess台储能、调度周期T个时段24小时调度T24粒子维度DN_ess×T每一维对应一台储能在某一时段的输出功率。本人在代码里约定正值放电、负值充电这个约定必须贯穿SOC递推和罚项计算否则会出现物理上可笑的“边充边放”。初始化粒子时功率值落在[-P_max, P_max]区间SOC初值一般是0.5。初始种群质量对收敛速度影响很大全随机大功率充放电会让前几次迭代的适应度极高。常见做法是把1/3的初始粒子放在启发式模式附近——负荷低谷充电、晚高峰放电——其余保持随机分布这样既有合理起点又不破坏PSO的探索能力。粒子维度索引含义取值范围0~T-1储能1在1到T时段的输出功率[-P_max, P_max] MWT~2T-1储能2在1到T时段的输出功率[-P_max, P_max] MW3.2 适应度函数怎么和潮流计算接口适应度函数输入粒子的功率序列输出一个标量。计算过程分两步先把粒子解码成逐时段储能出力再对每个时段做潮流计算把网损、电压偏差和罚项合成一个值。在pandapower中储能出力通过sgen实现正p值放电、负p值充电。每个时段都要调用一次runpp24个时段的调度周期对应24次潮流计算。一个趋势性认知粒子群规模40、迭代200次总潮流计算次数是40×200×2419.2万次。33节点单次潮流是毫秒级但极端负荷下runpp可能不收敛。下面给出PSO骨架和与pandapower交互的核心逻辑import numpy as np import pandapower as pp # 推荐起始参数 W 0.8 # 惯性权重 C1 1.5 # 个体认知系数 C2 1.5 # 社会认知系数 N_PARTICLES 40 MAX_ITER 200 T 24 # 调度时段数 E_B 1.0 # 储能容量MWh ETA_C 0.95 # 充电效率 ETA_D 0.95 # 放电效率 SOC_MIN, SOC_MAX 0.1, 0.9 P_MAX 0.5 # 最大充放电功率MW def compute_fitness(power_seq, net, ess_sgen_idx): power_seq 长度 T正值为放电负值为充电 soc 0.5 loss_sum 0.0 penalty 0.0 for t in range(T): p_b power_seq[t] # 更新储能出力 net.sgen.loc[ess_sgen_idx, p_mw] p_b pp.runpp(net) # 33节点是纯线路网络网损线路损耗之和 loss_sum net.res_line.pl_mw.sum() # SOC递推 soc (ETA_C * max(-p_b, 0) - max(p_b, 0) / ETA_D) * 1.0 / E_B # SOC越限惩罚 if soc SOC_MIN or soc SOC_MAX: penalty min(SOC_MIN - soc, 0) ** 2 max(soc - SOC_MAX, 0) ** 2 # 调度周期末SOC应回到初值0.5附近 penalty (soc - 0.5) ** 2 * 100.0 return loss_sum 1000.0 * penalty class PSO: def __init__(self, dim, n_particlesN_PARTICLES, wW, c1C1, c2C2, max_iterMAX_ITER): self.dim dim self.n n_particles self.w w self.c1 c1 self.c2 c2 self.max_iter max_iter self.x np.random.uniform(-P_MAX, P_MAX, (n_particles, dim)) self.v np.random.uniform(-P_MAX * 0.1, P_MAX * 0.1, (n_particles, dim)) self.pbest self.x.copy() self.pbest_fitness np.full(n_particles, np.inf) self.gbest self.x[0].copy() self.gbest_fitness np.inf def optimize(self, net, ess_sgen_idx): for _ in range(self.max_iter): for i in range(self.n): fit compute_fitness(self.x[i], net, ess_sgen_idx) if fit self.pbest_fitness[i]: self.pbest_fitness[i] fit self.pbest[i] self.x[i].copy() best_idx np.argmin(self.pbest_fitness) if self.pbest_fitness[best_idx] self.gbest_fitness: self.gbest_fitness self.pbest_fitness[best_idx] self.gbest self.pbest[best_idx].copy() r1 np.random.random((self.n, self.dim)) r2 np.random.random((self.n, self.dim)) self.v (self.w * self.v self.c1 * r1 * (self.pbest - self.x) self.c2 * r2 * (self.gbest - self.x)) self.x np.clip(self.x self.v, -P_MAX, P_MAX) return self.gbest, self.gbest_fitness速度更新公式里w是惯性权重c1是自我认知系数c2是社会认知系数r1和r2是[0,1]均匀随机数。初始化速度设为搜索范围的10%避免粒子前几步直接飞出边界。SOC越限罚项用平方量级末值SOC罚项系数取100末值偏差0.1时罚项约1相对网损数量级一天几个MWh能引导搜索但不会压制参数空间的探索。如果你的储能容量更大记得同步放大罚项系数。3.3 跑通潮流计算时最常遇到的3个问题第一个高频问题出现在sgen索引维护上。pandapower的sgen索引是创建时自动递增的按顺序创建多台储能时索引顺序与bus顺序不一定一致。常见做法是初始化网络时保存一份字典key是bus索引value是sgen索引后续更新出力直接查表。另一个隐蔽问题是循环中忘了复位上一轮的sgen出力导致同一时段多台储能重复计算网损偏大但不报错很难发现。第二个问题是runpp不收敛。33节点系统负荷较重时如果储能在峰值时段还大量充电潮流就可能算不出来。先检查电压是否越限再看根节点提供的功率是否超出配电网容量。有人会设check_connectivityFalse来绕过但这只解决表面报错不解决物理问题真正的解要靠约束处理让粒子远离不可行区域。第三个问题是单位换算。粒子功率用MW时pandapower的sgen.p_mw直接填数值即可但net.sn_mva会影响标幺值。如果从文献里拿到的数据是kVA或MVA一定要把基准容量搞清楚。本人有次在33节点上跑出离谱网损查了半天发现是sgen功率单位填成了kW数值相差1000倍。4. 面向33节点储能调度的PSO参数设置与约束处理4.1 惯性权重和学习因子的取值策略PSO参数直接影响求解质量。固定惯性权重w在0.7~0.9之间都能工作但固定值的问题是后期收敛性差w0.9时全局探索强局部搜索弱w0.7时正好相反。标准做法是线性递减w w_max - (w_max - w_min) * t / T_maxw_max取0.9w_min取0.4t是当前迭代次数T_max是总迭代次数。前期保持大惯性探索不同区域后期小惯性在最优解附近精细搜索。在33节点储能调度中这个策略比固定w0.8在相同迭代次数下通常多下降5%~10%的网损。学习因子c1和c2的经验值在1.5~2.0之间。c1大粒子更倾向朝自身历史最优方向移动c2大粒子更倾向朝全局最优移动但也更容易早熟。一种不对称设置是c1从2.5线性降到0.5c2从0.5升到2.5前期侧重自我探索、后期侧重全局引导。在带分时电价的多峰目标函数里这个设置比固定参数更稳。迭代阶段惯性权重wc1c2策略说明前期(0~1/3)0.9~0.72.5~1.50.5~1.5鼓励全局探索中期(1/3~2/3)0.7~0.51.51.5平衡探索与开发后期(2/3~T)0.5~0.41.0~0.52.0~2.5强化向最优解收敛4.2 约束处理罚函数比修复策略更省事储能调度有三类核心约束储能运行约束功率上下限、SOC上下限、潮流约束节点电压上下限、支路电流上限、调度周期约束SOC初末相等。功率和SOC上下限在粒子编码阶段就截断了剩下的是潮流约束和SOC末值约束。修复策略的思路是每次计算适应度前扫描粒子功率序列发现SOC越限就把该时段功率往0靠直到可行为止。这个策略实现直观但破坏了解空间的连续性算法在修复边界上的行为不可控。罚函数法更常用在目标函数里加越限量平方乘权重。比如节点电压越限def voltage_penalty(V, V_min0.95, V_max1.05, lam1e4): V是潮流计算后的节点电压幅值数组 over_upper np.maximum(0, V - V_max) ** 2 under_lower np.maximum(0, V_min - V) ** 2 return lam * (over_upper.sum() under_lower.sum())罚函数法不改变搜索逻辑实现成本低调λ的过程其实是在建立对问题尺度的手感。λ太小会接受大量不可行解λ太大则让早期目标函数动态范围过大粒子很难从适应度差异里获取有效的梯度信号。一般从10^4起步观察前50次迭代的适应度曲线再调整。SOC末值约束也在罚项里处理偏差平方乘系数系数要和对网损的数量级对比来定。千万不要把SOC末值约束去掉否则优化结果会告诉你“一天之内全部放完”才是最优那只是把储能当一次性电池用的数学幻觉。4.3 早熟收敛怎么判断适应度曲线和粒子聚合度早熟收敛是PSO在33节点储能调度中的高频故障。粒子群初始化不好或学习因子失衡时可能迭代不到50次就聚到同一个局部最优附近。判断方法很简单计算每轮粒子群位置的标准差。标准差小于搜索范围的1%但适应度曲线仍在明显下降说明还有收敛趋势如果标准差很小且适应度曲线几乎水平就是停滞了基本可以判定早熟。处理手段有两个重置和变异。重置就是在停滞时将当前群体速度随机化把一部分粒子重新随机初始化到搜索空间。变异是每轮末尾以一个小概率0.01~0.05随机改变某些粒子的个别维度值让它们跳出局部最优。这两个操作都不需要改PSO主体框架在compute_fitness之外加一个函数调用就行。单纯调大c2也可以延缓早熟但那是拿收敛速度换搜索范围不如重置直接。5. 储能调度结果验证与自适应PSO的一个实用改进5.1 没有基准解的时候怎么验证调度结果跑完PSO之后第一步不是看适应度终值而是检查优化结果是否违反储能物理约束。把全局最优粒子的功率序列取出来按SOC递推公式回放24小时的SOC曲线确认SOC始终在上下限内、末值接近初值。如果SOC在某段时间先陡降再陡升多半是出现了同一时段充放电互相抵消需要给目标函数加同充同放惩罚项。第二步做网损对比把储能功率全置0作为不装储能基线跑一次潮流记录总网损再把优化后的调度方案代入算一次新的总网损。正常情况下合理调度应让网损下降5%~15%。如果下降超过20%往往是把储能效率当成了100%如果下降为负就是充放电时机选反了比如从没在负荷低谷充电。第三步看电费收益。调度问题含分时电价时把储能套利收益与不装储能对比。这里有个常见误区峰谷价差乘以放电量不等于实际收益因为充放电综合效率η_c×η_d通常只有0.81~0.90损耗吃掉了一部分价差。只有当峰谷价差大于充放电损耗成本时储能套利才有正收益。跑完算法顺手算一笔经济账比空看收敛曲线有用得多。5.2 一种更稳定的自适应惯性权重实现线性递减惯性权重是工程上最稳妥的PSO改进下面给出能直接替换基类固定w的版本class AdaptivePSO(PSO): def __init__(self, dim, n_particles40, c11.5, c21.5, max_iter200): super().__init__(dim, n_particles, w0.9, c1c1, c2c2, max_itermax_iter) self.w_max 0.9 self.w_min 0.4 def update_inertia(self, t): # 线性递减惯性权重 self.w self.w_max - (self.w_max - self.w_min) * t / self.max_iter def optimize(self, net, ess_sgen_idx): for t in range(self.max_iter): self.update_inertia(t) # 以下循环与基类PSO.optimize完全一致 # 适应度评估、个体最优/全局最优更新、速度位置更新、限幅实现上唯一改动是每轮先调用update_inertia完全不动潮流计算和适应度函数属于即插即用。w_min不一定要固定在0.4如果目标函数峰谷尖锐w_min放宽到0.5如果目标函数平滑w_min可以收紧到0.3。验证改进是否有效的标准也很直接固定w版本和自适应w版本在同一台机器上各跑10次记录每次的gbest_fitness和收敛时的迭代数做平均对比。如果自适应版稳定更好就保留否则维持固定w更省心毕竟多一个参数就多一分调参成本。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门