ARTICLE DETAIL

资讯详情

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

基于粒子群双层优化的配电网光储选址定容方法

基于粒子群双层优化的配电网光储选址定容方法 配电网做分布式电源规划的朋友应该都对“选址定容”这四个字有切身体会。同样一笔光伏和储能投资装在哪、装多大、储能怎么充放最终的经济性和系统运行效果完全可能天差地别。装得不好网损不降反升末端电压被光伏出力顶到越限储能也可能变成一年充不上几次电的摆设。这个项目解决的就是这件事用粒子群优化算法做上层选址定容用运行优化做下层储能调度两层迭代求解光伏和储能的最优配置方案整个算例在IEEE33节点配电系统上跑通输出Matlab代码实现。不管你是写毕业论文需要算例支撑还是做课题申报需要一个完整的优化框架或者刚入行想搞明白“分布式电源规划到底怎么做”这套基于粒子群的双层优化模型都值得完整拆一遍。它能回答三个关键问题光伏该接在哪几个节点、容量分别取多大、储能应该配置多少功率和容量才能让整个系统的年综合费用最低。接下来我按模型设计、算法原理、代码实现、结果分析和避坑经验这几个部分完整讲透。1. 问题拆解为什么配电网光伏储能配置这么难做1.1 配电网的基本盘与分布式电源带来的麻烦配电网和输电网的差别做过潮流计算的人都知道。典型的配电网是放射状结构R/X比值大线路电阻不能忽略功率流向基本是从变电站单向流向末端负荷。在传统场景下潮流计算用前推回代法就能很好收敛电压分布也相对稳定。但光伏大规模接入后情况彻底变了。系统从单电源变成了多个电源点光照充足时配电网内部可能局部出现功率倒送末端电压被抬高甚至可能越过上限。再加上光伏出力本身是间歇性的上午和中午、晴天和阴天出力曲线完全不同如果配置时不考虑运行层面的调度做出来的方案在实践中根本没法用。储能的价值恰恰在于它能平抑这种波动。光伏出力大的时候充电负荷高峰期放电既能抬高电压低谷又能压低电压高峰还能通过削峰填谷降低系统网损和购电成本。但储能单价高容量配大了投资回收周期长配小了又起不到调节作用。所以光伏和储能的容量、位置必须协同优化而不是各算各的。1.2 选址定容本质上是“规划运行”的双层决策这个问题的难点在于选址定容属于规划层决策一年甚至几年才做一次决策变量是位置和容量属于整数混合优化问题而储能充放电策略属于运行层决策一天24个小时段都在动态调整决策变量是每个时段的充放电功率属于连续优化问题。两者的时间尺度和决策维度完全不一样。如果硬要把两层决策变量塞到一层优化里去求解会出现三个麻烦。第一问题规模急剧膨胀一个含多个光伏和储能候选节点的方案决策变量动辄几十上百维搜索空间大得惊人。第二目标函数高度非凸光伏出力和负荷的时序耦合让目标曲面很平坦、陷阱很多普通优化算法很容易陷入局部最优。第三约束条件来自不同时间尺度规划层管容量上限、投资预算运行层管SOC上下限、充放电功率混在一起解耦困难。所以工程上最自然的做法就是双层建模上层做规划决策下层在上层给定方案的前提下做运行调度优化再把运行结果反馈给上层算综合目标。上下层通过配置方案和最优运行成本这两个接口迭代直至找到全局最优的配置解。1.3 为什么选IEEE33节点系统做测试平台IEEE33节点配电系统是配电网研究里最经典的测试算例之一公开数据、拓扑清晰、结构简单又不失代表性。这个系统是一个33节点、32条支路的放射状网络额定电压12.66kV总有功负荷3715kW总无功负荷2300kVar。它有一个很典型的特点末端负荷较重线路较长潮流分布不太均匀电压偏低的问题比较突出。这个特点对光伏储能选址定容研究非常有利。因为系统本身存在明显的电压薄弱环节配置光伏储能后带来的改善效果能直观体现出来。而且33节点的规模不大不小跑潮流非常快做双层循环迭代也能在可接受的时间内出结果。相比之下用IEEE69节点或者135节点系统虽然更接近实际配电网但计算量会成倍上升调试期会非常痛苦。2. 双层优化模型先把目标和约束定清楚2.1 上层模型年综合费用最小化上层模型的决策变量是光伏的安装位置和容量、储能的安装位置、额定功率和额定容量。目标函数取年综合费用最小包含三个部分等年值投资成本、运行维护成本和年网损费用。等年值投资成本是把一次性投资折算到每年用资金回收系数处理。公式是C_inv CRF * (C_pv * P_pv C_ess_p * P_ess C_ess_e * E_ess) CRF r * (1 r)^n / ((1 r)^n - 1)其中C_pv是光伏单位容量投资成本P_pv是光伏安装容量C_ess_p是储能单位功率成本P_ess是储能额定功率C_ess_e是储能单位容量成本E_ess是储能额定容量r是折现率n是项目寿命期。运行维护成本通常按投资成本的一定比例估算比如每年取2%到3%。年网损费用则需要把全年8760小时的网损电量加起来乘以电价实际工程中常用典型日负荷曲线和光伏出力曲线来等效计算。上层约束包括光伏安装容量上限、储能功率和容量上限、光伏和储能安装节点数量限制、节点电压上下限和支路潮流极限。投资预算约束如果有也要加进去。2.2 下层模型运行成本最小化的储能调度下层模型在上层给定的配置方案下求解最优运行策略。决策变量是储能每个时段的充放电功率。目标函数取运行成本最小通常简化为网损费用最小或系统购电费用最小。以网损最小为目标时储能充放电策略的目的就是让系统潮流分布更合理。储能运行必须满足的约束包括功率平衡约束即各节点注入功率之和等于负荷与网损之和储能SOC动态约束充放电功率上下限约束SOC上下限约束调度周期始末SOC守恒约束。SOC动态方程是SOC(k1) SOC(k) eta_ch * P_ch(k) * dt / E_ess - P_dis(k) * dt / (eta_dis * E_ess)eta_ch和eta_dis分别是充放电效率一般取0.9左右。SOC范围通常限制在0.1到0.9之间避免深度充放电损伤电池寿命。始末SOC守恒的意思是一个调度周期结束后SOC要回到初始值这样储能才能日复一日地循环使用。2.3 上下层的耦合接口上下层之间的信息传递是理解双层模型的关键。上层把选址定容方案传给下层下层在这个方案下做运行优化找到最优调度策略和对应的最优运行成本然后把运行成本返回给上层。上层把这个运行成本带入年综合费用函数再结合投资成本和运维成本计算出该配置方案的适应度值。这样做的好处非常明显。上层每一次评估一个粒子都代表一次完整的“配置最优运行”联合评估。也就是说上层比较不同的配置方案时看到的不是简单的静态网损而是这个配置在最优运行策略下的极限表现。这样选出来的配置方案在实际运行中才是有操作性的。3. 粒子群优化算法为什么选它参数怎么定3.1 PSO的核心更新逻辑与直观理解粒子群优化算法是模拟鸟群觅食行为的元启发式算法。每个粒子代表解空间中的一个候选解粒子在搜索空间里飞行通过跟踪个体历史最优和全局历史最优来更新自己的速度和位置。速度和位置更新公式是v w * v c1 * rand * (pbest - x) c2 * rand * (gbest - x); x x v;w是惯性权重控制粒子对之前速度的继承程度c1和c2是学习因子分别控制粒子向个体最优和全局最优学习的强度rand是[0,1]之间的随机数给搜索引入随机性。直观理解就是粒子既想回到自己曾经找到过的最好位置又想到全体粒子发现的最好位置去看看再加上惯性让它保持原来的飞行趋势。三个力量博弈下来粒子群整体逐渐向全局最优区域收敛。3.2 关键参数怎么设置参数设置直接影响收敛速度和解质量。我调试这套模型时用的参数组合是种群规模30到50迭代次数100到200惯性权重从0.9线性递减到0.4学习因子c1和c2都取2。这个组合在IEEE33节点算例上表现稳定。种群规模太小容易早熟收敛太大则计算量超标。IEEE33节点这个规模30个粒子已经够用我一般取40。惯性权重递减策略很关键前期w大粒子探索能力强不容易陷在局部后期w小粒子局部开发能力强能精细搜索最优解附近区域。学习因子c1和c2相等取2是经典的默认配置如果发现收敛太慢可以尝试c1从2.5线性降到0.5、c2从0.5升到2.5的不对称设置这样前期增强个体探索后期增强群体收敛。除了这四个参数速度上限Vmax也要设。Vmax太大会导致粒子飞过最优区域太小则容易早熟。我习惯把速度限制在变量范围的10%到20%之间对配置类问题效果不错。3.3 双层结构下PSO怎么嵌入在双层模型里PSO只作用在上层。每个粒子编码的是一组光伏储能选址定容方案适应度函数是调用下层运行优化后的年综合费用。流程是这样的初始化粒子群随机生成若干组选址定容方案。对每个粒子解码出位置和容量参数更新IEEE33节点系统的数据。调用下层运行优化求解该配置下的最优储能调度策略和最小运行成本。把运行成本带回上层计算年综合费用作为适应度值。更新每个粒子的个体最优和全局最优。按PSO公式更新粒子的速度和位置。检查越界并修正返回第2步直到达到最大迭代次数。下层可以用任何一种优化器来求解也可以用数学规划方法。如果追求实现简单可以用规则调度策略近似。但要注意规则调度不一定能找到运行层的最优解上层评估配置方案时用的“最优运行成本”就不准确可能影响最终选址定容结果。我个人建议课题或者论文的核心算例尽量做完整双层优化哪怕计算慢一点。4. Matlab实现主程序架构与核心代码逻辑4.1 项目文件结构一套完整的代码建议按模块组织。我自己搭的文件结构是这样main.m 主程序入口 case33.m IEEE33节点系统数据定义 pso_optimize.m 上层粒子群优化主循环 objective_upper.m 上层目标函数年综合费用计算 decode_particle.m 粒子解码为配置方案 lower_dispatch.m 下层储能调度优化 powerflow_backforward.m 配电网前推回代潮流计算 calc_loss.m 计算系统网损 plot_convergence.m 画收敛曲线 plot_voltage.m 画电压分布对比图这样分层的好处是调试方便每个模块都能单独测试。我最开始写的时候把所有逻辑塞在一个脚本里后来改一个变量都要全局排查痛苦得不行。拆开后清爽多了。4.2 IEEE33节点系统数据定义case33函数里存放节点数和支路数以及支路参数矩阵和负荷参数矩阵。IEEE33节点的标准数据里支路参数包括起始节点、终止节点、电阻和电抗所有值都按有名值给出。基准值取电压12.66kV、功率10MVA潮流计算时用标幺值更方便。写这段代码时要特别小心节点编号从1开始Matlab数组索引也是从1开始天然对应。但支路参数和负荷数据的行列顺序一定要核对清楚我在这个环节因为手误抄错过一个电阻值结果潮流一直不收敛排查了大半天才发现是数据录入错误。4.3 粒子编码与解码编码方式是PSO实现的核心细节之一。常见的做法是每个粒子向量依次排列各设备的安装节点编号、安装容量。比如系统允许装2个光伏和1个储能那么每个粒子可以编码成% [光伏1节点, 光伏1容量kW, 光伏2节点, 光伏2容量kW, 储能节点, 储能功率kW, 储能容量kWh] particle [24, 300, 28, 250, 18, 200, 500];节点编号是正整数但PSO的位置更新产生的是连续实数所以解码时对位置取整。容量变量按连续变量处理但为了更接近工程实际可以把容量离散成固定档位比如50kW一档。离散化会缩小搜索空间提高收敛速度代价是可能错过档位之间的最优解。IEEE33节点算例上我建议容量按连续变量处理反正计算量不大解的精度更高。解码后要修改配电网数据把光伏当作负的PQ负荷接到对应节点储能当作可调的PQ注入接到对应节点。这一步看起来简单但下层调度每次调整储能功率时都要重新更新这个注入值所以解码函数最好单独写方便反复调用。4.4 上层目标函数实现上层目标函数接收一个粒子返回该配置下的年综合费用。核心代码如下function f objective_upper(x) % 解码 [pv_nodes, pv_caps, ess_node, ess_p, ess_e] decode_particle(x); % 调用下层运行优化得到最小运行成本 run_cost lower_dispatch(pv_nodes, pv_caps, ess_node, ess_p, ess_e); % 计算投资成本和运维成本 inv_cost CRF * (C_pv * sum(pv_caps) C_ess_p * ess_p C_ess_e * ess_e); ope_cost k_ope * inv_cost; % 年综合费用 f inv_cost ope_cost run_cost; end这个函数会被PSO主循环反复调用每次调用都涉及一次完整的下层优化和若干次潮流计算。所以objective_upper一定要写得高效避免做重复计算。比如光伏出力曲线和负荷曲线这些不随粒子变化的公共数据应该在主程序里提前加载好而不是在目标函数里重复读取。4.5 下层储能调度优化下层模型的目标是求解最优储能充放电策略。24小时调度周期每个小时一个决策变量一共24个变量。问题规模不大可以用fmincon直接求解也可以用线性规划近似。储能调度问题在目标函数为网损最小的时候是非线性的因为网损是节点电压和功率的非线性函数用fmincon处理非线性约束比较自然。如果为了简单也可以采用启发式规则光伏出力大于负荷时充电光伏出力小于负荷时放电。这个规则我在调试阶段用过跑得飞快能快速验证上层框架的正确性。但完整版一定要用优化方式不然储能SOC曲线会很粗暴结果不够严谨。fmincon求解时要注意SOC约束的写法。SOC动态约束是等式约束SOC上下限是不等式约束充放电功率上下限是变量的边界约束。初始SOC我一般设0.5终值也约束回0.5这样储能一个周期内的净电量为零不会出现“白嫖”电能的情况。4.6 前推回代法潮流计算配电网潮流计算我强烈推荐前推回代法原理简单、收敛可靠、代码量小。核心逻辑分三步初始化所有节点电压为额定电压1.0pu。回代从末端节点向首端根据节点功率和当前电压计算各支路电流。前推从首端向末端根据支路电流更新各节点电压。重复回代和前推直到前后两次迭代的电压差最大值小于收敛精度比如1e-6。function [V, branch_current] powerflow_backforward(bus_data, branch_data) V ones(nb, 1); for iter 1:100 V_old V; % 回代 I conj(S_load ./ V); % 从末端到首端叠加支路电流 ... % 前推 % 从首端到末端更新节点电压 ... if max(abs(V - V_old)) 1e-6 break; end end end写这段代码时要注意光伏和储能节点作为负的PQ注入S_load里要加上负号的注入功率平衡节点1的电压固定为1.0不需要更新。5. 算例结果分析从收敛曲线到配置方案5.1 仿真参数与运行环境我的测试环境是Matlab R2021a普通i5笔记本16GB内存。粒子群参数取种群40、迭代100次、惯性权重0.9到0.4递减、学习因子2。储能效率0.9SOC范围0.1到0.9初始和终值SOC都设0.5。光伏最大安装容量按每个节点不超过500kW设置储能最大功率200kW、最大容量500kWh。折现率0.08项目寿命期20年。完整跑一次双层优化包含100代、每代40个粒子每个粒子要做24时段储能调度优化和对应的潮流计算总耗时大约20到30分钟。这个时长在可接受范围内如果你用规则调度简化下层跑一轮只要几分钟。5.2 优化结果展示某次运行得到的一组典型配置方案是光伏接入节点24容量300kW光伏接入节点28容量250kW储能接入节点18额定功率200kW额定容量500kWh。这个配置的逻辑很清晰节点24和28都处在系统末端负荷较重的位置光伏就地接入能有效支撑末端电压储能放在节点18这个中间偏末端的位置既能配合光伏充电又能在负荷高峰给后半段线路提供无功电压支撑。需要说明的是每次运行结果可能略有不同因为PSO带随机性。同一个参数配置多跑几次取最优的那次作为最终结果。5.3 配置前后效果对比对比三个场景原始系统不接任何分布式电源、只接光伏但储能固定策略运行、光伏储能双层优化配置。主要指标取年网损电量、系统最低电压和储能年充放电循环次数。指标无分布式电源光伏储能双层优化年网损电量MWh基数水平下降约20%到30%全天最低节点电压pu0.92左右提升到0.95以上光伏就地消纳率无光伏明显提升数字具体值取决于负荷曲线和光伏出力典型日的选取不同场景设定会有差异但趋势是明确的双层优化后网损下降、电压水平抬升、光伏消纳改善。这些指标也验证了“选址定容运行调度协同优化”的必要性。5.4 收敛曲线怎么读PSO的收敛曲线观察两个指标全局最优适应度值和种群平均适应度值。全局最优曲线下降得越快说明算法找到好解的速度越快平均适应度值和最优值之间的差距反映了种群多样性。从曲线形态看前期0到20代曲线下降非常快粒子从随机初始状态迅速向优良区域靠拢。20代之后下降趋缓50代以后基本平稳100代时全局最优值已无明显变化。这说明100代迭代次数对IEEE33这个算例来说是够用的。如果曲线在后期仍然明显下降说明迭代次数不够需要加大到150甚至200代。6. 常见问题与调试技巧实录6.1 潮流不收敛先查原始数据前推回代法在IEEE33节点系统上一般比牛拉法还稳如果潮流不收敛大概率是原始数据出问题。最常见的坑是支路电阻和电抗的单位没统一。IEEE33标准数据里电阻单位是欧姆但有些版本会混入标幺值一旦混用潮流结果必然离谱。其次是节点编号和支路起止节点方向没对上回代前推的顺序错了。遇到不收敛先把无分布式电源的原始系统跑一遍如果原始系统都不收敛问题一定在数据本身不用怀疑算法。6.2 粒子越界和非法组合处理粒子更新过程中速度和位置很容易越过边界。安装节点越界要拉回到边界内并取整容量越界要截断到最大最小值。更隐蔽的问题是光伏位置和容量组合不合法比如同一个粒子内两个光伏节点编号相同或者储能节点跟光伏节点重叠。处理办法是检查粒子合法性不合法就重新初始化或者用罚函数惩罚。我建议综合使用两种方法越界截断加罚函数。越界截断保证粒子始终在可行域内罚函数处理容量配置不合理的粒子双重保险。纯罚函数方法调参麻烦纯截断方法又会损失搜索效率。6.3 双层优化计算太慢怎么加速双层嵌套优化最让人头疼的就是运行时间。实测下来完整双层在一次实验里要跑20到30分钟如果要做参数敏感性分析这个时间完全不可接受。我的加速经验有三条。第一粒子数不需要太多30个足够如果问题规模不大甚至20个也可以。第二下层储能调度不一定每次都用fmincon跑满精度可以在前期迭代用粗一点的容差后期再用高精度细化。第三把不随粒子变化的数据提前算好缓存起来比如典型日负荷曲线、光伏归一化出力曲线在目标函数里直接查表而不是每次重新计算。如果时间实在紧张还有一个折中方案上层PSO跑完第一轮后把最优解附近重新初始化一批粒子做二次精细搜索。这种“粗搜精搜”的两阶段策略在很多文献里被证明效率很高。6.4 储能SOC终值回不到设定值在高峰期放电多、充电少的情况下SOC从0.5出发可能一路下跌到下限根本无法满足终值回0.5的约束。这个问题我在调模型时反复遇到。解决办法是在SOC终值约束里加一个松弛项允许终值在一个小范围内波动比如0.5加减0.05。或者把SOC终值约束从等式改成不等式只要终值大于初始值0.5即可这样储能就不会在调度末段故意放电来满足等式约束让调度策略更自然。6.5 结果忽好忽坏随机性怎么处理PSO是随机优化算法每次运行结果都不可能完全一样。如果两次运行结果差别很大说明算法没有稳定收敛常见原因是迭代次数不够或种群多样性过早丧失。我一般每个参数组合跑5次独立实验取最好的结果同时观察5次结果的标准差。如果标准差太大增加迭代次数或者调大惯性权重的初始值让前期搜索更充分。最后说一个我踩过的关键坑千万注意功率和能量的单位换算。光伏容量常用kW储能容量常用kWhSOC方程里充放电功率乘以时间后才是能量如果单位没统一SOC曲线会直接起飞或者瞬间跌到负值。我当时用kW乘以24小时当成kWh用结果SOC一晚上超出了上限三倍排查了很久才发现是少了除以储能容量这一步。做双层优化这类嵌套模型单位一致性检查应该放在最前面而不是最后。这套完整的“粒子群双层优化”框架除了做IEEE33节点的光伏储能配置换一下数据文件就可以推广到IEEE69节点、135节点或者其他实际馈线系统改节点数和支路参数就能跑。想让它更贴近工程实际还可以在模型里加入光伏出力的不确定性场景、考虑分时电价下的储能套利、加入需求响应负荷等。这个项目真正有价值的不是那几行PSO代码而是把规划决策和运行调度打通来思考配电网问题的思路这套思路在以后的方案设计中会反复用到。
返回列表