1. 为什么要做这个课题分布式电源接入后的电压之困1.1 分布式电源接入后配电网到底发生了什么变化这几年分布式光伏、小型风电在配电网里的渗透率越来越高。以前我们做配电网分析前提基本都是单向潮流——变电站往负荷端送电电压沿着馈线越走越低末端电压不够了就装电容器补一补问题不大。但分布式电源一接入情况完全变了。最直观的一点是潮流方向不再是单向的了。光伏大发的中午时段一个台区里的负荷可能只有200千瓦但光伏出力能到500千瓦多出来的300千瓦就得顺着馈线往回送。这时候线路上的电压分布就不再是“馈线首端最高、末端最低”的单调递减趋势而是可能出现中段或末端电压被抬高的“鸭子曲线”或者容积效应。我见过不少实际台区末端电压从原来的0.92标幺值直接被抬到1.05以上配电变压器的分接头怎么调都压不住。还有一个麻烦是波动性。光伏出力跟着光照走一片云飘过来五分钟内出力可能掉一半。这个过程中整个馈线的无功功率分布一直在变。传统的无功补偿设备比如按时间或按季节整定的并联电容器组根本无法跟上这种分钟级的快速变化。要么过补要么欠补整个台区的功率因数和电压质量都很难看。所以做含分布式电源的无功补偿优化核心解决的问题是在分布式电源出力不确定、负荷也在变化的条件下怎么协调控制各类无功补偿设备电容器、静止无功发生器、甚至逆变器自身的无功能力让电压始终稳定在合格区间同时线损尽可能小。这不是拍脑袋定一组补偿容量就完事的而是需要一个能够随着运行状态变化而动态决策的优化策略。1.2 无功功率和电压为什么补了无功电压就稳了很多人刚接触这个课题时对“为什么无功补偿能改善电压”这一点理解得不够深。这里我用自己的话来梳理一下。电力系统里的无功功率本质上反映的是电场和磁场之间交换能量的速率。线路和变压器是电感性的要建立磁场就必须吸收无功电容器是电容性的建立电场时会发出无功。系统里有功功率要平衡因为发电机输出和负荷消耗的有功必须时刻相等无功功率也类似但它的平衡还具有局部性——无功不像有功那样可以远距离输送送出去的过程中会在线路上产生很大的电压降落和损耗。看这个简化电压降落公式就好理解了[ \Delta U \approx \frac{PR QX}{U} ]P是有功潮流Q是无功潮流R和X分别是线路电阻和电抗。对于配电网线路的X/R比比较低有些架空线甚至接近1但无论如何无功分量QX对电压的影响始终存在。当系统里无功不足时Q为负向潮流U就偏低无功过剩时Q为正向U就被抬高。所以说通过无功补偿来调节局部无功平衡是控制电压最直接的手段之一。这就是整个课题的物理基础。后面所有优化模型、目标函数、约束条件归根结底都是在回答一个问题什么时间、在哪个节点、该发多少无功。1.3 传统无功补偿为什么不够用传统配电网无功补偿基本就是两板斧固定电容器组加有载调压变压器OLTC。固定电容器按最大无功缺额来配置分档投切用接触器控制一天最多动作几次。对于负荷变化平缓的传统配电网这套方案也算够用。但接入了分布式电源之后问题就暴露了动态响应跟不上光伏出力的波动是秒级到分钟级的接触器投切电容器需要几秒到几十秒的动作时间而且频繁操作会显著缩短设备寿命。补偿容量不好定DG出力大的时候无功缺额变小甚至倒送按最大缺额配置的固定电容器就变成过补偿反而抬高电压。多设备协调困难配电系统里可能有十几组电容器、若干台SVG还有DG逆变器本身也具有无功能力怎么协同调节它们以追求全局最优人工经验根本算不过来。所以这个课题本质上要解决的是一个多变量、多约束、时变的优化问题。用Matlab编程来做这件事是很自然的选择——Matlab在矩阵运算、数值计算和算法验证方面有绝对优势而且电力系统分析的专业工具箱也成熟非常适合做这类科研和工程预研。2. 整体方案设计把控制问题翻译成数学优化问题2.1 补偿设备怎么选电容器、SVG还是混合方案做无功补偿优化第一步要考虑的不是算法而是你的系统里有哪些无功源可以参与调节。设备选型决定了模型的决策变量是什么。目前配电网里常见的无功补偿设备有以下几类设备类型调节方式响应速度成本适用场景并联电容器组分档投切慢秒级低基础无功补偿平滑负荷曲线静止无功发生器SVG连续调节快毫秒级高动态补偿平抑快速波动静止无功补偿器SVC连续调节快毫秒级中高动态补偿与电压支撑分布式电源逆变器连续调节剩余容量内快毫秒级几乎为零利用DG剩余容量参与调压我个人在做这个题目时采用的是一种混合方案电容器组作为慢速粗调手段SVG作为快速细调手段同时让具备条件的DG逆变器在剩余容量范围内输出无功功率参与支撑。这样既有经济性不需要全上SVG又能保证动态性能。在Matlab建模里电容器组的投切档位用整数变量表示比如0到5档SVG的出力用连续变量表示DG的无功出力也可以用连续变量表示。混合整数和非连续变量的优化问题让求解变得更有挑战性但也更贴近工程实际。2.2 目标函数怎么定单目标还是多目标目标函数是整个优化问题的“指挥棒”它决定了算法往哪个方向寻优。做这类研究时大家最常用的几个目标有这么几种网损最小这是最经典的目标。表达式是 ( P_{loss} \sum_{i,j \in N} G_{ij}(U_i^2 U_j^2 - 2U_i U_j \cos\theta_{ij}) )。从经济角度看网损直接对应运行成本物理意义明确。电压偏差最小( \min \sum_{i1}^n |U_i - U_{ref}| ) 或者用平方项。这个目标直接追求电能质量监控起来直观。综合成本最小把网损费用、设备投切损耗、设备投资折旧全折算成年费用。工程应用上更全面但参数不好定容易引入主观性。我建议初学者从一个目标开始做起比如“以网损最小为主目标电压偏差作为罚函数项”。这样既达到了优化的核心目的又不需要处理多目标之间的权重博弈。如果你的课题要求做多目标优化那是后面的进阶工作可以再引入帕累托前沿的概念。常见的处理方式是把多目标加权求和[ \min F w_1 P_{loss} w_2 \sum_{i1}^{n}(U_i - U_{ref})^2 w_3 \sum_{k1}^{m} |Q_{c,k}| ]权重系数根据偏好设定。不过要注意权重的选择对结果影响很大通常需要做几组敏感性分析来验证结果不是被某个权重“带偏”的。2.3 约束条件别让优化结果“脱离物理现实”约束条件是优化模型里最容易出错也最容易被忽视的部分。没有约束的优化结果可能就是一堆不满足实际物理规则的“数学解”毫无工程意义。必须满足的约束有以下几类第一潮流方程等式约束。这是硬约束任何运行点都必须满足节点功率平衡。Matlab里实现时通常用潮流计算的结果来隐式满足这个约束——每次粒子位置更新后都要重新做一次潮流计算如果不收敛或者超出电压限制就说明这个解不可行。第二节点电压上下限约束。根据国家标准配电网电压允许偏差一般在±7%内。在建模时我会把电压限值设得稍微严格一点比如0.95到1.05标幺值给自己留一点工程裕度。第三无功补偿设备的容量约束。电容器的档位有上限SVG的出力有额定容量限制DG逆变器的无功出力不能超出其视在功率减去当前有功出力后的剩余容量。这个约束在模型中通常表示为[ Q_{DG,i}^{min} \leq Q_{DG,i} \leq Q_{DG,i}^{max} ]其中上下限由逆变器容量决定( Q_{DG}^{max} \sqrt{S_{inv}^2 - P_{DG}^2} )。记住这个约束很重要DG逆变器在做无功补偿时有功出力已经占了容量剩下的才能给无功用。很多人一开始会忽略这一点导致优化结果要求逆变器发出超过容量的无功直接不可行。第四SVG的容量约束和电容器的投切次数限制。投切次数限制在长期运行优化里很重要频繁投切会缩短设备寿命所以有的模型会限制一个调度周期内电容器组的最大动作次数。2.4 优化算法选型为什么我推荐粒子群算法起步配电网无功优化本质上是一个大规模非线性混合整数规划问题。传统数学优化方法比如内点法、混合整数规划虽然能找到精确解但对模型的可导性和凸性有要求而且变量一多计算就很重。智能优化算法在处理这类问题上更灵活——不需要梯度信息对目标函数和约束的形态没有太多限制实现也直观。粒子群算法PSO是我做入门研究时用的第一个算法也是我给初学者的推荐。原因很简单参数少代码结构清晰Matlab实现一百行以内就能跑起来。对初始解不敏感不像某些启发式算法那样容易受到初始种群质量的影响。全局搜索能力强适合处理多峰值、非线性的目标函数。当然PSO也有它的弱点后期收敛精度不足、容易早熟。但一开始先用PSO把整个流程跑通后面想换改进算法比如自适应权重、混沌初始化、混合遗传算子都有清晰的升级路径。我自己的经历也是这样——先标准PSO再换成改进PSO后来又做过用灰狼算法对比核心流程都是一样的。3. 核心实现Matlab中潮流计算与PSO寻优的协同设计3.1 潮流计算所有优化的地基在无功优化这个题目里潮流计算是内层优化算法是外层。每评估一组补偿方案都要做一次潮流计算得到节点电压和网损作为目标函数值的输入。配电网潮流计算我用的是前推回代法。相比牛顿-拉夫逊法它对配电网这种辐射状网络收敛性更好迭代简单而且不需要计算雅可比矩阵Matlab里实现很方便。核心思路就两步前推已知末端负荷功率和节点电压初值从末端往首端推算每条支路的功率分布。回代从首端已知的变电站电压出发用支路功率计算各节点电压降落更新节点电压。重复这个过程直到两次迭代的电压差小于阈值。我自己实现时收敛精度取 ( 10^{-6} ) 标幺值通常十几轮迭代就收敛了。这里有一个重要的工程细节配电网的负荷模型并不是恒功率那么简单。实际台区里恒阻抗、恒电流、恒功率负荷是混合共存的。但在Matlab仿真阶段用恒功率模型PQ节点做基本分析是可以接受的等需要高精度的时候再改负荷模型就行。不过要注意如果负荷用的是恒阻抗模型同样的补偿方案算出来的电压和网损会有差异。3.2 PSO和潮流计算的耦合逻辑整个程序的结构是一个双层循环外层是PSO的迭代过程内层是潮流计算。外层每一轮迭代的流程大致是初始化粒子群。每个粒子的位置向量代表一组方案电容器档位、SVG无功出力、DG逆变器无功出力。对每个粒子把位置向量解码成具体的无功补偿参数代入配电网模型做潮流计算。根据潮流结果计算目标函数值网损等同时检查约束是否满足不满足的加上惩罚项。更新粒子的个体最优pbest和全局最优gbest。根据速度-位置更新公式让粒子飞向下一个位置。到达最大迭代次数后输出gbest对应的最优方案。这里有个细节值得多说一句粒子群的速度和位置更新公式本身很简单[ v_{i}^{k1} w v_i^k c_1 r_1 (pbest_i - x_i^k) c_2 r_2 (gbest - x_i^k) ][ x_i^{k1} x_i^k v_i^{k1} ]但应用到无功优化的场景需要稍微处理一下。因为电容器档位是整数变量直接按连续变量更新后再四舍五入取整是最简单的办法。SVG和DG无功出力是连续变量直接更新没问题。注意四舍五入可能会让粒子在边界附近反复横跳影响收敛——我采取的措施是对整数变量的速度做一个限幅速度绝对值限制在0.8以内降低频繁跨档的概率。3.3 PSO关键参数怎么设置一份可以直接抄的配置PSO算法虽然参数不多但每个参数对收敛性的影响都很大。这里分享一组我经过多次试验觉得比较稳的参数参数取值说明种群规模40-60节点数多时适当增大最大迭代次数100-200结合收敛曲线判断是否充足惯性权重w0.9 → 0.4 线性递减前期全局搜索后期局部精细搜索学习因子c1, c2均为2.0经典取值多数情况下表现稳定速度上限Vmax定义为变量范围的20%防止粒子飞过头约束处理方式越限罚函数惩罚系数随迭代次数递增当初我图省事用了固定w0.6结果发现在前几十轮粒子还能快速收敛后面就陷入局部最优不动了。后来改成线性递减w之后明显改善。原理也不难理解早期需要大惯性权重保持粒子的探索性去找更广阔的可行区域后期需要小权重让粒子在局部精细挖掘快速收敛到最优解附近。这个逻辑和很多实际工作的思路是相通的——先广撒网再重点捕捞。3.4 代码结构建议与核心片段整个Matlab工程的代码组织建议分成这几个模块main.m主程序负责参数初始化和流程控制case33.m算例数据定义包括线路参数、负荷参数、DG位置和容量powerflow.m潮流计算函数输入补偿参数输出节点电压和网损objfunc.m目标函数计算调用powerflow返回适应度值pso.m粒子群优化主循环这样模块化设计的好处是每个函数都可以单独调试。特别是潮流计算部分一定要先单独验证正确性再接到优化算法里。不然等整个程序跑出问题再去排查你根本分不清是潮流的问题还是PSO的问题。我给出一个核心片段示意关于粒子位置解码和潮流调用的部分% 粒子解码从位置向量提取补偿方案 % 粒子结构: [Qc1_gear, Qc2_gear, Qsvg1, Qsvg2, Qdg1, Qdg2] Qc_gear round(x(1:Nc)); % 电容器档位取整 Qc_power Qc_step .* Qc_gear; % 电容器实际无功出力 Qsvg x(Nc1:NcNsvg).*Qsvg_max; % SVG出力 Qdg x(NcNsvg1:end).*Qdg_avail; % DG逆变器剩余容量约束下出力 % 设置潮流计算的注入功率 bus_data(:, Qc_bus_idx) bus_data(:, Qc_bus_idx) Qc_power; bus_data(:, Qdg_bus_idx) bus_data(:, Qdg_bus_idx) Qdg; % 潮流计算 [V, P_loss] powerflow(bus_data, branch_data); % 目标函数网损电压惩罚 V_dev sum((abs(V) - 1.0).^2); fitness P_loss lambda * V_dev;需要说明这是一个结构示意不是可以直接复制的完整代码。真正实现的时候你还要注意节点编号、单位换算标幺值和有名值、补偿容量与节点注入的关系等细节。4. 仿真验证IEEE 33节点配电网算例全流程4.1 算例设置测试系统与DG接入方案我用的测试系统是IEEE 33节点配电网这是配电网优化研究里最常用的标准算例。系统基准电压12.66kV基准功率10MVA总负荷5083.6kW 2547.3kvar33个节点、32条支路是典型的辐射状网络。在这个系统里我做如下配置接入两个分布式电源节点18接入一个光伏电站额定容量800kW节点33系统末端接入一个风电额定容量600kW。这样的布置其实有讲究——18号节点和33号节点都位于馈线远端的薄弱位置接入DG对电压抬升的作用最明显也最容易出现电压越限问题更加考验优化策略的效果。无功补偿设备节点10和节点29各装一组可投切电容器单组容量300kvar分5档可调节点25安装一台SVG容量±500kvar。DG逆变器剩余容量可发无功功率因数允许范围0.95超前/滞后也就是逆变器视在容量内可变功率因数运行。负荷场景取典型的中午高光照场景和傍晚高峰负荷场景两个断面分别测试优化策略在不同工况下的表现。4.2 三种场景对比从“不补”到“优化补”我做对比实验时设置了三个场景这也是这类课题论文里最常见的对比思路场景A不含分布式电源只有传统负荷不进行任何无功补偿基础参考。场景B接入分布式电源但无功补偿使用固定电容器按最大缺额配置不动态调档。场景C接入分布式电源使用本文的优化策略动态协调电容器、SVG和DG无功。表典型午间场景下的结果对比场景系统网损(kW)最低节点电压(p.u.)最高节点电压(p.u.)平均电压偏差(p.u.)场景A无DG211.20.9121.0000.042场景BDG固定补偿133.50.9511.0480.021场景CDG优化补偿98.70.9671.0230.013先说场景A和场景B的对比。接入DG之后网损从211.2kW降到133.5kW这个好理解——DG就地供电减少了线路上的有功传输距离和技术损耗。但最高电压已经到了1.048接近越限边缘末端电压虽然升了整体电压分布并不理想。这说明固定电容器方案虽然能应付一部分无功需求但和DG出力的匹配度不够好。再看场景C。网损进一步降到98.7kW相比场景B又下降了约26%。更重要的是电压质量明显改善最高电压1.023、最低电压0.967全部落在0.95-1.05的合格区间内平均电压偏差从0.021降至0.013。这个结果的工程意义就在于同样的DG接入条件通过合理的无功协调不仅没有让DG的高出力破坏电压质量反而让系统运行状态比没有DG时还好。4.3 优化过程中的收敛性验证除了最终结果优化算法的收敛性也需要验证。这里我把PSO迭代过程中的最优适应度这里是网损目标函数值随迭代次数的变化画出来看。我采用的参数种群规模50最大迭代100次惯性权重从0.9线性递减到0.4。运行结果是前30轮网损下降非常快从初始的180kW左右迅速降到105kW附近30到60轮之间是一个平台期有小幅下降60轮之后基本稳定在98.7kW附近不再有明显变化。这说明100次迭代对于这个规模的算例是够用的但如果你想更稳妥可以把迭代次数设到150代价是多花一点计算时间。另外因为PSO是一个随机性算法每次运行结果会有细微差异。我建议对同一组参数运行20次取平均结果和标准差。如果标准差过大说明算法稳定性差要么增加种群规模要么检查是否粒子初始化范围设置太宽导致搜索空间碎片化。我还对比过用遗传算法GA做同样的优化结果在目标函数值上两者比较接近但PSO的收敛速度明显更快GA跑到80代左右才追平PSO在50代的水平。这不是说GA不好而是对于无功优化这类中等规模问题PSO的“性价比”确实更高。4.4 动态场景下的策略响应进阶扩展做完单断面的静态优化之后我建议你把场景扩展到日时间尺度。方法也不复杂就是把一天24小时按小时分段每段内的DG出力和负荷取平均值然后逐段做优化得到一组24小时的补偿策略。这样做的好处有两个一是能看出电容器组的投切频率是否合理如果某个电容器组在相邻时段频繁切换档位说明策略对时间尺度的平滑性考虑不足需要加投切次数约束或者修改目标函数二是能检验整个策略在实际运行时是否可行——毕竟真正的调度是按时间序列执行的不是孤立地看某一个时刻。我做这个扩展测试时发现一个问题如果只按网损最小为目标电容器的档位在中午光伏大发和傍晚负荷高峰之间可能频繁切换。后来在目标函数里加了一个“档位变化惩罚项”相邻时段电容器档位变化会被惩罚这个问题就缓解了很多。这段经验在后面其实也对应着一个重要的工程认知优化模型不是越复杂越好一个恰当的惩罚项往往比增加约束条件更有效。5. 常见问题与调试实录5.1 潮流计算不收敛怎么办这是这个课题里最容易碰到的问题也是调试成本最高的问题。一般就几种原因输入数据单位不一致。比如线路阻抗用欧姆负荷用兆瓦但基准值算错导致计算时标幺值差了好几个数量级。这种错误最难排查因为没有报错提示只是迭代不收敛。我的建议是先用一个只有两三个节点的极简网络跑通潮流程序确认无误后再切换到33节点正式算例。电压初值设置不合理。前推回代法对初值不敏感但极端情况下如果初始电压设置成0就可能出现迭代发散。一般设置所有节点电压初值为1.0标幺值就能很好收敛。补偿容量过大导致局部无功倒送严重。这种情况往往发生在某几个节点集中补偿时局部无功功率超过负荷需求潮流计算的结果可能出现电压虚高。检查方法是把补偿量单独列出来人工估算一下每个节点的无功平衡是否合理。我排查这类问题时有个经验习惯先固定一组最简单的参数所有补偿为0跑通基础潮流再逐步增加补偿量看看从哪一步开始不收敛。用二分定位法大问题就会被拆成小问题。5.2 PSO早熟和结果不稳定的处理早熟是粒子群算法最经典的毛病。表现就是迭代二三十轮后适应度就不再下降所有粒子都挤在局部最优附近。我碰到过几次后来总结出几个有效手段增加种群多样性。一个很简单的办法是初始化时让粒子在可行域内均匀分布而不是完全随机。用Matlab的sobol序列或者拉丁超立方抽样都可以。引入变异操作。模拟遗传算法的变异思想每轮迭代以很小的概率0.01左右把某个粒子的位置随机重置。这个技巧简单且见效快。自适应调整惯性权重。如果连续多轮gbest没有改善说明粒子群可能陷入停滞这时候把w临时调大一点让粒子“飞出去”再探索一番往往能跳出局部最优。如果你做完这些改进后发现结果还是不稳定运行十次每次都不一样且相差很大那大概率不是算法问题而是目标函数或约束条件设置有缺陷。比如惩罚系数太小导致大量不可行解被当成优秀解参与竞争结果自然飘忽不定。5.3 优化结果“看着没问题但就是不对劲”的排查清单还有一种情况比较磨人程序跑通了结果也收敛了但工程上一看就知道不合理。比如SVG明明有±500kvar的能力优化结果却一直让它输出等于上限的值或者某组电容器在整个优化过程中都没动过。这种时候我建议按照下面这个顺序排查检查目标函数各分量的量级是否匹配。如果网损是几百千瓦的量级电压偏差惩罚项动辄是几万的量级那电压项会主导整个优化方向网络损耗几乎被忽略。检查约束是否真的作用在了粒子更新上。最直接的办法是把每次迭代的不可行粒子数量打印出来看是否一直很高。检查解是否落在边界上。如果一个变量一直卡在边界值可能是它对应的容量约束太紧也可能是这个设备所在的位置本身没有优化的必要性。哦对了还有一个很常见的坑在计算DG无功容量上限时忘了减去当前有功出力。很多文献里 ( Q_{DG}^{max} \sqrt{S_{inv}^2 - P_{DG}^2} ) 这个式子写得明明白白但实现的时候一写就是 ( Q_{DG}^{max} \sqrt{S_{inv}^2} )直接把有功功率忽略了。这个错误在光伏出力较低时影响不大一旦光伏满发实际逆变器根本没有那么多剩余容量发无功优化结果就不可执行。5.4 一个小技巧用可视化辅助调试调试优化程序时可视化比看数值更直观。我常用的三个可视化手段电压分布图把33个节点的电压画在一张图里三个场景各画一条曲线越限的部分高亮出来。一眼就能看出补偿前后的电压改善效果。收敛曲线把每轮迭代的gbest值画出来。收敛过程的形态能反映很多问题——下降太慢可能表示参数设置跳跃太小前期平台期太长可能表示初始种群太集中。三维适应度地形图固定两个决策变量扫描它们在整个范围内的目标函数值用surf画出来。这个图能帮你看清楚目标函数是否有多个局部极小点以及PSO到底收敛到了哪个位置。不过要提醒一句可视化只是在调试阶段使用最终论文或报告里的结果图还是要清晰简洁不要把所有调试过程都堆上去。6. 一点切身感受从最初搭潮流计算到PSO跑通再到各种加约束、调参数这个课题我前前后后花了将近两个月。回头看最难突破的其实不是代码本身而是对“优化目标、约束条件、算法参数”三者关系的理解。目标函数决定方向约束反映物理边界参数影响寻优路径三者必须在同一个框架里协调一致。如果你也在做这个方向我的建议是不要急着追求高级算法先把标准PSO在IEEE 33节点系统上完整跑通理解每一个变量的含义再把场景复杂度逐步提升。算法可以后面再换但基本功和对问题的理解前期必须扎实。最后再分享一个小经验算例数据一定要保留原始来源。IEEE 33节点系统的线路参数和负荷数据网上有多个版本不同版本之间的数据差异可能影响最终结果。我在早期就因为数据版本不同导致结果和某篇参考文献对不上后来核对了多个来源才发现是数据差异大。所以无论是自己用还是写论文务必在附录里标明数据出处、基准值设定和负荷模型这也是一种科研诚信的体现——不然审稿人或者复现你结果的人会很头疼。
