近年来我在做分布式光伏并网仿真时,最常被问到的一个问题就是:一堆光伏接入10kV馈线之后,分布式光伏出力一上来,节点电压就往上飙,尤其馈线末端到中午甚至能冲到1.07p.u.以上,到底该怎么压住?单纯调有载调压变压器分接头,动作次数扛不住;让光伏逆变器自己限功率,又浪费发电量。后来我转向了集群划分加集群电压协调控制的思路,实践下来发现这条路既能压住电压越限,又能少牺牲光伏出力,还兼顾了控制器的可实施性。这篇博文就把这套方法的原理、数学模型和Matlab实现完整地梳理一遍,核心围绕配电网集群划分、基于电压灵敏度的无功电压控制以及仿真代码结构展开,适合正在做配电网方向课题的研究生、做分布式光伏接入方案设计的工程师,以及想用Matlab快速搭建电压控制算例的同学参考。
1. 高比例分布式光伏接入后,电压问题为什么绕不开
1.1 从单电源辐射网到多电源网络的潮流之变
传统配电网是单电源辐射状结构,潮流方向从变电站母线单向流向负荷节点,电压沿馈线逐渐降低。接入分布式光伏之后,情况完全不同——光伏电站本质上是接在负荷侧的电源,当中午光照强、负荷水平又偏低时,馈线中段和末端的注入功率会超过本地负荷需求,剩余功率开始向变电站方向倒送。
倒送功率在馈线阻抗上产生的电压降落方向是反的,顺着线路往末端走,电压不是降低而是抬升。我用一个简单的两节点模型说明得更直观:设节点i为变电站出口,节点j为光伏接入点,线路阻抗为R+jX,流过的功率为P+jQ。光伏出力使得节点j向节点i倒送功率,即线路上的P取负值,此时节点j的电压幅值U_j约等于U_i减去(R·P + X·Q)/U_j。当P为负,这个修正量变成正的,U_j就会高于U_i。
这个现象在辐射状配电网中尤其明显,因为末端路径阻抗大,同样的倒送功率引起的电压抬升更严重。以IEEE 33节点系统为例,如果在节点18(末端)接入2MW光伏,在轻负荷工况下节点18电压从正常的0.95p.u.水平直接抬到1.06p.u.以上,已经触碰了电压偏差上限。
从机理上看,分布式光伏对电压的影响程度取决于三个变量:
- 光伏出力与本地负荷的匹配程度:出力远大于负荷时,倒送功率越大,抬压越明显。
- 接入点距离变电站的电气距离:越靠近馈线末端,对电压抬升越“敏感”。
- 馈线阻抗特性:线路越长、R/X比越大,有功倒送造成的电压抬升越显著。
只有把这三点落实到具体的节点电压灵敏度上,后面的集群划分才有依据。所谓集群划分,本质上就是根据各节点之间的电压耦合特性,把强相关的节点划分到同一个控制集群里,后续在这个集群内部进行无功电压协调。
在Matlab仿真的初始阶段,我通常的做法是先用牛顿-拉夫逊法跑一遍含光伏的潮流,然后计算光伏出力变化前后各节点电压的变化量,直接用这个变化量构造节点电压对光伏出力的灵敏度矩阵。这个矩阵后面不仅是集群划分的输入,也是电压控制策略设计的重要参考。
1.2 电压越限的三个典型场景
很多人以为光伏引起的电压越限只发生在中午高光照时段,实际仿真跑下来发现主要有三类场景:
第一类是正午强光轻负荷场景。夏季中午光伏出力接近额定值,而商业或居民负荷处于低谷,倒送功率最大,电压顶峰。这是最经典的越限场景,也是控制策略首先要解决的工况。
第二类是光伏出力骤变场景。比如一片云快速飘过大面积光伏阵列,出力在几分钟内从80%跌到20%,或者从20%回升到80%。这种情况下,有载调压变压器分接头和电容器组根本来不及响应,电压短时间内剧烈波动,甚至出现闪变。
第三类是馈线末端多个光伏叠加的场景。分布式光伏往往不是单点接入,而是沿着馈线分散接入多点。越靠近末端,多个光伏出力的叠加效应越强,即使单个光伏容量不大,叠加后末端电压仍然可能越限。
我在做仿真时,一般会构造一个“晴空+轻负荷”的极端场景作为电压控制策略的校验工况:光伏出力按额定功率设定,负荷取典型日负荷曲线的谷值,加上馈线末端多个接入点同时满发,这样如果控制策略能把电压压回0.95~1.05p.u.范围内,正常场景基本就稳了。这种做法可以帮你提前发现策略的边界能力,而不是在典型日仿真中麻痹自己。
1.3 传统调压手段的局限
传统配电网电压控制主要依赖三类设备:有载调压变压器(OLTC)、并联电容器组和线路调压器。这三类设备在含高比例分布式光伏的配电网中都有明显局限。
OLTC通过改变分接头位置来调节变电站母线电压,但响应速度以分钟级计,且频繁动作会显著缩短设备寿命。光伏出力波动是秒级到分钟级的,OLTC很难跟踪。电容器组只能分组投切,调节是离散的,而且投切瞬间会产生涌流和暂态冲击。如果光伏出力持续波动,电容器组可能一天动作几十次,这在实际运行中是不可接受的。
更关键的问题是,OLTC和电容器组的调节都基于变电站侧的测量信息,对馈线末端局部电压越限的感知能力非常有限。末端电压越限了,变电站母线电压还是正常的,这时候统一调OLTC不仅解决不了末端问题,还可能让其他节点电压跟着抬升。
所以,高比例分布式光伏接入场景下的电压控制,必须依托电力电子器件——也就是光伏逆变器自身具备的无功调节能力。逆变器响应速度快,控制精度高,而且每个光伏接入点本身就位于电压问题最突出的位置。但分布式光伏数量众多,如果每个逆变器都独立根据本地电压自行调节,又会出现无功功率在馈线之间流动、某些逆变器无功出尽而另一些还很充裕等不协调的问题。
这就引出了集群电压协调控制的基本逻辑:先把配电网划分成若干个集群,集群内部通过逆变器协调调节电压,尽量减少集群之间的无功交换,实现局部电压问题就地解决,集群之间的不匹配再通过上层协调处理。基于Matlab做这套仿真,核心工作就落在两件事上:一是高效准确的集群划分,二是可落地的集群间-集群内双层电压控制策略。
2. 集群划分的本质:把全网电压控制拆成可管理的子问题
2.1 为什么不能直接做全网点对点控制
有人可能想,既然逆变器响应快,干脆所有光伏逆变器都参与全网电压调节,每个逆变器根据全局电压信息来分配无功功率,一台计算机统一求解不就行了?理论上确实可以做全局最优控制,但真实系统中很难落地。
首先是通信和计算压力。一个中等规模的配电网可能有几百个分布式光伏接入点,每个都上报电压、有功、无功等信息,控制中心还要求解一个包含数百个优化变量的优化问题,通信时延和控制周期很难满足电压快速调节的需求。其次是控制可靠性。如果中央控制器故障或者通信链路中断,整个电压控制系统就瘫痪了。第三是区域解耦问题。距离很远的两个节点之间的电气耦合本来就弱,把它们放在同一个全局优化问题里,既增加计算负担,又会让无功功率跨区域长距离流动,徒增网损。
集群划分的价值就是把这些数不清的节点划分成若干个内部强耦合、外部弱耦合的集群。每个集群内通过本地控制器自主协调,只有集群之间的边界信息或者少数协调变量才需要上传到上层。这样一来,通信需求大幅降低,控制响应速度提高,而且单个集群故障不会导致全网失控,可靠性和可扩展性都更好。
实际工程中,我倾向于把集群在线路层面上理解成一个“电气区域”:同一集群内的节点电压变化高度相关,调节集群内任意一个光伏逆变器的无功功率,对集群内所有节点的电压都有明显影响;而对集群外节点的影响则小得多。这个特性正是集群电压协调控制的基础。
2.2 电气距离与电压灵敏度
要定量刻画“电气耦合强度”,最常用的工具是电压-无功灵敏度。在潮流计算收敛之后,可以得到系统的雅可比矩阵,通过求逆就能得到电压幅值对节点注入无功功率的灵敏度矩阵S_vq。S_vq中第i行第j列的元素表示节点j注入单位无功功率时节点i电压的变化量。这个矩阵天然包含了网络拓扑、线路参数和运行工况信息。
基于S_vq可以定义两个节点之间的电气距离。核心思想是:如果节点m的无功注入对节点n的电压影响越大,那么m和n之间的电气距离就越近。形式化地讲,节点m和n之间的电气距离可以定义为:
D(m,n) = S_vq(m,m) + S_vq(n,n) - S_vq(m,n) - S_vq(n,m)。当m和n之间的电压耦合强时,S_vq(m,n)和S_vq(n,m)数值较大,D值较小。当m和n之间几乎没有耦合时,D值大,说明它们电气上相距较远。
我用这个电气距离矩阵作为聚类算法的输入,把节点划分到若干个集群中,确保集群内部节点之间的电气距离尽量小,而不同集群之间的电气距离尽量大。
在Matlab中计算S_vq矩阵时有个细节值得注意。用Matpower的Newton-Raphson潮流计算能直接得到雅可比矩阵,但大多数人只用了优化结果而忽略了雅可比矩阵的输出。实际上只需要在runpf的输出结构体中提取雅可比矩阵相关的字段,再进行一次矩阵求逆,就能得到完整的灵敏度信息。如果自己写前推回代潮流,也可以通过对节点电压方程做扰动法求数值灵敏度——在节点j注入一个小无功增量ΔQ_j,重新计算潮流,观察各节点电压变化量ΔV_i,ΔV_i/ΔQ_j就是对应的灵敏度系数。扰动法实现简单,但要注意扰动步长不能太大,否则线性化误差会显著上升。我在仿真时用Matpower的解析雅可比方法,同时用扰动法做交叉验证,两种方法得到的灵敏度矩阵误差在0.5%以内,说明解析解是可靠的。
2.3 集群划分的目标与评价指标
集群划分本质上是组合优化问题,但实际中通常用聚类算法近似求解。评价划分效果好坏的指标有几个:
第一个指标是模块度函数,这是社区发现领域常用的指标。模块度衡量的是集群内部边的密度相对于随机网络的差异程度,数值越大表示集群结构越明显。把节点间的“边权重”设为电气距离的倒数,模块度就能直接反映电压耦合的强弱结构。
第二个指标是无功平衡度。每个集群内部的光伏无功调节能力和无功需求如果能基本自平衡,就不需要频繁地从其他集群调无功,控制效率最高。用集群内可调无功容量与集群内无功需求的比值来衡量,越接近1越好。
第三个指标是集群间耦合度。划分完成后,集群之间的电压灵敏度平均值应该明显小于集群内部。这个指标可以直接验证划分结果的合理性。我在仿真时通常的做法是计算划分前后“集群间最大电压灵敏度/集群内平均电压灵敏度”的比值,一般要求小于0.2。
还有一点容易被忽略:集群划分不是一次算完就永远固定了。随着光伏出力变化和负荷水平变化,电网运行工况会变,S_vq矩阵也会变,最优划分方案可能随之变化。但实际控制中集群结构又不能频繁调整,否则控制器的参数整定和通信配置都要跟着改动,工程上不可行。我的做法是对典型工况(冬夏、轻重负荷、光伏大发/小发)分别计算S_vq矩阵,然后选择在所有工况下都表现较好的一种划分作为固定方案。这种“保守最优”的做法牺牲了一部分极端工况下的最优性,换来了控制系统的实际可行性。在做Matlab仿真时,可以直接把不同工况下的灵敏度矩阵放在同一个脚本里循环计算,最后取综合指标最优的方案。
3. 集群划分的Matlab实现:谱聚类与改进K-means
3.1 数据准备:从Matpower算例到灵敏度矩阵
集群划分的输入数据准备是第一步,也是最容易出错的一步。我强烈建议直接用Matpower自带的IEEE标准算例做基础,改造为含分布式光伏的配电网模型。以IEEE 33节点系统为例,常规做法是把33节点标准辐射状配电网的基准容量设为10MVA,基准电压设为12.66kV,然后在想要接入光伏的位置增加PV节点或者PQ节点。
关于光伏节点的建模,我推荐不要直接用简单PQ负载模型(把光伏当负的P和负的Q),因为这样无法体现逆变器的无功调节能力。更合理的做法是:在光伏接入节点定义可控无功源,有功出力按照光照曲线给定,无功出力作为控制变量,受逆变器容量约束。在Matpower中,可以把光伏出力节点建模为可调的PQ节点,通过在算例数据文件中将对应bus的Pd和Qd设为负值,同时在后续控制策略中用一组额外的变量来接收逆变器的无功设定值。
构建灵敏度矩阵的关键是潮流计算。执行runpf后,从结果结构体中提取雅可比矩阵。有一点要注意——牛顿法的收敛性对初值敏感,含光伏的配电网在光伏出力较大时,如果初值给得太差,潮流可能不收敛。建议在runpf之前手动设置一个合理的初始电压幅值,比如把所有节点电压初值设为1.0p.u.,相位设为0,这比用默认的平启动初值更可靠。
灵敏度矩阵构建完之后,我习惯先做一个可视化检查:画出节点之间电气距离的热力图。如果电气距离矩阵呈现清晰的块状结构,说明这个网络确实具有天然的集群特性,后续聚类意义明确。如果热力图是均匀的,说明电气耦合在整个网络中分布均匀,强行划分集群意义不大,这时要重新审视控制策略的架构。
3.2 谱聚类的实现步骤
谱聚类是集群划分中最常用的算法之一,因为它不需要对数据形状做假设,而且能很好地处理基于图结构的相似度矩阵。聚类过程分五步:
第一步,构建相似度矩阵W。W(i,j)取节点i和j之间电气距离的倒数,或者用高斯核函数exp(-D(i,j)²/2σ²)做非线性变换,σ是带宽参数。用高斯核的好处是能调节相似度的衰减速度,σ取小值时只有电气距离很近的节点才被认为是相似的,聚类结果会更精细。
第二步,构建度矩阵D(对角线元素为W每行之和)并计算拉普拉斯矩阵L。常用的是归一化拉普拉斯矩阵L_sym = D^(-1/2) L D^(-1/2),用归一化版本的好处是对节点度分布不均不敏感,聚类结果更稳定。
第三步,计算L_sym的特征值和特征向量,取最小的K个特征值对应的特征向量,排列成一个N×K的矩阵。这些特征向量包含了节点在图结构中的低维嵌入信息,可以把它们理解为一种非线性降维后的节点坐标。
第四步,把这个N×K矩阵的每一行当成一个新样本,用K-means算法对N个样本聚成K类。
第五步,将聚类结果映射回原始节点,每个节点归属到对应类别,形成集群划分结果。
这个流程在Matlab里写起来很直接,核心代码就是把特征值分解和K-means串联起来。关键在于参数K的选择,下面单独说。
3.3 聚类数K怎么定
聚类数K是谱聚类中最棘手的参数。K太小,每个集群内部电气耦合不够紧密,控制协调效果有限;K太大,集群数量多,每个集群内可调资源不足,而且集群间协调变量增加,通信压力变大。
工程上我常用的方法是肘部法则。对K从2到10分别做一次聚类,计算每个K值对应的模块度Q或者聚类综合指标(如戴维斯-布尔丁指数),画出指标随K变化的曲线。曲线中通常会出现一个拐点——在拐点之前,增大K带来显著的指标提升,在拐点之后提升变缓,甚至开始下降。拐点对应的K就是合理的集群数。
需要注意的是,单纯依赖肘部法则有时候不明显,曲线上可能没有明显的拐点。这时候要结合工程约束来选择:一是每个集群内至少要有2~3个可调分布式光伏,否则集群内协调空间太小;二是集群数量要符合控制器的通信能力限制;三是不同集群的可调无功容量尽量均衡。我一般会列出K从3到6的候选方案,分别以“集群间耦合强度最小+集群内无功容量方差最小”作为综合目标来选择。
另外还有一个实践技巧:聚类结果对初始簇心敏感,直接跑一次K-means可能得到局部最优解。我建议用k-means++初始化,并重复20~30次随机初始化,选取目标函数最小的结果。虽然计算量增加了一点,但对最终划分质量的提升非常明显。在Matlab中可以用内置的kmeans函数,设置Replicates参数为30,Algorithm为"kmeans++"即可。
4. 集群电压协调控制策略:双层优化怎么设计
4.1 上层:集群间功率协调
集群划分完成后,电压控制策略就顺理成章地采用双层架构。上层控制的时间尺度较长,大约每隔5~15分钟计算一次,负责集群之间的协调。下层控制的时间尺度短,通常在秒级到分钟级,负责集群内部光伏逆变器的实时无功调节。
上层协调的核心任务是确定每个集群的边界无功交换量。如果集群A内部无功不足,不能靠内部调节解决电压问题,就需要从相邻集群或者电网侧吸收无功;反之,如果集群A内部无功过剩,可以向外输送无功。上层控制器基于全网模型和集群划分信息,求解一个以全网电压偏差最小为目标的优化问题,决策变量是各集群的边界无功功率设定值。
在Matlab仿真实现中,上层优化可以用YALMIP工具箱配合fmincon求解器来做。目标函数包含两项:全网节点电压偏差的平方和,以及集群间无功交换量的惩罚项。第二项特别重要——如果不对集群间无功交换加以惩罚,上层优化可能会让无功功率在网络中长距离流动,虽然也能把电压压住,但网损会大幅增加。所以我在目标函数中给集群间无功交换量乘以一个权重系数,权重一般取电压偏差权重的0.1~0.5倍,具体需要通过仿真实验来标定。
上层优化的约束条件包括:每个集群边界无功交换量的上下限(取决于集群内总可调无功容量)、变电站母线电压可调范围、以及光伏逆变器总无功出力的容量约束。求解完成后,每个集群得到一个无功功率目标值,这个目标值作为下层控制的输入。
4.2 下层:集群内逆变器无功分配
下层控制的输入是集群的无功功率需求总量,任务是把这个总量合理分配给集群内的各个光伏逆变器。分配策略直接影响控制效果、网损和逆变器利用率,我认为这是整个控制策略设计中最需要打磨的环节。
最简单的分配策略是等比例分配,即各逆变器按照自身无功容量占比分担集群无功需求。这种方法实现简单,但没有考虑各逆变器对集群内关键节点电压的灵敏度差异,可能造成无功资源浪费。
我推荐用灵敏度加权分配策略:对于电压越限最严重的节点,把更多的无功分配任务交给对该节点电压灵敏度最高的逆变器。具体流程是:检测集群内各节点电压,找到电压偏差最大的节点,记为关键节点k;计算集群内各逆变器对节点k的电压灵敏度S_vq(i,k);按灵敏度归一化后的比例分配无功需求。
这种策略的优势在于,控制指令能够优先利用“效果好”的逆变器,减少总无功需求和网损。缺点是灵敏度会随工况变化,需要周期更新。在仿真中,我每隔一个控制周期重新计算一次灵敏度矩阵,确保分配策略始终有效。
还有一个问题是无功功率在有功出力较高的时段可能容量受限。光伏逆变器的视在功率容量是有限的,设逆变器视在功率上限为S_max,当前有功出力为P,则可用的最大无功容量为sqrt(S_max² - P²)。中午光伏满发时,P接近S_max,可调无功容量很小。如果控制策略不感知这一点,分配的指令可能超过逆变器物理能力,导致控制效果变差。
处理这个问题有两种思路。一是适当弃光——在极端电压越限工况下,允许光伏逆变器小幅降低有功出力来腾出无功容量,以电压合格为首要目标。二是在逆变器容量设计时预留无功余量,比如逆变器容量选为光伏组件容量的1.1倍,保证有一定无功调节空间。具体选哪种要根据工程实际来权衡,我建议在Matlab仿真中把两种情况都建出来,对比观察弃光量和调节效果。
4.3 目标函数与约束条件的取舍
设计双层优化时,目标函数和约束条件的取舍是决定结果质量的关键。我常用的上层目标函数是:
min Σ(V_i - V_ref)² + α·Σ(Q_cluster_exchange)²
其中V_i是节点电压,V_ref是参考电压(通常取1.0p.u.),Q_cluster_exchange是集群间无功交换量,α是权重系数。第一项控制电压质量,第二项减少集群间的无功流动。用平方项的好处是自然惩罚大幅度偏差,比绝对值项更平滑,对优化算法更友好。
约束条件方面,最重要的是三类:
第一类是电压约束,各节点电压保持在0.95~1.05p.u.范围内(如果考虑国标对20kV及以下三相供电电压偏差为标称电压的±7%,可以放宽到0.93~1.07p.u.,但工程上推荐按0.95~1.05p.u.控制)。
第二类是逆变器容量约束,Q_inverter_min ≤ Q_inverter ≤ Q_inverter_max,上下限由当前有功出力和视在功率上限决定。
第三类是OLTC动作次数约束,一个控制周期内分接头动作次数不超过设定值,避免设备频繁动作。
在Matlab中用fmincon求解这个带约束非线性优化问题时,我常常遇到求解速度慢或者不收敛的情况。比较实用的替代方案是:把目标函数中的约束用罚函数法融入目标函数,变成无约束问题再求解。罚函数系数要根据仿真中电压越限的严重程度自适应调整,如果迭代几次后仍有节点电压越限,就把罚系数提高。这样做虽然得到的是近似最优解,但求解速度提升好几倍,而且对于电压控制这类工程问题,一个“足够好”的解完全够用了。
5. Matlab仿真框架搭建与核心代码实现
5.1 整体仿真流程
整套仿真的流程我建议按这个顺序组织,每一步的输出都是下一步的输入,逻辑清晰且方便调试:
第一步,加载配电网算例。用Matpower读取IEEE 33节点或者IEEE 123节点的系统数据,在指定节点接入分布式光伏,设置光伏容量。
第二步,定义时序输入数据。生成24小时的光照强度曲线和负荷曲线。光照曲线用典型正弦型曲线,负荷曲线根据系统原有负荷数据按比例缩放。
第三步,计算灵敏度矩阵。循环各时刻的潮流结果,提取雅可比矩阵,求逆得到S_vq矩阵。
第四步,集群划分。基于综合工况的平均灵敏度矩阵做谱聚类,输出集群划分结果。
第五步,双层电压控制。对每个时刻依次执行上层协调优化和下层逆变器无功分配,更新逆变器无功出力。
第六步,验证。重新计算潮流,检查各节点电压是否在允许范围内,输出控制前后电压曲线、光伏出力曲线、逆变器无功出力曲线等。
第七步,结果分析。统计电压合格率、总发电量、网损等指标,对比无控制、等比例分配控制和灵敏度加权控制三种方案的结果。
用代码表示这个主循环,结构大致如下:
% 主仿真脚本框架 mpc = loadcase('case33bw'); % 加载IEEE 33节点算例 mpc = addPV(mpc, pvBus, pvCapacity); % 在指定节点接入光伏 T = 24 * 60 / 15; % 仿真步数,每15分钟一个点 voltageResult = zeros(T, length(mpc.bus)); for t = 1:T % 更新光伏出力和负荷 mpc.bus(:, 3) = loadProfile(t) * baseLoad(:, 3); mpc.bus(:, 4) = loadProfile(t) * baseLoad(:, 4); pvOutput = solarProfile(t) * pvCapacity; % 潮流计算 result = runpf(mpc); % 电压控制策略 [qSetpoint, clusterInfo] = voltageControl(result, sensitivityMatrix, clusterResult); % 更新逆变器无功出力并重新潮流 mpc = updateReactivePower(mpc, qSetpoint); result = runpf(mpc); % 记录结果 voltageResult(t, :) = result.bus(:, 8); end这个主循环的思路适用于大部分配电网电压控制仿真场景,核心是把“潮流计算→电压判断→控制决策→更新参数→再潮流”这个闭环跑通。
5.2 光伏出力与负荷曲线建模
光伏出力曲线建模是很多初学者容易出问题的地方。直接给光伏设定一个恒定出力值去仿真当然简单,但这样的结果没有说服力,因为电压越限最严重的工况恰恰出现在光伏快速变化和极端出力的时候。
我推荐用两步法建模:先建立理想光照曲线,再乘上光伏阵列效率和温度修正系数。理想光照曲线可以用Beta分布或者简单的高斯型函数近似,但更贴近实际的做法是直接用典型日实测光照数据。Matlab的PV Lib Toolbox可以去NASA SSE数据库下载典型气象年的光照数据,做研究仿真足够用了。
负荷曲线的建模逻辑也类似。标准的IEEE算例数据给出的往往是额定负荷,实际运行中负荷水平是时刻变化的。我一般把负荷曲线分成工作日和非工作日两类,分别设置不同的早晚高峰比例。在仿真中把算例的基础负荷数据乘以了一个随时间变化的系数lrss(t)。
有一个细节需要提前想清楚:负荷和光伏出力的相位关系。光伏出力集中在10:00到16:00,而典型配电网的负荷高峰通常在18:00到21:00(晚间照明和家电使用增多),所以中午时段往往是“光伏大发+负荷中低”的倒送工况。这个时间窗口就是电压越限最危险的时段,控制策略的验证重点要放在这段时间上。
5.3 集群划分核心代码示例
下面给出一段可以直接运行的谱聚类关键代码,这段代码以灵敏度矩阵S_vq为输入,输出集群划分标签:
function clusterLabels = spectralClustering(S_vq, K, sigma) % S_vq: NxN电压-无功灵敏度矩阵 % K: 集群数量 % sigma: 高斯核参数 N = size(S_vq, 1); % 1. 计算电气距离矩阵 D_mat = zeros(N, N); for i = 1:N for j = 1:N D_mat(i, j) = S_vq(i, i) + S_vq(j, j) - S_vq(i, j) - S_vq(j, i); end end % 2. 构建相似度矩阵(高斯核) W = exp(-D_mat.^2 / (2 * sigma^2)); W = W - eye(N); % 去掉自环 % 3. 计算归一化拉普拉斯矩阵 D_deg = diag(sum(W, 2)); L_sym = eye(N) - D_deg^(-0.5) * W * D_deg^(-0.5); % 4. 特征分解,取前K个最小特征值对应的特征向量 [V, ~] = eigs(L_sym, K, 'smallestabs'); % 5. K-means聚类 clusterLabels = kmeans(V, K, 'Replicates', 30, 'Algorithm', 'kmeans++'); end这段代码里比较关键的一步是第4步用eigs函数而不是eig函数。eigs只计算最小的K个特征值和特征向量,在大规模网络上能显著减少内存占用和计算时间。如果是300节点以内的配电网,直接用eig做全特征分解问题也不大,但养成用eigs的习惯对后面扩展更大规模算例有好处。
灵敏度加权分配策略的核心代码可以这样写:
function Q_setpoint = sensitivityWeightedAllocation(sensitivity, Q_total, pvCapacity) % sensitivity: 集群内各逆变器对关键节点的灵敏度向量 % Q_total: 集群总无功需求 % pvCapacity: 各逆变器可用无功容量向量 % 限制分配比例在0到1之间 weights = max(sensitivity, 0); weights = weights / sum(weights); % 按比例分配无功 Q_setpoint = weights * Q_total; % 容量约束截断 Q_max = sqrt(pvCapacity.VA_rating.^2 - pvCapacity.P_current.^2); Q_setpoint = max(min(Q_setpoint, Q_max), -Q_max); end这段代码用线性比例分配,胜在简单直观。如果你想追求更好的效果,可以把分配问题建成一个小的二次规划,目标函数是分配后的无功功率引起的网损最小化,用quadprog求解。在Matlab中二次规划的求解速度非常快,即便每15分钟调用一次,计算负担也可忽略不计。
6. 算例设置与结果分析思路
6.1 IEEE 33节点系统的改造
IEEE 33节点系统是配电网研究中最常用的算例。原始系统有33个节点、32条支路,基准电压12.66kV,总负荷约3.715MW+2.3MVar。我在做含分布式光伏仿真时,通常做以下改造:
光伏接入位置方面,我推荐选择3~5个点,分布在不同馈线长度上。一个典型的布置方案是:节点18接入800kW,节点22接入600kW,节点25接入500kW,节点33接入700kW。这样既覆盖了馈线末端,也覆盖了中段,能考察在不同电气距离下控制策略的效果。
在常规仿真中,我还会在光伏接入点的变压器阻抗上做一点修改,将光伏并网变压器的漏抗计入线路阻抗。别小看这个细节,变压器漏抗虽然只有几个百分点,但在高渗透率场景下对电压灵敏度的影响不容忽视,忽略这一点可能导致仿真结果偏乐观。
改造完成后,需要先跑一遍不含光伏的原始潮流,验证改造前后基态电压是否在三相平衡状态下稳定。然后接入光伏,跑一遍有光伏无控制的潮流,观察电压分布,这是后续所有对比分析的基准工况。
6.2 仿真结果怎么判断好坏
仿真结果的分析主要看三个维度:
第一个维度是电压质量。看所有节点在24小时内的电压曲线,重点关注最大电压和最小电压是否在允许范围内,以及电压波动幅度。统计指标可以用电压合格率——24小时内所有节点电压在0.95~1.05p.u.范围内的时间占比。
第二个维度是光伏利用水平。看控制策略实施后光伏有功出力被限制的比例。如果一种控制策略通过大量削减光伏出力来压电压,虽然电压合格了,但代价太大。评估指标可以是24小时内光伏总发电量占理论可发电量的比例。
第三个维度是控制代价。看逆变器无功出力的总变化量、动作次数和集群间无功交换量。这些指标反映了控制系统的运行成本和设备损耗。
我做对比分析时一般会设置四组方案:无控制、等比例分配控制、灵敏度加权分配控制、集中式全局优化控制(作为理想上限)。把四组方案的电压合格率、光伏利用率和控制代价汇总成一张表,就能清晰看出集群控制策略的性价比。通常在仿真结果中,灵敏度加权分配控制的各项指标非常接近全局优化控制,但计算时间和通信复杂度却低一个量级,验证了集群控制策略的工程价值。
6.3 参数敏感性:哪些参数最影响结果
仿真中有几个参数对结果影响很大,值得单独做敏感性分析。
第一个是光伏渗透率。把光伏总装机从系统峰值负荷的20%逐步提高到80%,观察电压越限的严重程度和控制策略的有效性。渗透率提高后,逆变器可用的无功容量也在增加,但电压问题更加突出,控制策略的调节压力更大。这个分析可以用来确定一个配电网能安全接纳的光伏容量的上限。
第二个是集群数量K。K取3、4、5、6分别跑一遍仿真,看电压合格率和控制代价的变化。一般来说,K增大到一定程度后,电压质量提升趋于饱和,而控制代价继续增加,这时就是K的合理取值上限。
第三个是控制周期。上层优化15分钟一次和5分钟一次的差异,主要体现在对光伏快速波动的响应能力上。控制周期太短,优化计算和通信压力大;周期太长,跟不上光伏波动。我建议做一组不同控制周期下电压质量的对比实验,比如5分钟、10分钟、15分钟三组,找出电压质量可接受的最长控制周期。
第四个是逆变器容量配置。把光伏逆变器的视在功率从光伏组件容量的1.0倍提高到1.2倍,观察无功调节空间增加后对电压质量的影响。这可以给实际工程中的逆变器选型提供定量参考。
这些敏感性分析看起来工作量很大,但在Matlab中都是循环脚本可以自动完成的。建议把参数扫描写成一个独立的参数分析函数,内部调用主仿真脚本,输出结果自动汇总成表格,这样分析效率会高很多。
7. 调试中踩过的坑与实用建议
7.1 潮流不收敛怎么定位
含分布式光伏的配电网潮流不收敛是仿真中最常见的问题。我在调试中总结了一套定位流程:
第一步,检查光伏节点建模是否正确。最容易出错的是把光伏节点设置成PV节点时,给定了不合理的无功功率上下限。比如光伏逆变器容量500kVA,但你把无功上限设成了800kVar,这就超过了物理能力,潮流自然不收敛。
第二步,检查线路参数和负荷数据是否匹配。有时候算例数据中阻抗的单位是欧姆/km,但你没有乘线路长度,导致阻抗过小,潮流计算出现数值问题。在Matpower中,支路数据格式比较严格,建议在一开始就确认单位。
第三步,调整迭代初值。在光伏高渗透率场景下,牛顿-拉夫逊法从平启动初值出发可能不收敛,可以先用前推回代法跑一遍得到近似解,再把这个近似解作为牛顿法的初值。两种算法结合使用,几乎能解决所有的收敛性问题。
第四步,检查灵敏度矩阵计算过程中的数值稳定性。灵敏度矩阵是从雅可比矩阵求逆得到的,如果雅可比矩阵条件数很大,求逆结果可能完全错误,进而导致集群划分结果离谱。出现这种情况时,可以给雅可比矩阵加一个小对角扰动(比如1e-8),提高数值稳定性,或者改用伪逆pinv。
7.2 集群划分结果不理想怎么调整
谱聚类结果有时候会不符合直觉——比如把电气上明显相连的一整条馈线切成了几段,或者把两个相距很远的节点分到了同一个集群。出现这种情况时,我的调试思路是:
首先检查相似度矩阵的构造。σ参数取太大的时候,高斯核函数的衰减很慢,几乎所有节点之间的相似度都接近1,聚类结果变得随机;σ太小时,只有直接相连的节点才被认为是相似的,聚类结果碎片化。通常σ取电气距离分布的标准差量级比较合适,可以快速试几个值看聚类结果的变化趋势。
其次检查是否需要对灵敏度矩阵做归一化处理。不同节点的自灵敏度S_vq(i,i)差异很大,如果不归一化,自灵敏度高的节点会在聚类中占据主导地位。我通常先对灵敏度矩阵的每一行做归一化,转换为节点间的相对影响程度,再构造相似度矩阵。
最后可以尝试换成层次聚类。谱聚类在节点数较少时结果对参数敏感,而层次聚类不需要预设K值(通过树状图的切割高度决定),有时反而更稳定。Matlab中直接用linkage和cluster函数就能实现,对比两种算法的结果,如果差异较大再仔细排查原因。
7.3 日仿真的速度优化
24小时仿真如果步长设为1分钟,那就是1440个步长,每个步长内还要跑多次潮流和控制优化,仿真时间可能长达几十分钟甚至几个小时。这时候有几个优化技巧:
第一,减小不必要的潮流计算次数。电压控制策略执行后,如果电压变化非常小,可以不必重新跑全潮流,而是用灵敏度矩阵近似估计控制后的电压。只有当估计结果接近电压边界时才重新跑精确潮流。这个近似处理能减少三分之二以上的潮流计算次数。
第二,复用灵敏度矩阵。如果工况变化不大,灵敏度矩阵的数值变化很小。可以设定一个触发条件——当光伏出力或负荷变化超过5%时才更新灵敏度矩阵,否则沿用上一次的矩阵。这样显著减少矩阵求逆的计算开销。
第三,用并行计算加速。把24小时分成多个区间,每个区间独立仿真,最后合并结果。在Matlab中可以用parfor替换主循环的for,只要注意每个迭代内部不依赖上一次迭代的状态变量即可。
第四,考虑把仿真步长从1分钟改为15分钟做初步验证,确认控制策略逻辑正确后再用更小步长跑精细仿真。先用粗步长排查逻辑和参数错误,再细化提高精度,能极大提升调试效率。
写在最后
仿真做到后面我发现,集群划分和集群电压协调控制这套方法在Matlab中的落地难点并不在算法本身,而在于对配电网物理特性的理解——灵敏度矩阵怎么算准、集群怎么划有意义、控制策略怎么跟配电网的实际运行约束匹配,每一步都需要反复调试和验证。建议大家在跑通基础流程之后,重点做一件事:把光伏渗透率提到一个较高的水平(比如60%以上),看看你的控制策略还能不能压住电压。如果压不住,是集群划分不合理导致协调困难,还是逆变器无功容量不足导致调节能力不够,逐层排查。这种压力测试比反复优化正常场景下的电压偏差更有价值,因为工程中真正要求你解决的就是极端工况下的问题。