这两年分布式光伏装机的速度有多快,干配电网的人应该都有体感——台区光伏渗透率从3%涨到30%可能只需要一年半载。光伏一多,问题就跟着来:电压越限、线路重载、网损不降反升、逆变器频繁脱网。这些现象背后有一个共同的源头性指标:分布式光伏接入配电网的“位置”和“容量”到底怎么选。
很多项目里,“光伏配网优化配置”这个问题听起来简单,实际做起来坑不少。手动试算根本算不完整,穷举几十上百个候选节点也容易把自己绕晕。这时候,智能优化算法就派上用场了,而在工程和学术圈里被用得最多的,就是粒子群算法(Particle Swarm Optimization, PSO)。
这篇文章我打算把整个“光伏遇上粒子群”的实战过程完整拆一遍:从算法原理、配电网建模、目标函数搭建,到基于MATLAB的代码实现、常见问题排查,全都聊透。无论你是电气工程专业的学生、做电网规划设计的工程师,还是准备数学建模竞赛的参赛者,这套完整链路应该都能帮你少走不少弯路。
1. 粒子群算法核心机制:为什么它适合做配电网优化
1.1 从鸟群觅食到寻优计算:PSO的底层逻辑
粒子群算法的灵感来自鸟群觅食行为。设想一群鸟在一片区域里找食物,每只鸟都不知道食物在哪,但它们能感知自己当前距离食物有多远。最有效的策略是什么?是每只鸟一边记住自己飞到过的最好位置,一边参考群体里目前最接近食物的那只鸟的位置,然后综合这两个信息调整自己的飞行方向和速度。
把这套逻辑搬到数学里,每一个“鸟”就是一个粒子,对应优化问题里的一组候选解。粒子在解空间里有个位置向量 x,还有个速度向量 v。每一轮迭代,粒子按照两个“吸引力”来更新自己的速度:一个是自身历史最优位置 pbest,另一个是全局历史最优位置 gbest。更新完速度,再根据速度更新位置,如此反复,直到收敛到足够好的解。
这里面的核心公式是:
- 速度更新:v = wv + c1r1*(pbest - x) + c2r2(gbest - x)
- 位置更新:x = x + v
其中 w 是惯性权重,控制粒子保持原速度的程度;c1 和 c2 是学习因子,分别控制向个体最优和全局最优学习的强度;r1 和 r2 是[0,1]之间的随机数,用来增加搜索的随机性。
这套机制的优势其实特别朴素:它不像梯度下降那样需要目标函数可导,也不像穷举法那样要遍历全部组合。配电网优化配置的目标函数往往是网损、电压偏差这些跟潮流计算耦合在一起的非线性表达式,根本没法写出显式的梯度,粒子群这种“无梯度启发式搜索”反而是最自然的选择。
1.2 参数整定经验:惯性权重、学习因子与种群规模
PSO虽然上手容易,但参数调得好不好,收敛速度和结果质量能差一个数量级。我自己的实操经验是这么几个要点:
惯性权重w是这家伙里面最敏感的一个参数。 w大,粒子飞行速度快,全局探索能力强,不容易掉进局部最优;w小,局部精细搜索能力强,但容易过早收敛。常见的做法是让w从0.9线性降到0.4,对应迭代前期多探索、后期多开发。我见过很多代码一上来就固定w=0.7,也不是不行,但遇到多峰函数容易卡住。
学习因子c1、c2通常取2.0,或者取c1=c2=1.5左右。实际上c1和c2的比值会左右粒子的行为:c1比c2大太多,每个粒子就只顾着找自己的路,群体协同弱;c2比c1大太多,所有粒子都往同一个方向追,容易早熟。我在做配电网优化时一般把两者设为1.8到2.0之间,效果比较稳妥。
种群规模一般取20到60。很多人觉得粒子越多越好,实际上对33节点配电网这种中等规模的优化问题,30个粒子跑100代就完全够用了,再多只会增加潮流计算次数、拖慢速度。
最大速度Vmax这个细节经常被忽略。如果不限制速度上限,粒子一个跨步就飞出可行域,后面全靠边界拉回来,搜索效率非常低。我一般把Vmax设成决策变量取值范围宽度的10%左右。
1.3 连续问题到离散选址:优化编码的关键改造
原始PSO是为连续变量设计的,但配电网光伏优化配置是个混合整数问题:光伏装在哪几个节点是离散的“选位”,装多大容量又偏向连续(或者落在离散的容量档位上)。这里一定要做编码改造。
常用做法是“实数编码 + 取整映射”。比如系统有33个节点,候选安装节点编号是1到32(去掉电源节点),那位置部分直接用实数编码,迭代时四舍五入取整,映射到候选节点编号上。容量部分则可以直接是连续变量,单位是kW或MW。
这种改造方式实现简单、不需要改变PSO主体逻辑,工程上最常用。要注意的是,取整操作会让粒子在边界附近产生重复映射——比如2.4和2.6都会被映射到节点2上,这会浪费一部分搜索能力。应对办法是在适应度函数里做去重处理,或者对同一个节点重复映射的情况施以轻微惩罚。
2. 配电网光伏优化配置的数学模型构建
2.1 决策变量怎么定义:位置、容量与组合编码
优化配置问题的决策变量本质上是“装哪些节点、每处装多少”。假设系统有N个候选节点,最多允许安装M个光伏电站,那一个粒子的编码向量可以表示成:
X = [x1, x2, ..., xM, p1, p2, ..., pM]
其中x1到xM是安装位置(对应候选节点编号),p1到pM是对应的安装容量(kW)。如果某个位置的安装容量为0,就表示这个位置不装,等效于少装了一个电站。
这里有个工程细节值得强调:候选节点集的选择不是“全节点都拿来优化”。我习惯先用潮流计算做个灵敏度分析,看看哪些节点对系统网损和电压最敏感,再从中挑选10到20个候选节点。这样能大幅缩小搜索空间,优化速度和稳定性都更好。
2.2 目标函数设计:从网损、电压到综合经济性
配电网光伏优化配置是个典型的多目标优化问题。不同项目的侧重点不同,但我总结下来最常见的三个目标函数是:
最小化网络损耗。 表达式是 Ploss = Σ(i,j) Gij (Vi² + Vj² - 2ViVjcosθij),其中Gij是支路电导,Vi和Vj是节点电压幅值,θij是相角差。光伏接入后会改变潮流分布,如果位置和容量得当,可以降低网损;如果安排得不好,反而会让某些线路重载、网损升高。
最小化电压偏差。 表达式是 ΔV = Σ|Vi - V_ref|。分布式光伏出力高峰时,如果接入点靠线路末端,很容易把电压抬到1.05 p.u.以上,影响电能质量。电压偏差目标就是尽量让各节点电压都贴近额定值。
最大化经济收益或最小化年综合费用。 这里要统计光伏的投资成本、运维成本、发电收益(包括上网电量和节省的购电费用),再折算成年值。投资回收期也是很多项目实际关心的指标。
多目标怎么处理?我推荐最简单也最稳妥的“加权和归一化”法。先把每个单目标分别优化一次,取各自的最优值作为基准,然后把目标写成无量纲加权和的形式。权重怎么定看项目说话:如果是偏电网运行的项目,网损和电压偏差权重给大点;如果是偏投资回报的项目,经济性指标权重大点。
2.3 约束条件:这些物理边界决定了方案是否可行
优化出来的方案必须是一个物理上可运行的方案,这就是约束条件的作用。配电网光伏配置的典型约束有以下几类:
潮流方程约束。 每个节点都要满足有功和无功功率平衡方程。这是所有配电网分析的底层约束,不管用什么算法优化,最终都要过潮流计算这一关。
节点电压约束。 通常要求0.95 p.u. ≤ Vi ≤ 1.05 p.u.。实际工程中不同电压等级的允许偏差范围不同,但做学术和仿真建模时这个范围最通用。
支路电流约束。 每条支路的电流不能超过载流量上限,否则会过热或者保护误动。在辐射状配电网中,这个约束往往比电压约束更容易被触发。
光伏安装总容量约束。 一般用渗透率表示:光伏总安装容量不能超过配变容量的某个比例,比如30%、50%或者80%,具体看配电网的消纳能力。
单节点容量约束。 单个节点的光伏接入容量不能超过该节点上级变压器的容量或线路热稳定极限,还要考虑逆变器本身的容量档位。
处理约束的方法上,我比较推荐罚函数法:对越界的方案,在适应度函数里叠加一个惩罚项。只要惩罚系数取得足够大,PSO自然会把搜索方向拉到可行域内。不过惩罚系数的取值需要调,太大容易让粒子的目标函数失真,太小又起不到约束作用,这个分寸要靠多跑几次实验来掌握。
3. 光伏出力特性与配电网潮流仿真建模
3.1 光伏出力模型:光照、温度与功率输出的换算逻辑
光伏出力计算是整个优化的基础输入。我平时最常用的简化模型是:
P_pv = η * S * I * [1 - 0.005*(T_cell - 25)]
其中η是光伏组件效率,S是组件总面积(m²),I是光照强度(kW/m²),T_cell是电池板温度(°C)。这个模型把逆变器效率和MPPT跟踪效率等细节打包在一个综合效率里,工程精度完全够用。
实际数据获取上要注意一点:光照强度是随机变量,不能只用一组典型值。处理办法是做典型场景分析——分晴天、多云、阴天三种典型日,每种给定光照曲线,然后分别计算优化方案的适应度,再按概率加权求和。这样优化出来的配置方案不是一个“只对晴天最优”的极端方案,而是综合天气条件下的全局最优方案。
3.2 网络与负荷建模:IEEE 33节点系统怎么用起来
配电网优化领域最经典的基础网络是IEEE 33节点系统,很多论文里的仿真都是拿它做的。这个网络有33个节点、32条支路,额定电压12.66kV,总负荷约3.7MW加上2.3Mvar,是典型的辐射状配电网。
用IEEE 33节点系统做光伏配置优化的好处是很明显的:一是数据公开、结果可复现;二是网络规模适中,跑PSO加潮流计算很快;三是它提供了比较充裕的调节空间,光伏接入前后电压和网损都有明显变化,适合验证算法效果。
负荷建模上,我一般会在基础负荷之上叠加一个日负荷曲线。比如把节点负荷乘以一个随时间变化的系数——夜间0.5、白天0.8、傍晚峰值1.2之类的典型日模式。光伏出力最大的中午时段与负荷低谷重叠,这是配电网电压抬升问题最严重的时段,优化时必须把这个场景算进去。
3.3 潮流计算选型:前推回代法还是牛顿-拉夫逊法
配电网潮流计算的方法选择直接影响优化算法的运行效率。辐射状配电网中,前推回代法是优先选择——它利用网络的辐射状结构,先假设节点电压为额定值,从末端往前推算出支路电流/功率,再从首端往回推算出各节点电压,迭代到收敛。这个方法实现简单、内存占用小、计算速度快,且对辐射状网络有非常好的收敛性。
牛顿-拉夫逊法则更通用,适合含环网的复杂结构,但每次迭代都要计算雅可比矩阵,计算量大不少。如果网络里除了光伏还有微网、储能等设备,或者网络合环运行,那用牛顿-拉夫逊法会更稳妥。
MATLAB环境下,我通常会直接调MATPOWER的内置潮流函数,或者自己写一个前推回代法函数。自己做的话,要特别注意节点编号顺序和支路数据的方向设置,不然很容易在推导支路层级的父子关系时出错。
3.4 仿真验证层次:从潮流计算到波形级仿真
优化配置算完之后,不能直接拍板,还需要验证方案在电磁暂态层面的可行性。我习惯分两层做:
第一层是潮流计算层验证,用PSO求得的配置方案重新跑一次潮流,检查电压、网损、线路电流这些稳态指标是否满足约束。这一层在MATLAB里就能完成。
第二层是动态仿真层验证,用Simulink(或者simplusgt这类国产配电网仿真工具)搭建包含光伏逆变器、负荷、线路的拓扑,对比优化前后电压波形、有功无功输出、并网电流谐波等。逆变器的控制策略(比如PQ控制、V/f控制)对动态响应影响很大,这一层主要看的是“稳态优化方案在动态过程里会不会出问题”。
4. 基于MATLAB的PSO配电网优化配置完整实现
4.1 程序架构设计:把“寻优”和“评估”分层解耦
整个优化程序的架构,我强烈建议做模块化拆分。上层是PSO寻优模块,负责更新粒子位置、速度、评估适应度;下层是潮流计算模块,接收一组配置方案,算出对应的网损、电压等指标,回传给上层。这两层之间的接口就是一个候选解向量和一个评估结果标量。
这样的分层设计好处很多:第一,潮流计算和PSO可以分开测试,定位问题更高效;第二,以后想从PSO换成遗传算法或灰狼算法,只需要替换上层模块;第三,如果后续要处理更大的配电网系统,下层潮流模块可以无缝替换成更复杂的求解器。
4.2 核心代码实现:粒子群主循环与适应度计算
先看PSO主循环的代码。这里我用MATLAB实现一个基础的PSO框架:
%% PSO 参数初始化 nParticles = 30; % 粒子数 maxIter = 100; % 最大迭代次数 dim = 2 * nPV; % 决策变量维度(位置+容量) wMax = 0.9; wMin = 0.4; % 惯性权重上下限 c1 = 1.8; c2 = 1.8; % 学习因子 % 初始化粒子位置和速度 pos = zeros(nParticles, dim); vel = zeros(nParticles, dim); for i = 1:nParticles pos(i, 1:nPV) = randi([1, 32], 1, nPV); % 光伏位置:候选节点 pos(i, nPV+1:end) = rand(1, nPV) * maxCap; % 光伏容量:0~上限 vel(i, :) = zeros(1, dim); % 初始速度为0 end pbest = pos; % 个体历史最优 pbestVal = inf(nParticles, 1); [gbestVal, gbestIdx] = min(pbestVal); gbest = pbest(gbestIdx, :); %% 主迭代循环 for iter = 1:maxIter w = wMax - (wMax - wMin) * iter / maxIter; % 惯性权重线性递减 for i = 1:nParticles % 速度更新 r1 = rand(1, dim); r2 = rand(1, dim); vel(i, :) = w * vel(i, :) ... + c1 * r1 .* (pbest(i, :) - pos(i, :)) ... + c2 * r2 .* (gbest - pos(i, :)); % 限制速度范围 vel(i, :) = max(min(vel(i, :), vMax), -vMax); % 位置更新 pos(i, :) = pos(i, :) + vel(i, :); % 位置越界约束 pos(i, 1:nPV) = round(min(max(pos(i, 1:nPV), 1), 32)); pos(i, nPV+1:end) = min(max(pos(i, nPV+1:end), 0), maxCap); % 适应度评估 fitness = evalFitness(pos(i, 1:nPV), pos(i, nPV+1:end), sysData); % 更新个体最优和全局最优 if fitness < pbestVal(i) pbestVal(i) = fitness; pbest(i, :) = pos(i, :); if fitness < gbestVal gbestVal = fitness; gbest = pos(i, :); end end end end这段代码里几个要点我得特别说明:
位置向量前nPV个元素是光伏位置,用randi初始化并四舍五入取整,确保落在有效节点编号范围内;后nPV个元素是对应容量。速度更新里的r1和r2是逐维独立的随机向量,这是必要的——如果整个向量共用一个随机数,所有维度的更新步调会完全相同,搜索能力大打折扣。
再说适应度函数evalFitness,它承担着整个优化的“评价大权”:
function f = evalFitness(loc, cap, sysData) % 1. 更新系统数据:在指定节点接入光伏 sysData.pvLoc = loc; sysData.pvCap = cap; % 2. 调用潮流计算(前推回代法) result = backwardForwardSweep(sysData); % 3. 计算目标函数:网损 + 电压偏差 + 罚函数 ploss = result.ploss; voltDev = sum(abs(result.V - 1.0)); % 4. 约束越界检查 punish = 0; if max(result.V) > 1.05 || min(result.V) < 0.95 punish = punish + 1e6; end if sum(cap) > totalCapLimit punish = punish + 1e6; end % 5. 加权和作为最终适应度 f = ploss + 0.1 * voltDev + punish; end惩罚罚函数系数取1e6是我实测后觉得比较合适的量级——它比正常的网损值(几千瓦到几十千瓦)大几个数量级,能确保任何越界方案的适应度都差于可行方案。这样PSO在迭代中自然会把粒子群引向可行域。
4.3 经典算例结果分析:优化前后到底改善了什么
用IEEE 33节点系统做一组典型实验。配置前,系统总网损约202.68kW(这组数据很多论文都能对上)。运行PSO后得到的光伏配置方案,如果安装位置和容量搭配得当,网损可以降到100kW以下,降幅超过50%。
实际跑出来的优化方案往往是这样的规律:光伏偏向安装在网损灵敏度高的中后段节点,以及负荷较重的节点附近——因为这些位置接入电源能显著缩短电能的输送距离。但如果所有光伏都集中在末端,电压抬升又会超标,所以最优方案往往是一种“在末端和中间节点之间均衡分布”的格局,这就是粒子群在约束条件驱动下自动协调出来的结果。
收敛曲线方面,PSO通常在20代以内就能快速下降,后面进入精细搜索阶段,曲线变得平缓。如果50代之后适应度还在剧烈波动,基本可以判断是参数设置出了问题,比如惯性权重过大或者速度上限设置不合理。
5. 常见问题与排查技巧
5.1 潮流不收敛:先怀疑建模,再怀疑优化
PSO优化过程中要反复调用潮流计算,潮流一旦算不下去,整个优化就崩了。我遇到过最多的原因是:某一代粒子生成的配置方案让某些节点电压严重越限(比如光伏容量过大导致末端电压远超1.05),或者节点数据里的负荷参数写错。
排查思路是:先拿没有光伏的原始网络跑一次基础潮流,确认网络模型本身没问题;再手动设一组保守的配置方案(比如小容量、位于中前段)跑潮流,逐步增加容量,定位是哪个环节开始发散。这个排查思路能有效缩小问题范围,避免一上来就在大量代码里翻找。
5.2 粒子群早熟收敛:结果稳定但很差
如果多次运行PSO得到的结果都落在同一个很差的区域且无法逃逸,典型原因是早熟收敛。这时候优先检查两点:
第一,惯性权重是否给的太低。如果w初始值就小于0.6,粒子的全局探索能力会很弱,可能一开始就被某个局部最优吸引过去了。我通常建议w从0.9开始线性递减。
第二,种群多样性是否下降过快。可以在迭代过程中监控粒子位置方差,如果方差快速趋近于0而gbest仍未收敛到理想值,说明种群“抱团”太快了。解决办法是引入变异机制——每隔若干代,随机重置一小部分粒子的位置,模拟遗传算法中的变异操作,增加种群多样性。
5.3 结果对初值敏感:多次运行结果差异很大
PSO本身是随机算法,多次运行结果有波动是正常的。但如果波动范围太大,就说明算法没有稳定收敛到同一区域。我的处理方式是:同一组参数下连续运行5到10次,取最优结果或最优的一组结果的平均值作为最终方案。另外也可以考虑做一次“混沌初始化”——用Logistic映射替代均匀随机数生成初始粒子位置,能在一定程度上提高初始种群的代表性,让多次运行的结果更一致。
5.4 优化结果“好看”但仿真验证不过关
这一类问题最隐蔽。潮流计算层面温度和网损都达标了,但放到Simulink或simplusgt里一跑,发现光伏逆变器并网点谐波超标或者电压波动明显。这通常不是优化算法的问题,而是在建模阶段没有考虑逆变器和控制策略的动态特性。
遇到这个情况,我的建议很直接:在建优化模型时就要预留“可配置裕度”。比如电压约束不要卡在1.05 p.u.,而是给到1.03或1.04 p.u.;线路载流量约束也留出10%以上裕量。优化时把动态运行的缓冲提前算进去,后面仿真验证就大概率能过得去。这也是“纸上优化”和“工程落地”之间最关键的差别。
6. 从课程设计到真实工程:这套方案的扩展方向
用粒子群算法做光伏配电网优化配置,本身是一个很完整的训练项目,但从“能跑通”到“能用在实际工程里”,中间还有几层扩展要做。
接入储能联合优化是最近的明显趋势。光伏出力波动性大,配电网很多时候卡脖子的不是容量不够,而是调峰能力不足。把储能容量、充放电策略也作为决策变量放进粒子群里,和光伏配置一起做联合优化,能够进一步降低弃光率、平滑出力曲线。我之前做过一组对比实验,光伏+储能联合优化的方案比纯光伏配置的方案,在相同渗透率下网损能再降低10%到15%,电压波动也明显更小。
跟超短期光伏功率预测做联动也是一个实用方向。优化配置是长期规划问题,功率预测是短期运行问题,两者看起来时间尺度差异很大,但在实际系统里,配置方案决定了哪些节点具备调节能力,预测结果决定了怎么调度这些能力。把预测的不确定性区间纳入优化模型里做鲁棒优化,是现在研究比较热的方向,工程上也有落地价值。
微电网日前优化调度则是另一个扩展场景。比如2017年电工杯A题那个典型的微电网调度问题,光伏加储能加分时电价,本质上也是一个“时间维度上的资源配置优化”问题,粒子群同样适用。这时候决策变量从“装在哪、装多少”变成了“各时段内储能充放电功率和购售电功率”,维度从空间转到时间,但算法的核心逻辑完全一致。
说到底,粒子群算法是一个通用工具,光伏配电网优化配置只是它一个特别典型、特别有工程价值的应用场景。掌握了“问题建模 -> 编码设计 -> 算法适配 -> 仿真验证”这一整套思路,你也就具备了用元启发式算法解决各种复杂工程优化问题的通用能力。这套方法论本身,才是比任何具体代码都值钱的东西。