ARTICLE DETAIL

资讯详情

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

基于粒子群算法的配电网日前优化调度:IEEE33节点系统实践

基于粒子群算法的配电网日前优化调度:IEEE33节点系统实践 配电网从“被动受电”变成“有源网络”之后调度这件事的复杂度一下子就不一样了。风一吹、云一飘分布式光伏和风电出力就变了负荷曲线也跟着起伏传统的固定运行方式根本压不住这种波动。我最近做了一个基于粒子群算法的配电网日前优化调度项目用IEEE33节点标准测试系统搭了一套含风电、光伏、储能、柴油发电机和燃气轮机的联合调度模型提前一天把各类可控资源的出力计划排出来在满足电压、功率平衡等安全约束的前提下把运行成本降到最低。这篇文章就把这个项目的完整思路、建模过程、算法实现和踩过的坑整理出来适合正在做电力系统优化调度方向研究的学生以及想入门配电网经济调度的工程师参考。1. 项目背景与整体思路1.1 为什么要做“日前”优化调度“日前”这个概念简单说就是提前一天、以1小时为时间间隔制定未来24小时各台机组的开停机计划和出力曲线。为什么需要提前排因为电网运行不能靠临时拍脑袋尤其当系统里同时存在风光这种强随机性电源以及储能、柴油机、燃气轮机这些响应速度不同的可调度资源时必须给每类资源一个明确的“作业计划”。比如储能什么时候充电、什么时候放电柴油机白天要不要开机这些都牵扯到燃料消耗、电池寿命和购电成本。之所以选“日前”这个时间尺度而不是实时调度或日内滚动调度是因为日前调度是整套调度体系里成本优化的主战场。实时调度更多做偏差修正而经济性的大头在日前阶段就已经锁定了。风电、光伏虽然有预测误差但提前24小时的功率预测精度已经能支撑决策储能和机组的启停计划也必须在日前确定下来等到了当天再启停机组往往来不及成本也更高。1.2 为什么用IEEE33节点和粒子群算法IEEE33节点系统是配电网研究里最经典的标准算例地位相当于电路设计里的基准测试电路。它是一条辐射状配电网包含33个节点、32条支路系统额定电压12.66kV首端节点通过上级变压器供电。这个系统的节点参数、线路阻抗、负荷数据在全球范围内公开可查大家发的论文结果都能横向对比所以用来验证调度策略特别合适。粒子群算法PSO是这次调度问题的核心求解器。为什么选它而不是遗传算法、模拟退火或者商业求解器因为日前调度模型本质上是一个带复杂约束的非线性优化问题决策变量是连续实数各时段机组出力、储能充放电功率PSO对连续变量的处理天生友好不用像遗传算法那样做编码解码参数也少实现起来很快。而且配电网潮流方程是非线性的如果强行线性化会损失精度用PSO做“黑盒”寻优配合潮流计算做逐点校验反而保留了模型的完整物理特性。2. 系统建模与关键参数设计2.1 IEEE33节点配电系统基础数据梳理拿到IEEE33节点系统首先要吃透它的基础参数。这个系统的基准功率取10MVA基准电压12.66kV总的有功负荷约3715kW无功负荷约2300kvar。系统一共有33个节点节点1是平衡节点由上级电网供电其余节点接负荷。还有5条联络开关支路正常情况下断开故障时闭合形成环网这部分在优化调度里可以作为网络重构的潜在手段不过这次项目先不考虑拓扑变化保持辐射状运行。我把每个节点的注入功率、每条支路的电阻电抗都整理成标准数据表这是后续潮流计算和约束校验的地基。这里有个容易忽略的点——IEEE33节点的数据有标幺值和有名值两套表示方式。在优化模型里机组出力、储能功率建议统一折算成标幺值这样粒子群搜索的尺度一致速度也更好设置。但潮流计算前要记得还原成有名值我一开始就是没注意单位换算导致潮流结果偏得离谱排查了很久才发现是基准值问题。2.2 风电、光伏出力模型与预测曲线风电和光伏属于不可控电源它们的出力由天气决定在日前调度里只能作为“预测值”硬性接入系统。风电出力模型通常用分段函数描述切入风速以下出力为0额定风速到切出风速之间出力恒定中间段则近似按三次方关系增长。光伏出力则跟光照强度直接相关通常用光照强度乘以组件效率、面积和温度修正系数来估算。在实际工程中没人会真去建模每一台风机或每一块光伏板而是直接取风电场、光伏电站的日前预测功率曲线。我做这个项目时按常见的配电网分布式电源配置比例设风电场额定容量300kW光伏额定容量400kW给出24小时预测曲线。风电曲线在夜间出力较高光伏曲线在中午12点到14点达到峰值这个时间特性直接决定了储能“低谷充电、高峰放电”的调度策略——中午光伏大发时储能充电蓄能晚高峰时放电顶峰。2.3 储能系统建模与衰减处理储能是这个系统里最灵活的“调节器”建模也是细节最多的地方。最基本的储能模型包括能量状态SOC更新方程、充放电功率约束、SOC上下限约束。我配置的储能是500kW/1000kWh也就是2小时额定放电时长这正好对应工商业储能的主流配置比例——按一般负荷曲线储能放电功率一般是容量的一半。SOC更新方程如下SOC(t1) SOC(t) - P_dis(t)·Δt/(η_dis·E_cap) P_ch(t)·η_ch·Δt/E_cap其中P_dis是放电功率P_ch是充电功率η_dis和η_ch分别取95%E_cap是额定容量Δt取1小时。这里要说一下储能衰减建模。最近储能衰减是行业里很热的讨论点锂电池循环次数增加后容量会衰减内阻会增大体现在调度模型里就是E_cap不是恒定值而是随充放电循环次数逐渐降低。我在目标函数里引入了一个储能退化成本项用充放电功率折算成等效循环寿命损耗每次充放电都会产生一个货币化的“磨损成本”。这样做的好处是调度结果不会让储能频繁满充满放而是合理使用因为算法会权衡电池磨损和购电节省之间的经济性。2.4 柴油发电机和燃气轮机特性柴油发电机和燃气轮机都是可控电源区别在于响应速度和燃料成本曲线。柴油机响应快、启停灵活但燃料成本高燃气轮机单机容量大效率相对高但启停时间长。两类机组的成本模型都采用二次函数。柴油机燃料成本函数为C_diesel a·P² b·P c其中a、b、c是成本系数P是出力功率。我按文献中常见的微型燃气轮机和柴油发电机参数柴油机额定功率200kW燃气轮机额定功率300kW。有一个必须处理的工程问题机组最低技术出力。柴油机不是从0就能满载的一般有30%的最低技术出力限制低于这个值运行会导致燃烧不稳定、排放超标。所以在优化模型里机组出力要么为0要么在最低出力和额定出力之间。这是一个典型的“0-1连续”混合变量问题纯PSO处理离散启停变量比较麻烦我采用的是连续化处理把启停状态松弛通过设置出力下限约束来隐式限制。2.5 负荷曲线与分时电价设置负荷曲线是整个调度问题的“另一端”。配电网的负荷呈现明显的双峰特性早峰出现在9-11点晚峰出现在18-21点凌晨则是低谷。我这里用的日负荷曲线有24个时段的功率值最大负荷大概在系统总负荷的90%左右最小的低谷负荷只有45%左右。电价机制对调度结果的影响非常大。我采用分时电价峰时段10:00-15:0018:00-21:00电价0.83元/kWh平时段0.49元/kWh谷时段23:00-次日7:00电价0.17元/kWh。储能的核心套利逻辑就是建立在电价差上的——谷时充电成本0.17元峰时放电卖价0.83元扣除充放电损耗和电池衰减成本后仍然有利润空间PSO算法会自动找到套利的最优时机。3. 粒子群算法核心原理与调度框架3.1 粒子群算法数学原理回顾粒子群算法的灵感来自鸟群觅食行为。每个粒子代表解空间里的一个候选解粒子有速度和位置两个属性每一轮迭代都根据个体最优位置pbest和群体最优位置gbest来更新自己的飞行方向。标准的速度-位置更新公式如下v(k1) w·v(k) c1·r1·(pbest - x(k)) c2·r2·(gbest - x(k)) x(k1) x(k) v(k1)这里面w是惯性权重控制粒子对上一时刻速度的继承程度c1、c2是学习因子分别控制粒子向自身历史最优和群体历史最优的趋近强度r1、r2是[0,1]内的随机数保证搜索的随机性。PSO之所以在电力调度里受欢迎核心原因是它几乎不要求目标函数有解析梯度。配电网的潮流方程是一堆非线性代数方程目标函数里还嵌套着潮流计算很多梯度类算法在这里根本无从下手。PSO完全不需要求导只要能把一个解“算出来”并给一个分数适应度值就能在这个“黑盒”上寻优。这就是它的核心价值。3.2 决策变量编码与粒子维度设计日前调度问题的核心是求每个时段各可控资源的出力。我这里的可控资源包括柴油机、燃气轮机、储能充放电各一个决策一共4个决策量。调度周期24小时那么每个粒子的维度就是4×2496维这96个数值完整描述了一个“24小时调度方案”。粒子编码时要注意变量取值范围差异很大。储能充放电功率在0-500kW之间柴油机在0-200kW之间燃气轮机在0-300kW之间。直接在原始空间搜索时不同维度速度尺度不一致会影响收敛。我的处理方式是把所有决策变量归一化到[0,1]粒子群在这个标准空间里搜索计算适应度时再反变换回实际功率值。这样每个维度的搜索步长一致收敛速度明显更均匀。3.3 约束处理与潮流计算耦合调度系统有一堆约束必须满足每个时段的功率平衡、节点电压上下限、线路载流量、储能SOC边界、机组爬坡限制。PSO本身是“无约束”的优化算法它天生不管约束所以我们要手动处理。我的约束处理策略是混合式等式约束用罚函数转成目标函数的一部分不等式约束在边界处做变量截断。具体来说功率平衡偏差平方累加后乘以一个较大的惩罚系数加进适应度值SOC如果越界就直接把SOC截断到边界值然后给一个惩罚分。罚函数的好处是简单鲁棒坏处是惩罚系数要反复调这会在后面第6节详细讲。潮流计算是整个适应度评估里最耗时的一环。每个粒子都要在24个时段各做一次潮流计算校验节点电压和支路功率是否越限。采用前推回代法处理IEEE33节点一般是辐射网用前推回代法迭代5-8次就能收敛速度很快。我统计过粒子群100个粒子、迭代200次每个粒子24次潮流总共48万次潮流计算在MATLAB里大概跑12-15分钟可以接受。3.4 关键参数选择与收敛判断粒子群算法的参数选择有常用经验范围。惯性权重w一般从0.9线性递减到0.4——前期大惯性有利于全局探索后期小惯性有利于局部精细搜索。学习因子c1、c2通常都取2.0或1.49445后者是Clerc提出的收缩因子配置理论上能保证收敛。种群规模取100迭代次数取200。收敛判断不能只看迭代次数我更看重的是自适应度值的改善幅度。如果连续30代的最优适应度变化小于千分之一基本可以认为找到稳定解了。实测下来这个96维问题在100粒子、200迭代的设置下通常在80-120代就开始趋于平稳考虑到多峰特性我一般不提前终止迭代200次让结果充分收敛。我用的是惯性权重线性递减策略w(k) w_max - (w_max - w_min) · (k / K_max)其中w_max0.9w_min0.4k是当前迭代数K_max是最大迭代数。4. 日前优化调度模型搭建4.1 目标函数设计日前优化调度的目标是让系统全天运行总成本最小。我这里的目标函数由四部分构成向上级电网购电费用、柴油机和燃气轮机的燃料成本、储能退化成本、弃风弃光惩罚成本。表达式如下F Σ[C_buy(t)·P_grid(t)] Σ[C_diesel(t) C_gas(t)] Σ[C_bat_degrad(P_ch(t), P_dis(t))] Σ[λ_wind·(P_wind_forecast - P_wind_used) λ_pv·(P_pv_forecast - P_pv_used)]购电费用是峰谷电价乘以时段购电功率这部分占成本的大头。燃料成本按二次函数算。储能退化成本按充放电功率线性折算。弃风弃光的惩罚系数取得比较高目的是一般不允许切除清洁能源让算法优先消纳风光。这里有个设计细节值得分享目标函数里没有刻意加网损项但网损已经通过潮流计算隐含在购电功率里了。因为上级电网不仅要供给负荷和机组出力差额还要供给网损所以购电量里自然包含网损成本。PSO在寻优时会主动倾向网损较小的调度方案因为那意味着更少的购电费。4.2 约束条件完备性检查一个好调度方案必须编织进所有物理约束。功率平衡约束需要在每个时段满足P_grid(t) P_wind(t) P_pv(t) P_diesel(t) P_gas(t) P_dis(t) P_load(t) P_ch(t) P_loss(t)这个等式左边是系统所有电源的出力右边是负荷、储能充电和网损。注意P_loss是潮流计算求出来的网损它让等式约束变成隐式约束——这也是PSO必须嵌套潮流计算的原因。电压约束是配电网最关注的安全指标。每个节点的电压幅值应该保持在0.95~1.05pu之间这是考虑电能质量后的常见运行范围。线路载流量约束限制支路电流不能超过线路长期允许载流量防止过载。储能约束包括充放电功率上限、SOC范围我设5%-95%、充放电不能同时进行。机组约束包括出力上下限和爬坡率。4.3 调度场景与边界条件设置为了验证调度策略的有效性我设置了几个对比场景。场景一是“无储能”情况只有风光柴燃和电网交互场景二是“储能分时电价”场景三是“储能分时电价弃风弃光惩罚”。三组场景对照就能清楚看出储能对系统经济性的贡献有多大以及惩罚系数对风光消纳的影响。边界条件还有个关键设定调度周期起点和终点的SOC要一致。也就是说储能不能“偷”初始电能——初始时刻SOC设定为50%结束时也必须回到50%一天下来储能的净电量是平的。这个约束非常重要它避免算法通过“放干电池”来虚增经济效益。很多初学的小伙伴写调度代码时漏了这个约束结果调度总成本非常漂亮但实际方案完全不可用。5. 实操过程与结果分析5.1 仿真环境与代码结构整套仿真在MATLAB R2022a环境下完成只用了基础功能没装额外工具箱。代码按功能分成四个模块数据初始化模块数据加载、系统参数设置、粒子群主循环模块种群初始化、迭代更新、适应度计算模块功率分配、潮流计算、约束校验、结果输出模块画功率平衡图、SOC曲线、电压分布图、收敛曲线。这里给出一段粒子群主体循环的简化伪代码方便理解整体的数据流% 种群初始化 pop rand(pop_size, dim); % 归一化粒子位置 vel zeros(pop_size, dim); % 粒子速度 pbest pop; % 个体最优 % 计算初始适应度 fitness evaluate_fitness(pop); % 含潮流计算与惩罚项 gbest pop(find(fitness min(fitness)), :); gbest_fitness min(fitness); for k 1:max_iter w w_max - (w_max - w_min) * k / max_iter; for i 1:pop_size % 速度与位置更新 vel(i,:) w*vel(i,:) ... c1*rand(1,dim).*(pbest(i,:) - pop(i,:)) ... c2*rand(1,dim).*(gbest - pop(i,:)); pop(i,:) pop(i,:) vel(i,:); % 变量边界截断 pop(i,:) min(max(pop(i,:), 0), 1); % 适应度评估 fit evaluate_fitness(pop(i,:)); % 更新个体最优与全局最优 if fit fitness(i) pbest(i,:) pop(i,:); fitness(i) fit; if fit gbest_fitness gbest pop(i,:); gbest_fitness fit; end end end record(k) gbest_fitness; end核心的适应度函数evaluate_fitness做的事很多先把归一化变量还原成功率值再依次验证各时段SOC更新、功率平衡然后调用潮流计算校验电压最后把各项目标成本求和加上惩罚项作为返回值。5.2 收敛过程与参数调优我第一次跑的时候用种群40、迭代100结果收敛曲线一直在高位震荡最优调度成本跟前一次跑的差异很大明显是没收敛或者陷入了局部最优。把种群增加到100、迭代增加到200之后情况才稳定下来。粒子群对高维问题的收敛速度会随维度上升明显变慢96维已经算中高维问题了种群和迭代数都不能省。另一个很重要的调参体会是随机种子的影响。我同一个参数设置跑了5次每次成本结果都略有不同最大差距有2%左右。这不是代码bug而是PSO的随机性本质。为了得到稳定的“可发布”结果我用固定的随机种子然后连续跑20次取最优值。如果追求更稳健的方案可以考虑多策略PSO或者混合遗传算法做全局寻优不过对于课题研究来说改进PSO的边际收益已经不大。5.3 调度结果深度解读收敛后的最优调度方案有几个明显特征。首先储能完美地执行了“谷充峰放”策略——23点到次日7点的谷时段以接近满功率充电10点-15点和18点-21点的高峰时段放电。储能在每个峰时段都能把SOC从高位放到接近下限套利空间利用得非常充分。其次柴油机只在晚高峰时段运行。因为柴油机燃料成本高平时让电网供电更划算只有在晚高峰电价高且负荷大时柴油机才启动顶上去。燃气轮机则作为基荷电源之一在风光出力不足的时段维持较稳定的出力。电压分布方面最恶劣的情况出现在晚高峰时段节点18末端节点电压降到0.943pu已经越限了。于是算法自动增加了柴油机出力和储能放电通过机端无功支持和减少馈线传输功率来抬升末端电压。这种“隐性”的电压支撑作用是纯经济调度不会出现的也是PSO嵌套潮流计算带来的红利——经济性和安全性被统一纳入了优化目标。6. 常见问题与排查技巧实录6.1 粒子群早熟收敛陷进局部最优遇到最多的坑是早熟收敛。现象很简单收敛曲线前期降得猛但到后期平得特别快调度结果里储能只在某几个固定时段动作逻辑上明显不对劲。排查思路是检查惯性权重是否过早衰减到低值导致粒子群失去探索能力。把w的下限从0.3提高到0.4效果不明显真正解决问题的是引入“惯性权重重启机制”——当30代没有改善时把w重置回0.8让粒子群重新扩大搜索范围。速度上限也是一个重要因素。v_max设置过小粒子只能在很小的邻域内移动根本飞不出局部最优设置过大则粒子可能直接“飞出”可行域。经验值是v_max取变量范围的10%-20%在归一化空间里就是0.1到0.2。6.2 储能SOC越界与“末段放空”问题SOC约束是罚函数处理的重灾区。迭代初期粒子乱飞SOC会大量越界惩罚项直接把适应度值撑到极大粒子群就很难回到可行域。解决方法是先用变量截断保证每一步SOC计算值保持在5%-95%之间再叠加温和的越界惩罚。相当于“先物理修正再经济罚款”双保险。“末段放空”是另一个隐蔽问题限制末段SOC等于初始SOC后总成本上升了一点但方案真正变得可落地了。我有一次忘了加这个约束得出的“最优方案”到最后时段SOC变成了3%储能把家底全掏空了用来省购电费这在实际运行中绝对不允许。加了这个约束后储能在每个时段都要考虑“为未来留电”调度策略明显更均衡。6.3 电压约束处理过紧导致潮流不收敛刚开始我把电压惩罚系数设得特别大希望严格保证0.95~1.05pu。结果就是粒子群几乎找不到可行解因为初始种群大部分粒子的电压都越限惩罚项把梯度信息全部淹没了算法根本没法迭代。后来我调整了策略先在放开电压惩罚的情况下跑通优化得到初步经济方案然后用电压校验去检查这个方案在哪些时段、哪些节点越限再有针对性地增加局部约束。这其实就是工程上常说的“先算后校”思路。对配电网电压问题真正有效的措施是把储能和机组出力的“电气位置”利用起来——靠近末端节点的储能即使在更低的出力水平对末端电压的支撑作用也远超远端的电源。粒子群在搜索时会自发找到这种位置效应但前提是潮流计算环节要正确反映电气距离。6.4 惩罚系数的量级整定经验罚函数法最让人头疼的就是惩罚系数设多少。太小了约束等于摆设太大了算法直接放弃那个区域。我自己的调法是从小到大扫一遍先设一个只比目标函数成本高一个数量级的值观察约束违反次数然后逐步放大。经验规律是约束违反项的量级应该比正常目标函数成本高10-50倍这样算法在初期可以“适度违反”以探索空间后期则会主动放弃违反约束的候选解。这里有一个实用判断技巧观察最终结果的约束最大偏差值。如果偏差在1e-4量级以下说明惩罚系数够用了如果还有明显偏差再继续加大惩罚。配合“先探索后收紧”的思想可以在迭代前中期用较小的惩罚系数到后期再放大效果比全程固定惩罚系数要好。7. 项目经验总结与扩展方向这个项目跑下来我最深的一点体会是优化算法只是最后一步前面80%的工作量都在建模和数据一致性上。IEEE33节点的参数换算、储能SOC离散化、潮流计算和PSO的耦合任何一个环节出错结果都会变得不可信。建议第一次做这个方向的朋友先把无储能场景跑通再逐个加入储能、柴油机、燃气轮机每加一类资源就重新校验一次结果合理性不要上来就堆全模型。粒子群算法这边当前的做法是把启停状态连续化处理这在柴油机和燃气轮机数量少的时候问题不大但如果扩展成多台机组组合问题建议换用二进制粒子群与连续粒子群混合的方式或者用差分进化、灰狼算法做对比验证。储能建模如果想把衰减做得更精细可以把温度、放电深度、循环次数都纳入容量衰减模型中但要注意别把模型复杂到PSO跑不动。这个项目后续还可以往两个方向扩展。一个是把确定性的日前调度升级为考虑风光不确定性的鲁棒优化或随机优化——可以用场景法采样多个可能的风光出力让调度方案在恶劣场景下也不越限。另一个是加入实时滚动修正用MPC的思路每15分钟重新优化一次把日前计划的“粗线条”和实时控制的“精细调整”结合起来。这两个方向在工程落地时都很受关注。最后分享一个实际的小技巧调试PSO时不要只看最终结果一定要画收敛曲线和逐时段的功率平衡堆叠图。收敛曲线一眼看出算法是否收敛功率平衡堆叠图一眼看出调度方案在物理上是否合理。两个图都正常了这个模型才算真正建好了。这个习惯帮我少走了很多弯路也推荐给所有正在折腾配电网优化调度的朋友。
返回列表