☰
含分布式电源的配电网三相潮流计算:前推回代法的程序实现与调试
2026/10/18 7:24:17 网站建设 项目流程

做配电网规划或者台区电压治理的朋友应该都有过这种经历:明明监测系统里某一相电压中午已经顶到1.06 p.u.,中性线电流也不小,但你用传统单相潮流算一遍,结果却是“一切正常”。问题不在数据,而在于单相潮流从建模那一刻就把三相系统默认为完全平衡的,单相负荷、单相光伏全都被平均到一相模型里,不平衡信息在源头上就被抹掉了。所以我做了这个项目:用前推回代法编写含分布式电源的三相潮流计算程序,把A/B/C三相单独建模,将DG作为注入源一并处理,最终得到每相节点的电压、支路功率、线路损耗和中性线电流。这篇文章就把这个程序的原理、建模方式、关键代码和调试过程完整记录下来,给同样在跟三相不平衡较劲的人做个参考。

1. 为什么单相潮流在配电网里经常“算不准”:三相不平衡才是常态

1.1 单相潮流模型的两个隐藏假设

单相潮流作为电力系统分析的标准工具,本身没有任何问题,它在输电网里非常好用。但把它直接拿来分析低压/中压配电网时,必须接受两个前提假设:一是全网三相完全对称,二是所有负荷可以等效为三相对称负荷。这两个假设在实际台区里几乎都不成立。

配电网的负荷绝大多数是单相负荷,居民入户就是一根火线一根零线,三相的接入完全随机。有的台区A相接了密集的空调负荷,C相接了照明和充电桩,B相可能只挂了少量用户。与此类似的是户用光伏,大量逆变器也是单相并网,而且往往集中在午间出力,与负荷曲线并不同步。再加上线路本身可能是两相供电,或者导线排列不对称导致三相线路参数不一致,整个网络的天生状态就是不均衡的。

单相潮流面对这种系统时会怎么做?它把这些单相负荷“折算”成一个三相平衡负荷,比如A相实际接了150kW单相负荷,模型里就近似成三相各50kW。电压抬升和电压跌落也都被均摊了。结果是,你用单相潮流看一个B相实际过压的台区,算出来每相都是合格的,因为过压的那一相已经被其他两相“平均”掉了。

1.2 分布式电源让三相不平衡的后果进一步放大

不是所有不平衡都叫“严重不平衡”,配电网长期在一定程度的不平衡下运行,很多设备也扛得住。但分布式电源接入以后,情况发生了本质变化。

第一,DG出力具有反调峰特性。中午光伏大发时段恰好是负荷低谷,功率流向不再是单纯的从变电站到末端,而是台区内部多个点同时注入,局部可能形成逆潮流。如果逆潮流出现在某一相,该相电压抬升的幅度会比三相对称注入大得多。第二,单相光伏的接入位置往往偏向末端,末端电压本来就对潮流变化最敏感,一个10kW的单相逆变器在末端接入,A相电压可能直接抬高2%到3%,这种局部效应在三相潮流里才看得见。第三,三相不平衡加剧后,中性线电流增大、配电变压器局部过热、继电保护灵敏度改变,这些问题单相潮流完全无法回答。

所以做这个项目的第一个动机非常简单:要用一个能保留“相别信息”的潮流算法,而不是把所有数据压缩成单相以后再去算。

1.3 三相潮流到底要输出什么

三相潮流计算的本质是求解三相网络方程,输出电压和电流的有效值、相角,但它的核心价值在于给出的结果带相别维度。具体来说,每个节点要给出A/B/C三相各自的电压幅值和相角,每条支路要给出三相各自的流动功率和损耗,通过节点电压的负序/零序分量可以评估不平衡度,通过三相电流之和可以得到中性线电流。

如果只是要算“各相电压”,理论上可以把三相拆成三个单相独立计算,前提是相间没有耦合。但实际三相线路之间存在互阻抗,变压器的接线方式也会带来相间耦合,所以三相潮流必须按照相分量模型整体求解。这也是我在程序里第一个要处理的点:三相支路模型。

2. 前推回代法原理与三相网络的数据组织

2.1 为什么选前推回代而不是牛顿-拉夫逊

配电网潮流计算有两大流派。牛顿-拉夫逊法从输电网而来,计算能力强,处理环网和PV节点都方便,但每一步迭代要组装和分解雅可比矩阵,编程复杂,计算量随节点数增加很快。前推回代(Forward/Backward Sweep)则是专门为辐射状配电网设计的传统算法,不需要求导、不需要组装矩阵,结构简单、内存占用小、迭代次数少,在辐射状网络上非常可靠。

我的目标是面向实际台区和中压馈线,这些网络基本是辐射状结构。前推回代算法天然匹配这种结构,而且程序逻辑清晰,后面接DG、接三相模型都容易扩展。对于弱环网,可以额外加一个破环处理,不影响主体思路。对几百节点的台区模型,前推回代几十毫秒就能收敛,计算效率完全够用。

2.2 前推与回代:两个方向的迭代逻辑

前推回代的核心只有两步。

第一步是回代,也叫反向扫描(Backward Sweep)。假设全网各节点电压已知为额定值,从末端节点开始往变电站方向逐支路计算。对每个节点,先根据负荷功率和当前电压计算出该节点的注入电流,再加上DG对这里的反向注入(DG出力等效为负的负荷电流),得到节点净注入电流。然后按树的遍历顺序,从最末端往上游累加,得到每条支路从上游节点流向本支路的电流。这条支路电流等于该支路下方所有节点净注入电流之和。

第二步是前推,也叫正向扫描(Forward Sweep)。已知根节点(变电站出口)电压恒定为额定值,从根节点往末端方向逐支路计算。对每条支路,用上游节点电压减去该支路电流在支路阻抗上产生的压降,得到下游节点电压。因为电流刚才已经由下游往上游求出来了,这一步是一个纯粹的代数回代。

每完成一次“回代+前推”就完成了一轮迭代,比较本轮与上一轮所有节点电压的差值,如果最大偏差小于给定阈值就收敛。整个过程不需要任何矩阵求逆,这是前推回代在三相辐射网里依然高效的根本原因。

2.3 三相支路模型和中性线的处理

三相网络里支路压降不再是简单的标量乘标量,而是3×3的相阻抗矩阵乘以3×1的电流向量。相阻抗矩阵对角线是各相自阻抗,非对角线是相间互阻抗,它反映的是导线之间的电磁耦合。对于三相四线制系统的零序通流路径,最严谨的处理是建立包含中性线的4×4阻抗矩阵,但标准做法是用克朗化简(Kron reduction)把中性线消去,得到保留零序路径信息的等效3×3相阻抗矩阵。

在最开始实现时,我图省事直接忽略了互阻抗,只把每相当成独立线路,结果算出来和标准算例对比,偏差明显。原因很简单:三相导线同杆架设,互阻抗并不是可以忽略的小量。改成完整相阻抗矩阵之后,结果才与标准参考值对齐。所以这里提醒一句话:三相潮流程序里,线路参数必须给足9个量(自阻抗3个、互阻抗6个),别贪图简化。

2.4 拓扑分层:前推回代顺序的决定因素

前推回代能否正确执行,关键在于按照什么顺序访问节点。辐射状网络本质上是一棵树,直接从根节点做一次广度优先遍历(BFS),就能给每个节点标注层号和父节点编号。

计算流程就清楚了:回代时按层号从大到小遍历,先算最末端的层,再逐层上推;前推时按层号从小到大遍历,从根节点逐层向下更新电压。每个节点只需要知道它的父节点是谁、下游接哪些子节点,配合支路阻抗矩阵就能完成全部计算。这个分层预处理每份网络数据只做一次,潮流迭代时直接按层访问即可,效率很高。

3. 含分布式电源的三相潮流建模:PQ型、PI型、PV型节点的处理

3.1 分布式电源接入方式的定义

DG要进入潮流程序,第一步是明确它接到哪一相、容量多大、控制模式是什么。工程上常见的接入方式有三种:三相接入(一般是工商业电站或集中式电站)、单相接入(户用光伏占绝大多数)、两相接入(部分农网末端用户从两相线路取电)。程序里我给每个DG记录接入相别,单相DG只在对应相的节点注入电流,这才能反映真实的不平衡特性。

DG的稳态外特性决定了它在潮流方程里的节点类型。主流的有三类:PQ型、PI型、PV型,实际工程里还有更复杂的V-Q下垂,但用这三类模型已经能覆盖绝大多数涉网逆变器的稳态分析。

3.2 PQ型DG:作为负负荷的注入实现

PQ型DG最直观,有功P和无功Q给定,等效为一个负的负荷。在三相潮流里要注意一点:把DG作为“负负荷”处理只是简化写法,规范做法是用注入电流公式。节点净注入电流统一写成:

净注入电流 = 负荷电流 - DG注入电流

其中负荷电流由负荷功率和节点电压计算,DG注入电流由DG功率和该节点当前电压共轭相除得到。这样处理之后,不管DG在哪一相,都只是改变该相节点的净注入电流,回代过程不需要特殊分支判断。

程序实现上,我在每轮迭代进入回代之前,先遍历一遍DG列表,按当前电压刷新各DG注入电流,再和同一节点的三相负荷电流合并成净注入电流向量。整个结构很干净,后续想加新的DG类型也只改“DG电流计算”这一个函数。

3.3 PI型DG:电流幅值恒定的折算

PI型DG在配电网分析中不太常见,但有些带电流控制策略的DG适合用这个模型:有功P恒定、注入电流幅值I恒定。此时无功Q不是一个直接给定的量,而是由电压幅值U、有功P和电流幅值I耦合解出:Q = sqrt(3·U²·I² - P²)(以单相或折算到单相计算时做相应变换)。由于U在迭代中变化,Q也要每轮刷新。

实现时把它等效成PQ型,在每轮迭代开始时用当前电压幅值重新估算一次Q,再放入PQ注入电流公式。注意如果在迭代末U变化较大,Q会出现抖动,工程上给它加一个低通滤波或者限制步长即可。

3.4 PV型DG:前推回代法最需要小心的节点

PV型DG指定接入点电压幅值必须维持在某一定值,问题在于它需要多少个无功功率才能维持这个电压是未知量,体现在潮流方程里就是“约有功P和电压幅值U已知,无功Q待求”。

前推回代法不像牛顿法那样直接在雅可比矩阵里包含电压幅值约束,所以常用的方法是外迭代修正:

第一轮把该DG暂时当作PQ型,给一个初始无功Q₀,正常迭代到收敛。检查收敛后该节点电压幅值U_calc与设定值U_set的偏差,按偏差修正无功:Q_new = Q_old + K_g × (U_set - U_calc)。K_g是电压对无功的灵敏度系数,理论上取该节点电纳矩阵虚部的倒数,工程里通常用一个经验系数,并设置修正量上限。用新Q再重复收敛,直到偏差小于阈值。

这里有三相网络的特殊性:三相DG(如同步机型)通常控制的是正序电压幅值,单相DG控制的是接入相电压幅值。程序必须区分这两种模式,三相DG修正时要把三相电压做对称分量分解取正序幅值来反馈,单相DG直接取该相幅值即可。我一开始没有区分,导致某个三相DG接入的算例无功振荡,后来改成“接入相别决定反馈量”才稳定。

3.5 光伏逆变器的实际控制模式并不只有恒功率

工程里的并网逆变器有恒功率(PQ)模式、恒功率因数模式、电压无功下垂(Q(U))模式、有功功率限制模式等。潮流计算里不需要模拟控制器的动态过程,只要在稳态工作点把它的出力定下来即可。比如Q(U)模式,可以根据节点电压查下垂曲线得到一个无功参考值,再映射为等效PQ节点。程序里我在“DG电流计算”那段留了接口,实际用哪个控制曲线由输入文件里的控制模式字段决定。

4. 三相负荷建模与算例验证:从标准测试馈线到DG过电压分析

4.1 三相负荷的输入与ZIP模型

配电系统的负荷种类丰富,有的接近恒功率(电动机、变频器),有的接近恒阻抗(电热设备、照明),所以负荷建模通常用ZIP模型,按比例把负荷拆成恒阻抗(Z)、恒电流(I)、恒功率(P)三部分。每一相的负荷功率写成复数形式,程序内部按各部分的比例分别转化为节点注入电流。

具体公式:已知某相额定电压U_N和基准功率S₀,若当前电压为U,则该相负荷视在功率近似为:

S(U) = S₀ [α_Z·(U/U_N)² + α_I·(U/U_N) + α_P]

三相各相独立给定,三类占比系数可不同。实际台区数据用电信息采集系统能给出各相有功和无功,直接填进负荷表即可;只有单相总量时,需要按经验拆分三相之后再用。

ZIP参数对潮流计算的影响不小。恒功率占比高的负荷,电压降低时电流反而增大(维持功率),可能把电压进一步拉低,迭代容易出现不稳定;恒阻抗占比高的负荷则更有“自稳”特性。程序默认取恒功率占比0.6、恒电流0.2、恒阻抗0.2,实测收敛性比纯恒功率模型好很多,也更贴近实际。

4.2 算例一:13节点三相测试馈线系统验证

为了验证三相前推回代程序的正确性,我首先在公开的13节点三相配电网测试馈线上做了校验。这个系统节点数很少,但涵盖了单相段、两相段、三相互感线路、Y接和D接负荷等典型场景,非常适合做三相程序的“标定测试”。

程序跑通后,把各节点三相电压幅值和我用独立参考程序计算的结果做差,最大偏差在标幺值下小于1e-8,支路功率误差也在1e-6以内。这说明三相前推回代算法本身、线路参数读取、节点分层逻辑都没有问题。表1节选了一部分结果作为程序正确性的佐证。

节点A相电压(p.u.)B相电压(p.u.)C相电压(p.u.)说明
6501.00001.00001.0000根节点恒压
6321.02121.01401.0183三相段
6450.99810.99571.0000两相段,仅有B/C相
6710.99020.98210.9887重负荷三相段

可以看到同一节点三相电压就已经存在明显差异,这就是用三相模型的直接收获。

4.3 算例二:含单相光伏的台区电压抬升分析

验证完算法后,我在一个构造的33节点辐射网测试系统上做了扩展,把它改成三相模型,并在部分末端节点接入单相光伏。这个算例模拟的是高渗透率台区场景:光伏都集中在A相接入,容量接近该台区总负荷的50%。

结果很直观:无DG时全网三相电压几乎都在0.97到1.02 p.u.,全部合格;接入光伏后,A相电压在末端某节点直接抬升到1.078 p.u.,超过了1.07 p.u.的工程上限,而B、C两相电压却没有明显变化,一台三相变压器出现轻微不利负载不均衡。如果换用单相潮流计算,这个越限根本不会被发现,因为光伏容量在模型里被“铺”到三相上了。

这个算例还顺便暴露了另一个现象:单相光伏接入后,接入相的电压抬升会让该相负荷功率略微增大,而其他相没有相应补偿,三相电流不平衡度从接入前的8%左右上升到接近17%。这些指标都是做台区综合治理方案时真正需要关注的数据。

4.4 从算例中提炼的工程结论

做完这两个算例,我最大的感受是:三相潮流的结果不是“更好看”,而是“更能暴露问题”。单相潮流告诉你的是“平均水平的系统是否安全”,三相潮流告诉你的是“每一相是否安全”。对DG接入方案评审来说,后者才是用户真正关心的。同样的项目,如果只看单相结果,可能把一台B相本来就偏低、A相光伏又过量的台区误判为“正常”;用三相程序扫描一遍,该换相、该加无功补偿、该限制接入容量的结论一下子就出来了。

5. 程序实现笔记:数据结构、迭代状态与收敛调试经验

5.1 程序框架与核心数据结构

程序实现上我用了Python,方便快速调参和可视化。核心数据结构包括:

  • 节点表:每个节点存储ID、父节点ID、所在层号、三相电压向量(3×1复数)、节点类型;
  • 支路表:每条支路存储首末节点ID、3×3相阻抗矩阵;
  • 负荷表:每个负荷记录所在节点ID、相别、ZIP参数;
  • DG表:每个DG记录所在节点ID、接入相别、类型(PQ/PI/PV)、有功和无功参数、控制模式。

主流程分为四步:数据读取、拓扑分层、潮流迭代、结果输出。拓扑分层用队列实现的BFS,几百个节点的网络毫秒级就能完成。迭代主体是前推回代循环,每轮里先刷新DG注入电流,再按层做回代,再按层做前推,最后判断收敛。

5.2 核心迭代函数的代码逻辑

前推回代主体循环的精简代码如下:

def backward_sweep(): # 从最大层向根节点逐层计算支路电流 for layer in range(max_layer, 0, -1): for node in layer_nodes[layer]: # 节点净注入电流 = 负荷电流 - DG注入电流 I_node = load_current(node) - dg_current(node) branch_I[node] = I_node + sum(branch_I[child] for child in children[node]) def forward_sweep(): # 从根节点向末端逐层更新电压 for layer in range(1, max_layer + 1): for node in layer_nodes[layer]: parent = parent_of[node] branch = branch_between[parent][node] U[node] = U[parent] - branch.Z @ branch_I[node]

这里branch.Z就是3×3相阻抗矩阵,@是矩阵乘法。实际代码里为了性能会把同一层的节点组织成数组批量计算,但逻辑不变。每轮迭代结束后计算所有节点三相电压幅值与上一轮的差,取最大偏差作为收敛判据,阈值我用的1e-6 p.u.,一般在10到30轮内收敛。

5.3 迭代发散的几种常见情况与对策

前推回代算法看着简单,实际运行中会遇到几种典型的不收敛情况。第一是纯恒功率负荷占比过高且负荷很重时,节点电压偏低,迭代出现振荡。这种情况的物理本质是:在低电压区域,功率方程对电压的灵敏度变得很差,算法容易在两个电压值之间来回跳。对策是把收敛判据从电压差放宽到功率差,或者给电压更新加一个0.5的松弛因子。

第二是PV型DG无功修正不稳定。原因多半是灵敏度系数K_g取得太大,或者修正量没有设置上限。我的经验是:单相PV的K_g起始取0.5,三相正序PV的K_g起始取1.0,每轮修正量限制在0.1 p.u.以内,基本就不会振荡。

第三是阻抗参数的单位和基准值混乱。三相阻抗矩阵数据通常来自架空线路单位长度参数乘以线路长度,如果单位是欧姆而电压基准、功率基准对不上,计算出来完全不可理喻。这里建议全线使用标幺值,把线路阻抗、负荷、DG参数都折算到同一个容量和电压基准下,能避免大量低级错误。

5.4 弱环网处理与结果精度校验

前推回代的基本形式只能处理辐射状网络,如果台区有联络开关合上形成环网,需要先做“破环”。标准做法是选定一个断开支路,假设该支路流过一个未知电流I_loop,把环网拆成辐射网,每次迭代后根据断开支路两端电压差修正I_loop,反复迭代至电压差为零,这就是补偿法。这个逻辑在三相模型下也同样成立,只是支路电流和电压差都变成3维复数向量。

程序最后还做了一步交叉验证:用同样的网络数据构建一个牛顿-拉夫逊三相潮流作为“参考解”,对比两种算法在测试系统上的节点电压偏差。前推回代的结果在标幺值下与参考解最大偏差小于1e-8,收敛速度和精度都达到预期。这一步验证建议所有人都做一遍,因为程序的“看起来合理”和“真正正确”之间,必须有可量化的差异检验。

5.5 效率优化与程序结构建议

三相前推回代的计算量主要是每轮迭代中所有支路的3×3矩阵乘法,矩阵规模很小,瓶颈不在数值计算而在数据访问方式。实测下来,对500个节点的三相台区模型,Python直接逐节点循环迭代20轮,耗时在几十毫秒量级,完全不需要深度优化。但如果要做上千个场景的批量扫描,可以按层组织节点列表,把同一层的三相支路阻抗矩阵叠成三维数组,向量化计算,速度能再快一个量级。

程序结构上我建议把“网络数据”、“潮流求解器”、“结果输出”三部分解耦。网络数据负责读文件和建模;求解器只管迭代计算,内部不关心负荷是商业用户还是居民用户、DG是光伏还是风电;结果输出部分单独处理表格和曲线。这样后续给程序增加新的DG控制策略、增加三相不平衡度指标、增加经济性分析模块,都不用动核心求解器。

最后分享一点个人体会。做完这个三相潮流程序,我回看当初单相潮流“算不出问题”的经历,更深的感觉是:工具本身没有对错,关键是用它的时候能不能意识到它在哪些地方做了简化。单相潮流对输电骨干网络可能是足够的,但到了光伏渗透率越来越高的配电台区,保留相别信息不是锦上添花,而是刚需。这套程序做完之后,我处理台区电压问题的工作流从“看监测曲线猜原因”变成了“扫描不同DG接入方案直接算结果”,分析效率提升了一大截。如果读者也要实现类似功能,我的建议是先找一个标准测试算例把三相模型和迭代逻辑跑通,确认结果和参考解吻合,再叠加分布式电源模型。算法本身并不复杂,反倒是线路参数、负荷模型、DG控制模式这些“输入侧”的细节,决定了程序在工程现场到底能不能用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询