
中午十二点光照最强负荷低谷分布式光伏大面积出力10kV馈线末端电压被顶到 1.07 p.u. 以上逆变器一台接一台过压脱网。这个画面我相信很多做配电网仿真的朋友都不陌生。做含分布式光伏的配电网研究绕不开三件事光伏怎么建模、集群怎么划分、电压怎么协调控制。这篇博文就顺着“分布式光伏集群划分 集群电压协调控制”这条主线把电压抬升机理、划分算法原理、分层控制策略再到 Matlab 代码实现里的关键细节和调试教训完整过一遍。内容适合正在做相关毕设、期刊论文或工程方案比选的读者对照参考不需要你有太深的优化理论背景我会尽量把每一步的“为什么这么做”讲清楚。1. 分布式光伏接入后配电网电压问题到底出在哪1.1 一条公式看懂电压抬升做这个方向之前我建议先把电压抬升的物理机理吃透否则后面集群划分、协调控制全部是空中楼阁。用最简单的单馈线模型来看馈线首端电压为 U_s末端节点电压为 U_r线路阻抗为 R jX流过的功率为 P jQ。忽略电压横分量压降可以近似写成ΔU U_s - U_r ≈ (P R Q X) / U_s过去配电网是纯负荷馈线P 和 Q 都是正的ΔU 为正电压从首端到末端一路往下掉。接入分布式光伏以后情况变了末端附近的光伏就地发有功如果光伏出力比本地负荷还大馈线里的 P 就变成负值。这时候 (P R Q X) / U_s 整体变负公式告诉你末端电压不但不掉反而比首端还高。我算一个实际数量级例子。一段 3km 的 10kV 架空线线路参数 R0.5Ω/kmX0.4Ω/km末端光伏注入 1.5MW先忽略负荷和无功U_s 取 10kV。倒送有功 P-1500kWΔU ≈ (-1500 × 0.5 × 3) / 10 -225V折算到标幺值大概是 -2.25%也就是末端电压比首端高 2.25%。如果同时还有两条分支馈线往这个节点倒送功率末端电压超过 1.07 p.u. 是很容易出现的事情。这也是很多台区里光伏逆变器频繁过压脱网的直接原因。1.2 电压失调不是孤立现象而是一连串连锁反应分布式光伏带来的电压问题不是“电压超过 1.07 p.u.”这一个孤立事件我在实际仿真和现场数据分析时观察到一串连锁反应光伏出力最大的时段经常和系统负荷最低的时段重合馈线电压曲线出现明显的“午间驼峰”逆变器检测到过压后会自动降额甚至脱网脱网后电压回落重新并网后又超限形成反复投切对设备寿命和电网稳定性都不友好有载调压分接开关因为电压频繁波动而反复动作但它调的是馈线首端电压对分布式光伏引起的末端局部抬升往往使不上劲传统并联电容器组是固定投切缺乏和光伏逆变器的协调容易出现过补或者欠补线损率、三相不平衡度、保护灵敏度都会跟着恶化。这一堆问题在光伏渗透率低的时候不突出一旦台区光伏装机容量上来就会从个别现象变成普遍现象。这也是为什么近些年配电网研究把“高渗透率分布式光伏接入”作为重点场景来分析。1.3 全局集中控制为什么走不通理论上配电网无功电压最优控制完全可以写成一个全网优化问题给定负荷和光伏预测曲线以网损最小或电压偏差最小为目标对线路上的所有无功设备统一调度。但落到实际工程里集中控制有几个很难绕开的障碍配电网节点数量大一条中压馈线几十个节点一座城市上百条馈线集中控制对通信带宽、计算资源和主站可靠性要求都很高光伏逆变器、储能、电容器、SVC、OLTC 等设备往往属于不同投资主体全量采样数据很难拿齐集中控制需要的信息壁垒较高集中优化模型对网络参数和预测数据质量很敏感一组劣质数据就可能导致指令严重失真单点故障问题突出主站一旦故障全网电压控制基本瘫痪。所以把全网优化拆成“集群划分—分层控制”的框架就成为一个很有工程逻辑的思路先按电气耦合强弱把配电网节点分成若干集群集群内部做快速控制集群之间做协调配合。计算规模小了对通信的依赖降低了设备归属和管理边界也更清晰。这就是整个项目标题里“集群划分”和“集群电压协调控制”两个词的由来。2. 集群划分的数学本质怎么把“全局优化”变成“分区自治”2.1 集群到底在“聚”什么集群划分最容易踩的第一个误区是把它当成“按地理位置把节点圈起来”。实际上集群划分聚的是“电压控制关系紧密”的节点某个节点注入无功后哪些节点的电压响应最明显它们就应该被分到同一个集群里。判断耦合强弱的常用工具是电压-无功灵敏度矩阵。在潮流收敛解附近把节点注入功率和节点电压的关系线性化可以得到[Δθ; ΔU] J^(-1) [ΔP; ΔQ]取其中电压幅值对应的分块矩阵就是电压-无功灵敏度矩阵 S_Q。S_Q(i,j) 的物理含义是节点 j 注入单位无功功率后节点 i 的电压幅值变化量。灵敏度越大说明两个节点在电压控制上耦合越强。工程实现上一般不用纯解析法求这个矩阵更常用的做法是做摄动潮流在节点 j 上叠加一个小的无功增量 ΔQ_j重新跑一次潮流记录所有节点的电压变化量作为灵敏度矩阵的第 j 列。这个方法的好处是能在任何潮流程序上直接实现不依赖雅可比矩阵内部结构。有了灵敏度矩阵再定义电气距离。两个节点 i、j 之间的电气距离常用如下形式D_ij -log( |S_Q(i,j)| / sqrt(|S_Q(i,i)| × |S_Q(j,j)|) )D 越大说明两个节点电气耦合越弱同节点的 D_ii 为 0。后面再用 exp(-D_ij²/σ) 把它转成相似度权重作为社区检测的输入。2.2 从物理耦合到模块度指标把配电网节点看成一张加权图节点是图的顶点电气距离权重是图的边权集群划分就转化成了一个标准的社区检测问题把顶点分成若干组使组内边权尽量大、组间边权尽量小。最经典的量化指标是模块度Q 1/(2m) × Σ_ij [ W_ij - (k_i k_j) / (2m) ] × δ(c_i, c_j)这里 W_ij 是节点 i 和 j 之间的耦合权重k_i 是节点 i 所有边权重之和m 是所有边权重总和的一半δ(c_i, c_j) 在节点 i、j 属于同一集群时取 1否则取 0。模块度越大说明分区结构越明显工程上常见的合理分区模块度大概在 0.3 到 0.7 之间。这里要特别强调一个区别配电网集群划分里的 W_ij 不是简单的 0/1 邻接矩阵而是从电压灵敏度电气距离构造出来的权重矩阵。这一点和社交网络里的社区发现完全不同也是很多初学者直接用现成社区检测工具包、结果却一塌糊涂的关键原因。求解模块度最大化有两种主流做法谱聚类和 Louvain 算法。我把它们的适用情况整理了一下方法优点缺点适用场景谱聚类可以指定集群数量结果稳定能控制集群规模需要预先确定 k计算拉普拉斯矩阵特征分解对集群数有明确要求、希望规模均衡的研究Louvain无需预先指定集群数速度快模块度通常更高容易产生一个超大集群结果随机性较大探索性划分、初步看网络结构配电网电压控制对集群均衡性有要求我不希望一个集群管太多节点、另一个集群只有两三个节点所以实际项目中我用谱聚类更多。如果要追求模块度上更优也可以在 Louvain 划分结果上做后处理把超大集群强制拆分。2.3 划分结果的工程检查与集群数确定集群划分不能只看模块度数值。模块度最大化的极端情况也可能出现“所有节点并成一个集群”这种结果对控制没有意义。所以我在代码里会加几组约束条件集群数量需要预设一般根据馈线规模和调度层级取 2 到 8 个每个集群的节点数量要落在合理区间不能出现超大集群或孤立单节点集群内部必须连通不能出现“飞地”——一个集群的节点被另一个集群从拓扑上隔开集群边界尽量和馈线分段开关、联络开关的位置重合这样控制指令执行起来才方便。还有一个工程细节单一运行点算出来的灵敏度矩阵换一个场景可能就失效了。比如晴天中午光伏大发场景下末端电压灵敏度很高到了晚高峰负荷场景灵敏度分布又会变化。我建议构造一个“典型场景集”晴天光伏大发、晚高峰负荷、阴天弱出力、夜间低谷等几个代表场景分别算灵敏度矩阵再按概率加权得到一个综合矩阵用这个综合矩阵去做集群划分。这样划分结果对运行方式变化更稳不会换一个场景划分就完全乱掉。3. 集群电压协调控制策略先局部自治再全局协调3.1 三层控制框架及各自职责集群划分完成之后电压控制策略需要和划分结果配套设计。我的做法是三层控制框架时间尺度从快到慢递进控制层时间尺度主要设备核心目标就地控制层毫秒到秒级光伏逆变器、SVC快速抑制本地电压波动不依赖通信集群协调层秒到分钟级集群内光伏逆变器、储能、电容器消除集群内电压偏差均衡无功裕度全局优化层分钟级以上OLTC、各集群参考值全网网损优化和电压安全约束就地控制层是安全底座。即使通信断了每个光伏逆变器也能根据本地电压做无功调节。集群协调层则是在就地控制的基础上把“局部最优”往“集群最优”推进一步。全局优化层最慢负责跨集群的协调比如调整变压器分接头位置、给每个集群下发电压参考值。3.2 基于电压-无功灵敏度的集群协调控制集群协调控制的输入是本集群关键节点的电压测量值输出是各逆变器的无功调节指令。最简单的集群级控制可以写成比例积分形式ΔQ_cluster K_p × (U_avg - U_ref) K_i × ∫(U_avg - U_ref) dtU_avg 是本集群关键节点电压的平均值U_ref 是电压参考值。这个控制律简单可靠但不足之处是没有考虑集群内部各节点电压的差异可能出现“平均值达标、个别节点越限”的情况。所以我在项目里更倾向于用一个小的二次规划模型来做集群内分配min Σ w_i (U_i - U_ref)² λ Σ (ΔQ_i)²约束条件包括U_min ≤ U_i ≤ U_max节点电压不能越限Q_min ≤ Q_i ≤ Q_max逆变器无功出力不能越限S_i² ≥ P_i² Q_i²逆变器视在功率容量约束。目标函数里第一项是让节点电压尽可能接近参考值第二项是让无功调节量不要太大避免设备频繁动作。λ 是权重系数用来折中电压质量和调节代价。这个模型规模不大每集群节点数有限用 Matlab 自带的 quadprog 就能求解不需要引入太重的求解器。3.3 就地下垂和集群协调怎么分工光伏逆变器就地 Q(U) 下垂控制的典型形式是Q_i Q_0 k_q × (U_0 - U_i)本地电压高于参考值 U_0 时逆变器多吸收无功电压低时多发出无功。它的优点是响应快、不需要通信缺点是缺少全局视角。我举一个典型的失控场景集群左侧馈线电压偏高、右侧电压正常所有逆变器只看本地电压左侧全在吸无功右侧因为电压正常基本不动。等左侧电压降回来右侧电压可能又被压得偏低。这就是“局部控制正确、整体协调失败”的典型情况。集群协调层做的事正是修正这个偏差统一采集集群关键节点电压按照灵敏度关系算出每个逆变器应该承担的无功量优先让电压越限严重、无功裕度充裕的设备多出力。我常用的分配公式是按无功裕度加权ΔQ_i CapQ_i / Σ_j CapQ_j × ΔQ_cluster其中 CapQ_i 是节点 i 逆变器当前剩余无功调节能力CapQ_i sqrt(S_max_i² - P_i²) - Q_i_current这个公式很直观光伏满发时 P 接近 S_maxCapQ 很小分配到的调节任务就少储能和无功裕度大的逆变器多承担。整个控制流程是集群控制器读取关键节点电压和逆变器出力判断电压偏差是否超过死区超过则求解二次规划或者按裕度分配下发指令下一周期重复。通信中断时自动降级回就地 Q(U) 模式。4. Matlab仿真实现的关键环节与调试经验4.1 仿真程序总体结构与数据组织Matlab 代码实现我一般分成五个模块配电网数据初始化、潮流计算、灵敏度分析与电气距离计算、集群划分、电压控制与效果评估。程序结构清晰的话后面换算例、换控制参数都方便。数据组织是最容易被低估的一步。我习惯用 struct 存节点和支路信息% 节点数据编号、类型、有功负荷、无功负荷 node.id (1:n); node.type zeros(n,1); % 1:平衡节点, 2:PQ节点 node.Pd zeros(n,1); % 有功负荷 node.Qd zeros(n,1); % 无功负荷 % 支路数据起始节点、终止节点、电阻、电抗 branch.fbus [1; 2; 3]; branch.tbus [2; 3; 4]; branch.R [0.5; 0.4; 0.3]; branch.X [0.4; 0.3; 0.2];光伏接入位置和容量我单独用一张表存方便批量修改接入场景。建议把所有分布式电源统一建模成 PQ 节点潮流计算更稳定需要研究逆变器控制响应时再切换成 PV 节点或者电流源模型。4.2 关键代码片段与参数设置潮流计算是这个项目的地基。如果是做毕业设计我建议先用 Matpower 的 runpf 跑通标准算例验证手写潮流程序的正确性再用自写程序。自写牛顿-拉夫逊潮流的核心逻辑如下function [U, iter] nr_power_flow(Y, S, n, max_iter, tol) U ones(n, 1); % 电压幅值初值 theta zeros(n, 1); % 相角初值 for iter 1:max_iter Uc U .* exp(1j * theta); S_cal Uc .* conj(Y * Uc); dP real(S) - real(S_cal); dQ imag(S) - imag(S_cal); if max(abs([dP; dQ])) tol break; end % 求雅可比矩阵并求解修正量这里简化示意 J num_jacobian(Y, Uc); dX J \ [dP; dQ]; theta theta dX(1:n); U U dX(n1:2*n); end end集群划分部分电气距离矩阵和谱聚类的核心代码可以这样组织% 根据潮流雅可比逆矩阵取电压-无功灵敏度 J_inv inv(J); S_Q J_inv(n1:2*n, n1:2*n); % 电气距离矩阵 D zeros(n, n); for i 1:n for j 1:n D(i, j) -log(abs(S_Q(i,j)) / sqrt(abs(S_Q(i,i)) * abs(S_Q(j,j)))); end end % 相似度矩阵与谱聚类 W exp(-D ./ max(D(:))); W(1:n1:end) 0; % 去掉自环 d sum(W, 2); L diag(d) - W; % 拉普拉斯矩阵 [V, ~] eigs(L, k, smallestabs); cluster_idx kmeans(V, k, Replicates, 20);集群电压协调控制的核心代码段如下% 集群电压偏差判断 dV U_meas - U_ref; if abs(mean(dV(cluster))) deadband Q_cluster Kp * mean(dV(cluster)); Q_cluster max(min(Q_cluster, cluster_cap), -cluster_cap); % 按无功裕度分配给各逆变器 cap_i sqrt(S_max_i.^2 - P_i.^2) - Q_i_now; cap_i max(cap_i, 0); Q_ref_i Q_i_now Q_cluster * cap_i / sum(cap_i); end关键参数的设置我一般给一组参考范围潮流收敛精度 1e-6最大迭代次数 50下垂系数 k_q 取 0.05 到 0.2电压死区取 ±0.005 p.u.就地控制周期 0.1 到 0.5 秒集群协调控制周期 1 到 5 秒。死区太小会让逆变器频繁调节死区太大则控制效果不明显建议扫几个典型场景后再定。4.3 从仿真结果到论文图输出哪些指标代码跑通之后真正决定论文质量的是结果指标怎么组织。我至少会输出四类结果第一类是电压分布曲线控制前后同一时刻的馈线电压剖面放在一张图上对比这是最直观的“有没有效果”的证据。第二类是集群划分拓扑图用不同颜色标示不同集群的节点和支路配合模块度数值说明划分合理性。第三类是控制效果指标表包括电压最大值、电压偏差、越限持续时间、网损、逆变器动作次数。第四类是典型场景仿真曲线展示从电压越限到集群控制介入再到电压恢复的动态过程。指标无控制仅就地控制集群协调控制电压最大值(p.u.)1.0721.0421.021电压越限时长(min)58123网损(kWh)320297275逆变器平均动作次数04523表格里的数值是按典型场景仿真得到的示例不同算例会变化但趋势通常是一致的集群协调控制能在就地控制基础上进一步压低电压最大值、减少越限时长和逆变器动作次数。4.4 关于 Matlab 选型和求解器的一些经验选择 Matlab 做这个项目主要看中它的矩阵运算能力和电力系统工具箱。数据组织、矩阵索引、可视化都比较顺手代码可读性也好。对于小规模算例二次规划用 quadprog 就够了算例节点多、约束复杂时可以接 Yalmip 写优化模型再调用外部求解器。需要注意的是Matlab 的脚本文件如果跑得太慢优先检查是不是在循环里反复算潮流而不是马上换求解器。常见的提速手段是把灵敏度矩阵提前算好、把控制周期内的潮流增量更新做成函数句柄、把不需要保存的中间变量清掉。5. 仿真里最容易踩的坑以及我的处理习惯5.1 “一个巨型集群”问题用 Louvain 算法做集群划分经常跑出来一个特别大的集群把一半节点都包进去其他集群零零散散。原因是模块度最大化有时会让大集群合并占便宜但这个划分结果对电压控制非常不友好——大集群内部通信和协调压力重新变大了。我的解决办法是改用谱聚类并直接指定集群数量 k划分之后再检查每个集群的节点数如果某个集群过大就在相似度矩阵里增加规模均衡惩罚项把超大集群强制拆开。5.2 灵敏度矩阵随运行点漂移不能一劳永逸电压-无功灵敏度本质上是潮流方程在某个运行点附近的局部线性化结果。光伏出力从 20% 变到 100%同样一个无功调节量引起的电压变化幅值明显不同。如果只用单一运行点算灵敏度矩阵做集群划分换到另一个场景可能就不准。我建议先做几个典型场景的灵敏度矩阵再按概率加权得到综合矩阵。控制阶段不需要实时更新整个灵敏度矩阵但要留出在线修正的接口每隔一段时间用最新潮流结果更新一次至少保证划分结果在主要运行方式下都成立。5.3 逆变器视在功率容量约束最容易被忽略这是我在调试过程中印象最深的一个坑。逆变器的无功调节能力不是无限大受视在功率约束限制S_i² ≥ P_i² Q_i²光伏满发时 P 接近 S_maxQ_i 的调节范围变得非常小甚至接近零。但恰恰是光伏满发的时候系统电压最高、最需要无功支撑。如果不把这个约束建模进去集群协调控制算出来的无功指令超出逆变器容量执行时必然打折扣仿真结果和实际工程对不上。解决办法就是在分配公式里用剩余无功裕度 CapQ_i 做加权同时在优化模型里显式加入容量约束。5.4 下垂系数和死区参数的整定就地 Q(U) 下垂控制有两个参数要小心下垂系数 k_q 和死区。k_q 太大逆变器响应猛容易和其他设备形成振荡k_q 太小电压越限了却拉不回来。死区太小频率波动稍微大一点所有逆变器都在反复调无功死区太大控制又形同虚设。我的处理习惯是先做参数扫描固定负荷和光伏场景k_q 在 0.02 到 0.3 之间变化观察电压最大值、网损、调节次数几个指标选一个折中值最好不要用单一固定值跑到所有场景。5.5 高阻线路下有功削减的补充作用配电网线路 R/X 比通常比输电网高尤其是电缆和长距离架空线。无功调压到后期会变得“力不从心”因为线路电阻太大无功传输本身也带来压降。这种情况下如果集群内所有可调无功容量已经用完、电压仍然越限就需要考虑光伏有功削减。我在控制策略里把有功削减放在最后一级优先级比无功调节低并且做了轮换机制避免同一个光伏电站一直被削减。仿真中还要评估削减电量带来的收益损失这部分在论文里可以作为经济性对比的论据。整套代码和策略我前后迭代了多个版本最深的一个体会是集群划分不是“算完就结束”的独立步骤它和控制策略是一体的。划分结果好不好最终要看控制仿真里的电压改善效果只看模块度数值没有说服力。建议你先把潮流算稳再碰聚类和优化把“场景—划分—控制—评估”这条链路完整跑通再去优化每个环节的算法细节。工程上最有价值的往往不是某个高深算法而是整个流程里每个环节都经得起推敲。