← Physics-informed GNN 课程

Physics-informed GNN · 微电网与配电系统

Unbalanced Power Flow · 不平衡潮流

相同的总负荷,分配到三相之后,可能产生完全不同的电压结果。如果需求主要集中在 A 相,或者屋顶光伏只接入一相,会发生什么?本章保留三相与中性线,通过推导、例题和实验回答这些问题。

1. 从单相等值走向四导线模型

在 Balanced Power Flow 中,三相幅值相同,相角相差 120°,可以用一个等值相表示网络。单相用户和逆变器破坏了这一对称性:现在每一相都有自己的复功率、电压和电流。

不平衡负荷还会产生中性线返回电流。中性线阻抗有限时,当地中性点电压不再等于电源接地点电压。用户实际得到的是相线对当地中性点的电压,不能只看相线对电源参考点的电压。四线模型在低压配电分析中的意义,可参见 Claeys、Geth 与 Deconinck 的研究。

先观察一个负荷端的三相电压:虚线是理想的 1 pu 平衡电源;实线是相线对当地中性点的电压,其幅值和相角间隔都可能不同。图中运行点随下方实验更新;具体馈线和观测节点将在例题中定义。

本章的模型假设

本章采用相域三相四线 AC 模型,方程和交互实验遵循以下假设:

  • 正弦稳态: 电压与电流采用基波 RMS 复相量,不包含谐波。
  • 辐射型网络: 保留 a、b、c 三根相线和 n 中性线,沿馈线逐支路计算电流与电压。
  • 一个平衡理想电源: 电源三相电压幅值和相角固定,其中性点接地;下游中性点经中性线返回电源,没有额外接地或大地回流路径。
  • 星形恒定 PQ 设备: 负荷逐相指定 P、Q,光伏按指定有功、Q = 0 注入;它们连接在相线与当地中性点之间,不调节节点电压。
  • 串联四导线线路: 保留相线和中性线的电阻、电抗,以及可调的相间互电抗;相线与中性线互阻抗设为零,忽略并联支路和变压器。

这些假设描述通用模型。下面先用 i、j、k 推导方程,再在例题中定义具体馈线、节点编号和逐相负荷。

先预测,再拖动:如果增加 A 相负荷,B、C 相电压一定会同时下降,而且降幅相同吗?共享中性线使这个判断未必成立。

2. 推导相域潮流方程

步骤 A:区分导线电压与负荷端电压

采用 RMS 复数相量。Vi,a、Vi,b、Vi,c、Vi,n 分别表示四根导线对电源参考点的电压。星形负荷的端电压是:

负荷端电压由相线和当地中性点共同决定

线路 Z(4×4) abcn Vⱼ,ₐVⱼ,ᵦVⱼ,𝒸Vⱼ,ₙVᵢ,ₙ = 0IₐIₙ = −Σ IφUⱼ,ₐ

左右滑动查看完整示意图。

电压差也是相量差
ReIm0VφVₙUφ
读图的两个关键点

Uφ = Vφ − Vₙ

绿色矢量从当地中性点出发。中性点发生偏移时,即使相线对参考点的电压变化不大,负荷两端的电压也会改变。

中性线电流是三相电流的复相量之和取负,不能把三个电流幅值直接相加。上图的 Z 包含自阻抗和所采用的互耦项。

导线图说明连接关系,相量图说明电压参考;相量长度仅用于示意。导线电流统一以 i → j 为参考方向,因此 Iₙ = −ΣIφ。负荷三个支路共用的当地中性点,通过有限阻抗中性线返回电源,没有另设下游接地。

设三相总容量基准为 SB,3φ、线电压基准为 VB,LL。功率按每相指定,因此需要对应的每相基准:

每相功率必须除以每相容量基准,而三相总功率除以三相总容量基准。例题中再代入具体数值,核对这两种换算。

步骤 B:把各相恒定 PQ 需求转换成电流

规定净需求为正表示消耗。本例光伏单位功率因数运行,所以 si,φ = (PD,i,φ − PPV,i,φ) + jQD,i,φ。这里的净需求符号与上一章的净注入符号相反。负荷无功为 QD = PD tan(arccos PF)。

负荷四个端子的电流之和为零。理想的零阻抗中性线仍然可以流过非零电流。只有三相基波电流平衡时,返回电流才为零;本章没有包含谐波。

步骤 C:对四导线支路应用 KVL

将导线电压与电流组成四维向量,一般串联线路使用 4 × 4 阻抗矩阵:

交互模型使用对称矩阵:三相自阻抗相同,为 zs;相间互阻抗 zm = jxm;中性线自阻抗为 zn:

μ 控制相间互电抗与自电抗的比例。这是一组说明原理的参数,不是某种电缆的规格。设置 zn = 0 会使本网络下游中性点电压为零,并不等于断开中性线。实际接地与中性线连接需要显式建模,可参见 OpenDSS 中性线约定。

为什么改变 A 相会影响 B、C 相?

由于 Iₙ = −(Iₐ + Iᵦ + I𝒸),把各相导线的 KVL 方程减去中性线 KVL 方程,得到:

共享中性线项包含三相电流之和。因此,即使 μ = 0,有限中性线阻抗也会耦合各相负荷端电压。只有中性线阻抗与相间互阻抗同时为零,三个独立单相计算才会复现本模型。

步骤 D:用前推回代求解辐射型馈线

为什么这里从牛顿–拉夫逊换成前推回代?

上一章同样研究配电馈线。平衡/不平衡是相模型的选择,辐射/网状是拓扑的选择,牛顿–拉夫逊(NR)/前推回代(BFS)是求解方法的选择。 三者需要分别判断:不平衡潮流也可以用 NR,平衡的辐射馈线也可以用 BFS。

上一章选择 NR,是为了从节点导纳矩阵、P/Q 偏差推导通用的雅可比求解框架;其交互实验还允许闭合联络线形成回路。NR 通过联立方程处理全网电压修正,无需把网络限定成一棵树。

本章则固定为一个电源、辐射型馈线、恒定 PQ 设备。每个下游节点只有一条返回电源的路径,适合从末端汇总电流,再从电源沿线路更新电压。本章采用的是 BFS 的电流求和形式;径向电流回代与电压前推的基本过程可参见 MATPOWER 配电潮流说明。

相模型与网络拓扑辐射型:没有闭合回路含闭合回路
平衡单相等值可用 NR 或 BFS可用 NR;BFS 需要回路扩展
三相不平衡可用相域 NR 或多导线 BFS可用相域 NR;BFS 需要回路扩展

表中讨论算法框架;本章的交互求解器实现的是辐射型四线 BFS。它每次把 a、b、c、n 四个分量一起计算,保留完整 4 × 4 阻抗矩阵和共享中性线关系,不是三次独立的单相计算。光伏反送可以改变电流正负,却不改变树形连接。

同一组 AC 物理约束,两种迭代组织方式

模型给定:恒定 PQ 关系 S = UI*、节点 KCL、线路 KVL,以及电源电压参考。改变算法时,这些物理条件应保持一致。

Newton–Raphson

全网电压估计 → 计算方程偏差 → 构造雅可比 → 联立求修正量 → 更新电压

这里沿用上一章“指定功率 − 计算功率”的 Δs 符号。三相版本可改用各导线电压的实部、虚部,并构造相应的功率或电流残差与雅可比。

前推回代 · 电流求和

当前四线电压 → 计算负荷电流 → 回代汇总支路电流 → 前推计算四线电压 → 重复

利用树形结构做两次遍历,不组装全网雅可比。恒定 PQ 电流依赖未知的负荷端电压,所以一轮前推回代通常不是最终解。

两者都在求非线性 AC 潮流。匹配物理模型并收敛到同一运行点时,电压、电流和损耗应一致;迭代路径和停止判据可以不同。

R/X 较大不意味着完整 NR 不能使用。 较大的电阻使保留有功、无功和电压的交叉耦合更重要;不要把完整 NR 与采用弱耦合近似的快解耦法混为一谈。两章的求解器都保留 R、X,没有采用 X ≫ R 的近似。

BFS 的优势在这里是结构清楚、便于展示四线返回路径,并非保证所有工况下更快或更容易收敛。重负荷与较大压降会影响收敛,所以本章加入阻尼并检查残差。闭合回路需要回路补偿等扩展;PV 节点(指定 P 和电压幅值)还需要额外的无功/电压更新。本章的光伏采用固定 PQ 注入。BFS 和 NR 的迭代失败都不能单独证明潮流无解。

下面把这种电流求和过程写成具体的四线更新公式。

将所有节点初始化为电源相量,然后重复:

  1. 根据当前相对中性点电压,计算每个负荷的四端子电流。
  2. 回代: 从末端向电源汇总下游电流,得到各支路电流。
  3. 前推: 从电源节点出发,沿馈线应用四线 KVL,更新导线电压。

用通用的 i → j → k 链说明一次更新:i 是电源,j、k 连接负荷,k 是末端。每个电压与电流向量都含 a、b、c、n 四个分量。

同一条馈线,两个方向的计算

回代:末端 → 电源
ijkIᵢⱼIⱼₖ
Iᵢⱼ = Iⱼˡᵒᵃᵈ + Iⱼₖ

先由当前负荷端电压计算各相电流,再从末端汇总。中性线电流也一起传递。

前推:电源 → 末端
ijkVᵢVⱼVₖ
Vⱼ = Vᵢ − Zᵢⱼ Iᵢⱼ

用回代得到的支路电流和四乘四阻抗矩阵,沿路径计算电压降。

箭头表示计算顺序。每个 V、I 都包含 a、b、c、n 四个复数分量。前推得到的新电压经过阻尼更新,再用于下一轮电流计算。

实现使用 α = 0.65 的阻尼更新:

停止条件是最大复数导线电压残差 ‖Vsweep − V‖∞ 小于 10−10 pu。达到 200 次更新或出现过低、非有限电压时报告失败。算法失败本身不能证明电压崩溃或不存在其他解。支路断开另行报告为超出单电源模型范围的孤岛。

步骤 E:计算各导线损耗

本模型的互阻抗是纯电抗,因此采用物理单位时,全部导线的有功损耗为:

电流用 A、电阻用 Ω,结果为 W。不要再次乘三,式中已经包含三相电流。将支路两端注入的四导线功率相加,也会得到同样的总损耗;应保留中性线导体对应的项。

步骤 F:把三相电压分解为序分量

序分量是什么?

潮流先求出同一节点的三个复电压相量 Uₐ、Uᵦ、U𝒸。序分量是这三个相量的另一种坐标表达:把它们写成三组具有固定相位关系的相量之和。它不增加物理导线,也不是把基波分成三个不同频率。

采用 ABC 相序,令 a = ej120°。a 表示逆时针旋转 120°,a² 表示旋转 240°(等价于 −120°)。三种模式分别是正序、负序和零序;其相序约定见 MIT 的序分量讲义。

正序:ABC

ABC 0°, −120°, +120°

负序:ACB

ABC 0°, +120°, −120°

零序:三相同相位

A = B = C 0°, 0°, 0°
图中以各序的 A 相系数为 1∠0° 示意。任意复系数会整体缩放、旋转该组相量,但不改变组内三相的角度关系。正、负表示相序方向;“零序”不表示幅值必须为零。

U₀、U₁、U₂ 的下标是序分量编号,不是节点编号。 每个数是该序的 A 相代表相量。例如,U₁ 是一个复数,完整的正序三相是 [U₁, a²U₁, aU₁]。正序对应正常 ABC 次序,负序对应反向 ACB 次序;零序三相大小和相角完全相同。

为什么恰好是这三种?

三个任意复电压需要三个独立的复系数来表达。循环轮换三相三次后回到原位,其三种独立模式对应方程 λ³ = 1 的三个根:1、a、a²。因此“同相”“ABC”“ACB”构成一组完整的基,可以唯一表示任意三相相量。

展开:独立性与 1 + a + a² = 0

记三组基向量为 bₖ = [1, a−k, a−2k]T,k = 0, 1, 2。由于 1 + a + a² = 0,它们的复内积满足 bₘ†bₙ = 3δₘₙ(† 表示共轭转置)。三组向量互相正交且非零,所以独立。把电压投影到各基上,再除以 3,就得到相应的序系数。

从潮流电压到序分量,再回到三相

变换使用复数而不是只有幅值的三个实数。若已有幅值与角度,先转换 Uφ = |Uφ|ejθφ。ABC 约定下的分解与逆变换如下,亦见 SEL 的序分量教程:

U₀ 是三相复电压的平均值;求 U₁ 时先把 B、C 相按 a、a² 旋转,再平均,使正序对齐、其余模式相消;U₂ 使用反向旋转。重构时相加的是复数,幅值不能直接相加。 使用统一的相电压基准,pu 与伏特两种单位都满足同样的线性变换。

本章先在相域完成四线潮流,再对结果做序分量分析。分解始终成立;若想进一步把潮流拆成三个独立序网络,网络阻抗还需满足相应的对称性条件,不能只凭变换矩阵假设它们独立。

零序电压与中性点偏移有什么关系?

保持源端参考不变,Vₐ、Vᵦ、V𝒸 是相导线电压,Vₙ 是当地中性点电压;负荷实际看到 Uφ = Vφ − Vₙ。公共的 −Vₙ 只进入零序:

所以 U₀ 不是 Vₙ,也不能一般地把 U₀ 写成 −Vₙ;相导线本身可能已有非零 V₀。若同一支路四根导线电流都以源端指向末端为正,I₀ = (Iₐ + Iᵦ + I𝒸)/3,而 Iₙ = −3I₀。这是电流返回关系,不是零序电压等于中性点电压的依据。

本章使用的电压不平衡因子为:

它只量化负序相对正序的幅值;零序、绝对电压幅值与中性点偏移应分别查看。它也不同于 OpenDSS 所说明的 NEMA 幅值偏差指标。改变相角而保持三个幅值不变,同样可能产生负序。

3. 例题:总负荷仍为 300 kW,三相分配不同

建立馈线与节点设置

考虑一个 400 V 三节点辐射型配电馈线。节点 1 是上级电源,经线路 1–2 连接节点 2,再经线路 2–3 连接末端节点 3。每条线路均包含 a、b、c、n 四根导线,本例没有联络线。

例题网络:三相四线辐射馈线

1–22–3 a, b, c, na, b, c, n 123 400 V LL平衡电源 V₁,ₙ = 0 负荷 A / B / C40 / 40 / 40 kWPF = 0.95 负荷 A / B / C90 / 55 / 35 kWPV: 50/3 kW 每相Qɢ = 0

左右滑动查看完整示意图。

每条连接代表三根相线和一根中性线;虚线仅用于辨认中性线,全部导线在基准工况均接通。只有电源中性点接地,负荷端中性点电压由线路压降求得。节点 3 的光伏按固定 PQ 注入,实际负荷端电压由四线潮流计算。
节点设备与指定量电压的处理方式
1平衡电源,线电压 400 V,中性点接地固定三相电压相量与中性点电压
2星形负荷,A/B/C 各 40 kW,共 120 kW,PF = 0.95 滞后由四线潮流求负荷端电压
3星形负荷,A/B/C 为 90 / 55 / 35 kW,共 180 kW,PF = 0.95 滞后;另接 50 kW 光伏由四线潮流求负荷端电压

节点 3 的光伏采用固定 P、Q 注入:基准工况将 50 kW 在三相均分,各相 Q = 0,不调节电压。该节点的逐相净需求由负荷减去光伏注入得到。上方相量图观测的就是此处的相对当地中性点电压。

代入基准与线路参数

取三相总容量基准 1 MVA、线电压基准 400 V,得到每相容量基准 333.333 kVA、相电压基准约 230.94 V、ZB = 0.16 Ω、IB = 1443.38 A。一个 90 kW 单相负荷在每相容量基准上为 0.27 pu;90 kW 三相总负荷在三相总容量基准上才是 0.09 pu。

线路每根导线的自阻抗及相间互阻抗如下:

支路相线自阻抗(Ω)中性线阻抗(Ω)相间互阻抗(Ω)
1–20.012 + j0.0080.018 + j0.006j0.0016
2–30.008 + j0.0060.012 + j0.004j0.0012

写出逐相需求并求解

1. 形成逐相净需求。 光伏每相供应 50/3 kW,因此节点 3 的净有功需求为 73.333 / 38.333 / 18.333 kW。无功需求仍为 PD,φ tan(arccos 0.95),本例光伏不供应无功。

2. 求电流与返回路径。 将复需求除以各自的相对当地中性点电压,再取共轭。把三相电流按复数相量相加,得到中性线返回电流。直接把电流幅值相加会得到错误结果。

3. 迭代并核对运行点。 基准例题得到节点 3 的负荷端电压:

相幅值(pu)幅值(V RMS)相角(°)
A0.91917212.27+0.1180
B0.98032226.39−122.0550
C1.00438231.95+121.2865

中性点偏移约 7.637 V;支路 1–2 的中性线电流约 242.81 A。总有功损耗为 9.5971 kW,参考电源供应 259.5971 kW,满足 259.5971 + 50 − 300 = 9.5971 kW。节点 3 的 VUF 仅为 0.9028%,但 A 相已经低于实验中的 0.95 pu 教学限值。

把算出的电压分解,再核对重构

4. 使用同一组复电压。 将上表的幅值与相角一起转换为复数,再代入序分量矩阵。节点 3 的结果如下;计算使用未舍入的潮流电压,表中仅显示近似值。

A 相代表系数复数值(pu)幅值(pu)相角(°)
U₀ · 零序−0.040906 + j0.0097880.042061+166.543
U₁ · 正序0.967660 − j0.0035700.967666−0.211
U₂ · 负序−0.007590 − j0.0043260.008736−150.322

例如 A 相不需要额外旋转,直接把三个代表系数相加:

取幅值与相角就回到约 0.91917∠0.118° pu。B、C 相先按逆变换旋转正序和负序项,再相加。下方的分解器可逐相核对,不必另跑一个潮流。

由上表可得 VUF ≈ 0.9028%,但 |U₀|/|U₁| ≈ 4.3466%。这解释了为什么只看 VUF 会遗漏本例明显的零序和逐相电压偏差。这里的 |U₀| ≈ 9.7135 V,而 |Vₙ| ≈ 7.6370 V,两者不是同一个量。

选择下方的相同总负荷,均分三相,将节点 3 改为 60 / 60 / 60 kW,保持总负荷与光伏不变。同时观察中性线电流、中性点偏移、逐相电压和损耗。若要精确复现上一章例题,还应把 μ 设为零,使平衡三相看到相同的无互耦串联阻抗。

4. 交互实验:改变一相,观察三相

拖动各相负荷、切换光伏接入相,或者比较有限与理想中性线。电网图、相量图、电压分布、电流负载率和数值表均使用同一个求解运行点。电压带、VUF 阈值与电流限值是教学设置,不是标准合规评估。

三相四线配电馈线

400 V LL · 1 MVA
● A● B● C◆ N

三条实线代表 A/B/C 相,虚线代表中性线;线宽随电流幅值变化。节点电压是相对当地中性点的 RMS 值。节点 2 固定为每相 40 kW,再乘负荷倍率。

最低相电压—
节点 3 VUF—
节点 3 中性点偏移—
导线总有功损耗—

正在初始化…

电源、线路耦合与电流限值

逐相电压分布

导线电流负载率

电压 0.95–1.05 pu、VUF 2% 和可调电流限值是教学参照。VUF 只描述负序比例,不能代替相电压或中性点偏移检查。

逐相数值、序分量与迭代过程
节点 / 相|U| (pu)U (V)θ (°)P demand (kW)Q demand (kvar)

此表净需求为正表示消耗,负值表示本相净发电;参考电源功率单独列在下方。

节点|U₁| (pu)|U₂| (pu)|U₀| (pu)VUF (%)|Vₙ| (V)
支路Iₐ (A)Iᵦ (A)I𝒸 (A)Iₙ (A)损耗 (kW)N loss (kW)

迭代‖V sweep − V‖∞ (pu)min |U| (pu)

从当前潮流电压,分解并重构

上方的负荷、光伏与中性线控件改变潮流运行点;本区自动读取同一份结果。先比较均分三相与基准工况,再切换电压参考,观察哪一个序发生改变。

① 原始三相电压

② 正序三相 · ABC

③ 负序三相 · ACB

④ 零序三相 · 同相位

各图独立缩放,以看清较小的负序、零序;比较幅值请看圆半径标注与数值表。A/B/C 使用橙色圆点、蓝色方块、绿色三角;零序三相重合。数值接近零时相角没有意义,显示为 —。

分解输入:幅值与相角 → 复电压

相复电压(pu)|·| (pu)∠ (°)

三个序的 A 相代表相量

序复系数(pu)|·| (pu)∠ (°)|·| (V RMS)

逐项重构:三个复数相量相加

项该相的复电压贡献(pu)

5. 修改并运行四线求解器

先看逐相输入怎样进入四线模型,再由 main() 调用求解器并读取结果。直接运行默认程序后,取消 parameters.update(p3_a_kw=60, p3_b_kw=60, p3_c_kw=60) 前的注释,在保持节点 3 总负荷 180 kW 的条件下比较三相电压、VUF 与中性点偏移。滑块保留原始 JavaScript 模型作为参照;Python 区运行可编辑的四线源码。

先看代码如何连接

  1. case滑块提供输入字典
  2. unbalanced_power_flow.py源码定义模型函数
  3. main(case) → result主程序计算、打印并返回绘图结果

点击运行时,页面先复制当前控件为 case,再执行下方折叠的模型源码,最后执行可编辑的主程序。因此 main() 可以直接调用源码中的函数,无需另写导入语句。下面三部分按这个顺序阅读。

1 · 输入:展开 case 的当前参数与含义

这是下一次运行将使用的输入;改变上方控件会更新它。main() 中复制为 parameters 后修改,可测试一个新工况,而不改变控件。

正在读取参数…
参数含义与单位
p3_a_kw / p3_b_kw / p3_c_kw节点 3 的 A/B/C 相基准负荷(kW),随后乘以 load_scale。
load_scale / power_factor负荷倍率与功率因数;节点 2 基准负荷每相 40 kW。
dg_kw / dg_phase光伏总有功 kW 与接入相:balanced 为三相均分,a/b/c 为单相接入。
slack_pu / r_scale / x_scale电源相电压(pu)与线路电阻 / 电抗倍率。
neutral_mode / neutral_scale / mutual_ratiofinite 或 ideal 中性线;中性线阻抗倍率;相间互电抗比例。
current_limit_a / neutral_limit_a相线 / 中性线电流限值(A)。
open12 / open23True 表示线路断开,下游节点将失去电源连接。
2 · 模型源码:unbalanced_power_flow.py(展开查看 / 修改)

依赖:只使用标准库 cmath、math;四线制求解器在本章源码中定义。

这是本次 Python 实际执行的源码;按下表顺序可以把函数与本章公式对应起来。修改后,再运行主程序就会使用新源码。上方滑块实验继续使用原始 JavaScript 模型作为参照。

源码里的函数负责什么
network(options)参数 → 四导体电源、逐相负荷、每条线路的 4 × 4 阻抗矩阵。
local(voltage)导体电压 → 当地相对中性点电压 Uφ = Vφ − Vn。
sweep(demand, edges, source, voltage)完成一次向电源累加电流、向末端更新电压,包含中性线。
sequence(phases)三相电压 → 序分量,以及 VUF = 100 |U₂| / |U₁|。
phase_components(components) / reconstruct_sequence(components)序分量系数 → 每相的零序、正序、负序贡献 → 重构的 A/B/C 复电压。
solve(options)重复带阻尼的前推回代,检查收敛,返回逐相电压、中性点偏移和损耗。

3 · 主程序:main() 做什么?

主程序负责复制 / 修改输入 → 调用模型 → 检查求解状态 → 打印结果 → 返回结果。solved 是函数内部的结果字典;末尾的 result = main(case) 把它交给页面绘图。print() 只在输出区显示文字,不负责画图。

第一次先直接运行,核对本章例题。然后取消逐相负荷修改行前的 #,保持节点 3 总负荷 180 kW,比较三相电压和 VUF。

下载求解器

首次运行需联网下载 Python 环境。计算在浏览器内完成,求解器只用 Python 标准库。

准备运行。

怎样读输出?

Python 列表从 0 开始,所以 buses[2] 对应物理节点 3。各相 u_pu 是 [实部, 虚部],vm_pu、voltage_v 则是幅值。components 中的 zero_pu、positive_pu、negative_pu 存储序分量复数对,vuf_pct = 100 |U₂| / |U₁|。neutral_v 是中性点偏移(V),loss_kw 是总有功损耗;读取前先检查 ok。

“下载实验”包含当前输入、当前模型源码和当前主程序,可以作为一个完整的 .py 文件运行。

输出将在这里显示。

用 Python 验证序分量与重构

把 main 主程序整体替换为下面代码。solve、sequence、reconstruct_sequence 都在上方可折叠的完整求解器源码中;它们依次负责潮流求解、相量分解和逆变换。u_pu 是 [实部, 虚部],因此要用 complex(*pair) 读取,不能把 vm_pu 的幅值当成复电压。

def main(input_case):
    # 1. 求解当前滑块工况;失败时不做分解。
    solved = solve(input_case)
    if not solved["ok"]:
        print("Power flow failed:", solved["reason"])
        return solved

    # 2. 读取节点 3 的三相对当地中性点复电压。
    bus = solved["buses"][2]  # zero-based index 2 -> bus 3
    phases = [complex(*phase["u_pu"]) for phase in bus["phases"]]

    # 3. 分解为 A 相代表的零、正、负序系数。
    components = sequence(phases)
    for name in ("zero_pu", "positive_pu", "negative_pu"):
        coefficient = complex(*components[name])
        print(name, coefficient, "|U| =", abs(coefficient), "pu")

    # 4. 逆变换回 ABC,并与原电压逐相比较。
    rebuilt = reconstruct_sequence(components)
    for label, original, recovered in zip("ABC", phases, rebuilt):
        print(label, "solved =", original, "rebuilt =", recovered)
    error = max(abs(u - restored) for u, restored in zip(phases, rebuilt))
    print("Maximum reconstruction error:", error, "pu")

    # 保留完整潮流结果,供页面绘制电压曲线。
    return solved

result = main(case)

比较光伏接入相

完成默认实验后,可以将主程序整体替换为下面的扫描程序,在其余输入固定时比较光伏接入相。它把最后一次成功求解的结果交给页面绘图:

def main(input_case):
    last_successful = None
    for connection in ("balanced", "a", "b", "c"):
        trial = dict(input_case, dg_phase=connection)
        solved = solve(trial)
        if solved["ok"]:
            end = solved["buses"][2]  # Bus 3
            print(connection, end["components"]["vuf_pct"], end["neutral_v"])
            last_successful = solved
        else:
            print(connection, solved["reason"])
    return last_successful

# 返回 None 时,输出仍可读,页面不绘制电压图。
result = main(case)

6. 练习与解释

理想中性线设置约束的是什么?

  1. 中性线耦合: 设置 μ = 0,保持有限中性线阻抗,将 A 相负荷增加 10 kW,记录三相电压。再采用理想中性线重复,用共享中性线矩阵项解释差别。
  2. 总需求相同: 比较 90 / 55 / 35 kW 与 60 / 60 / 60 kW,保持功率因数、光伏出力与接入方式、阻抗不变。解释中性线损耗与最低电压的变化。
  3. 一个指标不够: 找到 VUF 小于 2%,但某相电压超出 0.95–1.05 pu 的收敛运行点。用 U₀、U₂ 和中性点偏移讨论 VUF 的含义与局限。
  4. 单相光伏: 将 50 kW 依次接在 A、B、C 相,判断在当前运行点哪个方案更能改善最低电压,再在高负荷时重复。不要预先假设所有工况的最佳接入相都相同。
  5. N-1 标签: 断开支路 2–3,区分孤岛、算法不收敛、以及连通但越限的状态。固定 PQ 光伏不会在馈线断开后自动成为构网电源。

  6. 序分量与参考: 先选电源节点,解释为何只剩正序。再选基准工况的末端节点,切换 U 与 V,核对 U₀ = V₀ − Vₙ。分别重构 A、B、C,相角旋转系数为什么不同?

7. 适用范围与后续实现

本章是基波、辐射型教学模型,不包含三角形负荷、电压相关负荷、不对称导线几何、相线与中性线互阻抗、下游接地与大地回流、变压器、调压器、谐波、逆变器能力限值或动态与保护行为。支路断开时四根导线同时断开,没有建模仅中性线断开的故障。孤岛在本模型中没有电压参考。

在 PandaPower-based Implementation 中,我们将设备映射到库函数,并明确比较工具的建模假设。pandapower runpp_3ph 文档说明了序域求解和大地回流、星形连接约定。在匹配这些假设之前,不应认为其结果会与本章显式中性线模型一致。

参考资料