资讯详情

资讯详情

配电网光伏储能双层优化配置模型及粒子群算法实现

做了挺久的配电网优化项目今天把这个“粒子群优化算法的配电网光伏储能双层优化配置模型”完整拆开讲一遍。这是个很典型的选址定容问题测试系统用的IEEE33节点工具是Matlab核心算法是粒子群。文章里我会把模型怎么建、代码怎么写、实际调试会踩哪些坑全部过一遍。先给不了解背景的朋友说一下这个项目在干什么配电网里要接入光伏和储能但光伏装在哪、装多大储能又该放哪、容量多少以及投运之后储能每天怎么充放电这其实是一个互相耦合的两层决策问题。传统做法要么只做规划层忽略运行层要么只做运行调度不考虑投资成本结果都不够准。这里用双层优化把“选址定容”和“运行调度”拆开上层用粒子群算法寻优下层做24小时运行优化整体在IEEE33节点系统上验证Matlab代码可以完整复现。1. 为什么配电网光伏储能必须用双层优化1.1 “双高”背景下选址定容问题的本质配电网接入高比例分布式光伏之后最直接的问题就是电压越限和反向潮流。光伏出力集中在中午而负荷高峰通常在晚上这种时间上的错配导致如果不加储能光伏渗透率稍微上去一点末端节点电压就可能超过上限。储能的作用就是削峰填谷中午光伏大发时充电晚上负荷高峰时放电。但储能和光伏的成本都很高不能随便乱装。光伏装在哪里、装多大的容量储能放哪个节点、容量和额定功率怎么搭配直接决定了项目的经济性和电网运行的安全水平。这就是选址定容问题本质上是一个带约束的非线性组合优化问题位置是离散变量容量是连续变量目标函数要考虑投资成本、运维成本、网损费用和购电费用还要满足电压、电流、功率平衡等一堆约束。这类问题用解析法基本没戏因为决策变量混合了整数和连续量目标函数也没有凸性可言。启发式算法是主流选择粒子群、遗传算法、灰狼优化都有人用。粒子群实现简单、参数少、收敛快在这个问题上性价比很高。1.2 单层优化为什么会失真很多初学的人会问我直接把所有变量放一起用粒子群一次搜出来不就行了位置、容量、储能24小时充放电功率全部作为决策变量理论上是可以的但实际跑起来问题很大。首先是变量维度爆炸。假设储能要优化24小时的充放电功率那一个粒子就要包含2个位置变量、2个容量变量、24个储能功率变量总共28维。粒子群在高维空间中搜索效率下降很快而且充放电功率之间有时间耦合荷电状态逐时递推很难保证每个粒子都满足储能SOC约束罚函数会变得很重算法基本就在乱搜。其次是目标函数的尺度差异。投资成本一算就是几百万运行费用每天几百块如果放一个目标函数里运行层的信息会被淹没粒子群很难感知到运行调度的优劣最终选出来的方案经济性会很差。所以单层优化不是不能做而是做出来的结果对工程指导意义不大。1.3 双层模型如何分工协作双层优化的思路是把决策拆成层次结构上层做规划下层做运行下层在给定上层方案的基础上求解再把运行结果反馈给上层作为目标函数的组成部分。对应到这个项目里上层决定光伏安装节点和容量、储能安装节点和容量。目标函数是年综合费用最小包括等年值投资成本、运维费用、年网损费用和向上级电网购电的费用。下层给定一套选址定容方案后做典型日通常是24小时的运行优化决定储能每个时刻充放电多少。目标函数可以设为当日运行成本最小包括购电费用和网损费用。下层的运行结果算成费用后回到上层参与目标函数评价。这样粒子群搜索每个方案时用的都是经过运行优化后的经济指标比单纯按“容量越大越好”或者“电压改善越多越好”更接近实际。2. IEEE33节点系统建模与潮流计算2.1 测试系统的参数和特点IEEE33节点系统是配电网优化研究最常用的辐射状测试系统最早来自IEEE的配电系统测试基准。系统基准电压12.66kV基准容量常取10MVA首端节点1接在上级变电站相当于平衡节点其余32个节点都是PQ节点。系统总负荷约3715kW加2300kvar支路总共32条呈辐射状结构。这个系统的特点是负荷分布在主干线路和几条分支上末端节点离电源点比较远网损相对较高非常适合用来做分布式电源接入的仿真实验。光伏和储能接入位置的选择空间大不同位置对网损和电压的影响差异明显能很好地检验优化算法的寻优能力。需要说明的是IEEE33的标准数据里没有包含分布式电源接入光伏和储能时需要自己设置候选节点。一般做法是排除首端平衡节点剩余32个节点都可以作为候选或者根据工程经验限定在负荷较重、电压偏低的末端区域这样可以缩小搜索空间、加快收敛。2.2 前推回代法潮流计算的实现逻辑配电网潮流计算和输电网不一样线路电阻和电抗比值偏大传统PQ分解法在配电网里收敛性不好。辐射状配电网最主流的方法是前推回代法思路非常直观已知首端电压和所有节点负荷从末端往首端推支路功率前推再从首端往末端推节点电压回代两个过程交替进行迭代到电压变化小于阈值为止。固定节点编号的IEEE33系统尤其适合用矩阵化方式实现。把支路首末端节点编号存入数组支路阻抗做成向量负荷功率做成数组前推回代的核心循环就那么几行Matlab代码。实际编码时要注意单位和基准值统一全部折算成标幺值计算避免数值溢出。每次潮流计算完成后可以顺便算出全网的网损功率和各节点电压偏移。网损功率用于计算损耗费用电压偏移可以用于判断约束是否越限。2.3 光伏与储能的数学建模光伏的出力模型这里取的是典型日出力曲线本质上是把一天24小时的光伏最大出力功率给出来。如果是夏天晴天曲线大致是早6点到晚18点之间有出力中午12点到14点达到峰值峰值大小由装机容量决定。实际运行时光伏出力可以在0到最大值之间调节意味着“弃光”是允许的这在下层优化里是个重要决策变量。储能模型核心是荷电状态递推方程SOC(t1) SOC(t) (P_char(t) * eta_char - P_dis(t) / eta_dis) * dt / E_bess其中P_char和P_dis分别是充电和放电功率eta_char和eta_dis是充放电效率E_bess是储能容量。约束条件包括充放电功率上下限、SOC上下限、充放电不能同时进行。初始SOC一般取0.5日末SOC可以约束回到初始值附近保证储能第二天能继续调度。储能额定功率P_bess和容量E_bess成比例关系通常取0.2C到0.5C倍率比如500kWh的储能配100kW到250kW的功率变流器。我在代码里把储能额定功率设为容量乘以某个倍率系数这样下层优化不用额外再优化功率变量。3. 双层优化模型怎么设计才合理3.1 上层规划层的目标函数与约束上层目标函数是年综合费用最小包含四个部分C_total C_inv_pv C_inv_bess C_om C_year_loss C_year_buyC_inv_pv光伏等年值投资成本。单位造价乘以安装容量再乘以资金回收系数CRF。CRF r(1r)^n / ((1r)^n - 1)r是折现率n是设备寿命光伏取20年储能取10年。C_inv_bess储能等年值投资成本。储能单位造价按容量kWh计同样乘CRF寿命按10年算。C_om年运维费用。光伏和储能的运维成本按装机容量比例估算一般取初始投资的一定百分比。C_year_loss年网损费用。把典型日网损电量乘以365天或按季节加权再乘以购电电价。C_year_buy年购电费用。把典型日从上级电网买入的电量乘以365天再乘以分时电价对应的电价。约束条件包括光伏安装容量不超过渗透率上限例如不超过总负荷的50%保证不倒送严重储能容量在一定范围内安装节点不能重复所有节点的电压幅值保持在0.95到1.05标幺值之间支路电流不越限。3.2 下层运行层的优化模型下层的任务是在给定光伏容量、储能位置和容量之后算出典型日的最优运行策略。决策变量是储能24小时的充放电功率和光伏各时刻的实际出力。目标函数是当日运行费用最小主要是购电费用和网损费用分时电价的峰谷差是储能套利的主要来源。下层约束比上层多一个时间维度的动态约束储能SOC的递推方程就是核心。充电和放电功率要分别限制在0到额定功率之间SOC限制在0.1到0.9之间。光伏实际出力要在0和预测最大值之间。下层求解我用了两种方式一种是直接调用Matlab的fmincon内点法对于单个典型日的运行优化问题内点法效率高且稳定另一种是继续用粒子群做内层寻优。实测下来fmincon在这个规模的问题上比粒子群快很多所以完整代码里内层用的是fmincon外层粒子群只负责选址定容。如果你想把两层都用粒子群结构上也没问题就是计算时间会成倍增加。3.3 上下层联动与费用折算的细节上下层联动的要点在于上层每评估一个粒子都要调用一次下层优化下层返回的最优运行费用作为该粒子的运行成本项。这个嵌套结构在Matlab里就是两层for循环外层遍历粒子内层执行优化。费用折算里最容易出错的是时间尺度的统一。上层投资成本是“年均”的下层算出来的是“典型日”的运行费用要乘上365或加权天数才能组装成年综合费用。同时储能的全寿命周期和光伏不同CRF分别计算不能混用一个折现系数。我第一次实现时就把储能用光伏的CRF算了结果储能投资被严重低估寻优出来的储能容量偏大后来改成独立计算才正常。另一个细节是下层优化得到的最小运行费用是在该选址定容方案下的理想值。粒子的适应度越高说明这个方案越好。如果某个方案导致潮流不收敛或电压越限要给它一个很大的罚函数值让粒子群自动避开这类区域。4. 粒子群算法在双层模型中的完整实现4.1 PSO核心机制与参数选择粒子群算法的思想是模拟鸟群觅食。每个粒子代表搜索空间中的一个候选解有位置和速度两个属性位置就是决策变量的取值速度决定位置更新的方向和步长。每次迭代中粒子根据自身历史最优位置个体极值pbest和群体全局最优位置全局极值gbest来更新速度再更新位置。速度更新公式v(i1) w * v(i) c1 * r1 * (pbest - x(i)) c2 * r2 * (gbest - x(i))位置更新x(i1) x(i) v(i1)参数方面我实测下来对配电网选址定容问题比较稳定的配置是种群规模40迭代次数100惯性权重w从0.9线性递减到0.4学习因子c1和c2都取1.5。惯性权重线性递减是个非常关键的操作前期w大保证全局搜索能力后期w小加速收敛。粒子编码时要混合整数和连续变量。光伏安装节点、储能安装节点是1到33之间的整数光伏容量、储能容量是连续变量。处理整数变量有一个常见的做法粒子更新后对位置取整或四舍五入但要注意取整后可能超出节点编号范围要做边界修正。4.2 Matlab代码框架与核心函数代码整体分为几个模块主程序、参数初始化、粒子群主体循环、适应度函数、潮流计算、下层运行优化。下面是主循环的核心逻辑伪代码% 初始化粒子群 for i 1:N_pop x(i,:) initialization(); v(i,:) zeros(1, dim); fitness(i) calculate_fitness(x(i,:), systemData, price); pbest(i,:) x(i,:); pbest_fitness(i) fitness(i); end [gbest_fitness, idx] min(pbest_fitness); gbest pbest(idx,:); for iter 1:maxIter w 0.9 - 0.5 * (iter / maxIter); for i 1:N_pop v(i,:) w * v(i,:) c1*rand(1,dim).*(pbest(i,:)-x(i,:)) ... c2*rand(1,dim).*(gbest - x(i,:)); x(i,:) x(i,:) v(i,:); x(i,:) boundary_check(x(i,:)); x(i, pvIndex) round(x(i, pvIndex)); % 位置取整 x(i, bessIndex) round(x(i, bessIndex)); fitness(i) calculate_fitness(x(i,:), systemData, price); if fitness(i) pbest_fitness(i) pbest(i,:) x(i,:); pbest_fitness(i) fitness(i); end end [best_fitness_current, idx] min(pbest_fitness); if best_fitness_current gbest_fitness gbest_fitness best_fitness_current; gbest pbest(idx,:); end record(iter) gbest_fitness; end适应度函数是整个嵌套优化的核心内部依次完成解析粒子位置和容量把光伏和储能接入配电网对典型日24个时刻做潮流计算并运行下层优化最后把投资、运维、网损、购电费用汇总成适应度值。迭代完以后输出最优解和收敛曲线。潮流计算模块基于前推回代法。为了支持分布式电源节点注入功率要叠加光伏出力作为负的负荷和储能充放电功率充电是增加负荷放电是减少负荷。每个时刻都要重新生成节点注入功率向量再调用潮流函数。4.3 收敛性调试与典型结果这个模型跑起来之后典型结果是光伏倾向于安装在负荷较大的中后段节点储能也分布在末端电压薄弱区域附近。网损相比无分布式电源的初始状态明显下降电压最低点的数值从0.9标幺值左右提升到0.95以上。收敛曲线一般是前30代快速下降后面逐渐平缓。如果曲线在很早期就出现平台且很久不动说明粒子群早熟了。调整方向有两个一是增大初始惯性权重二是把粒子数加大到60左右。如果收敛曲线波动剧烈、忽高忽低通常是罚函数权重太小粒子在搜索越限区域时没有感受到足够惩罚适当加大罚函数系数即可。内层使用fmincon时要注意每个粒子都要调用一次fmincon每调用一次就要进行24次潮流计算。整体计算量不低但IEEE33系统规模小前推回代单次计算只需要毫秒级整套下来几分钟内能出结果。5. 避坑指南实测最容易翻车的几个点5.1 潮流不收敛与数值量纲问题前推回代法在IEEE33上本身很稳定不收敛通常是自己代码的问题。最常见的原因是负荷单位不统一比如把kW直接当成标幺值算导致注入功率巨大迭代发散。我在写代码时统一约定所有功率用标幺值基准功率10MVA基准电压12.66kV负荷数据里3715kW转成0.3715标幺值。支路阻抗也换算成标幺值。调用潮流函数时传入的是标幺值数组输出也是标幺值。另一个容易忽略的问题是接入光伏和储能之后某些节点可能出现注入功率为负即净出力大于负荷这在配电网潮流里是允许的但前推回代时要注意支路功率方向可能翻转算法本身能处理不需要特殊干预。如果遇到潮流发散我的排查顺序是先跑不含分布式电源的原始33节点验证潮流正确性再单独接一个光伏校验单点接入最后才整套模型联调。逐层排查定位问题比直接查整套代码快很多。5.2 粒子群早熟和离散变量处理粒子群在配电网选址问题里最大的坑是早熟尤其是整数变量安装节点编号处理不当的时候。如果直接把节点编号当成连续量粒子经常会在两个整数之间震荡导致位置在不断变化但是适应度始终上不去。解决办法是粒子更新后强制取整同时对取整后的越界值进行修正。另外同一个节点不能同时装光伏和储能这个约束要在初始化时强制避免否则粒子搜索空间里存在大量不可行解白白消耗迭代次数。还有一种工程化改进是限制候选节点集合比如只允许末端15个节点作为安装位置而不是所有32个节点可选。搜索空间小了收敛速度和结果稳定性都会明显改善。5.3 双层嵌套计算量大怎么优化做双层嵌套优化最大的现实障碍是计算时间。外层粒子数40迭代100次就要评估4000个方案每个方案内部做24小时运行优化。粗算下来就是4000次fmincon调用再乘上每次调用里的潮流迭代次数普通笔记本可能要跑几个小时。我的实测优化组合是外层粒子数降到30迭代次数80下层fmincon的容差放宽到1e-4潮流收敛阈值设置为1e-6。这样精度损失很小时间能压缩到原来的三分之一左右。此外还可以用Matlab的parfor对粒子循环做并行加速多核机器上效果明显。还有一个容易被忽视的点下层运行优化的可重复调用。fmincon每次从默认初始点开始是没有问题的但如果给定一个合理的初始SOC轨迹比如让储能先充电后放电fmincon收敛速度会更快而且更容易避开局部最优。最后分享一点实际体会这个项目做完最大的感受是光有算法远远不够问题建模的合理性才是决定结果是否可用的关键。粒子群说到底只是个通用寻优器把约束写清楚、把目标函数算准算法才能给你一个站得住的方案。另外建议所有刚入坑的朋友不要一上来就追求复杂的模型和花哨的改进策略先把IEEE33光伏储能这套基线跑通拿到一组合理的选址定容结果再逐步加约束、加场景这样出了问题也好定位。代码实现上我会优先保证结构清晰而不是极致优化每个模块单独函数实现注释写明白输入输出。模型本身后续可以扩展的地方还挺多的比如多典型日场景、考虑负荷和光伏的不确定性、加入需求响应等底子打好了往上加东西都是水到渠成的事。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →