← Physics-informed GNN 课程

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

Balanced Power Flow · 平衡潮流

为什么负荷增加时馈线电压会下降?本地发电能否使潮流反向?无功支撑会改变什么?本章从模型推导出发,计算一个具体例题,再通过参数实验与 Python 验证你的预测。

1. 背景:微电网的一个运行快照

潮流计算描述的是一个稳态运行点。给定网络阻抗、负荷、发电与电压参考,求解节点电压,再计算线路电流、功率传输和损耗。对于微电网与配电馈线,这些结果可以帮助判断切换操作前后的电压下降、反向潮流与线路负载情况。

平衡三相系统中,三相幅值相等,相角相差 120°。在阻抗对称、注入平衡的条件下,可以用单相或正序等值分析。平衡不意味着所有节点电压相同,也不意味着无功功率为零。

图中示意一个节点的平衡三相电压:幅值相等、相角相差 120°。不同节点的电压可以不同;改变后续实验的运行点,图中相量也会更新。

本章的模型假设

本章的方程推导和交互实验采用以下假设:

  • 正弦稳态: 电压与电流用有效值复相量表示。
  • 三相平衡: 网络参数对称,负荷与分布式电源在三相上均衡分配。采用单相等值表示网络,P、Q 表示三相总功率。
  • 线路采用串联阻抗: 保留电阻 R 与电抗 X,忽略线路充电、并联支路和变压器。
  • 负荷与分布式电源采用恒定 PQ: 每个运行点的有功 P、无功 Q 为指定值,求解过程中不随电压变化;节点电压幅值和相角由潮流方程求得。
  • 只有一个电压参考: 平衡节点的电压幅值和相角固定,其有功、无功供给平衡网络其余节点的净注入与线路损耗。

这些假设定义通用模型。下方例题再给出具体馈线、节点编号,以及负荷与发电的设置。

对于后续 N-1 预测任务,拓扑与运行点可作为输入,潮流解得到的电压、电流可作为标签或物理一致性检查。求解收敛不等于运行安全:还需要检查限值、连通性与模型适用范围。动态稳定性和保护行为需要另外分析。

2. 推导平衡 AC 潮流方程

步骤 A:统一基准

采用三相总容量基准 SB 与线电压基准 VLL,B。相电压基准是 VLL,B/√3;阻抗基准对应每相阻抗,P、Q 在该容量基准上表示三相总功率。

先确定基准,再把线路阻抗和功率注入换算为标幺值。采用三相总功率基准后,不要把三相总功率再次除以三。

步骤 B:构建节点导纳矩阵

小写 yij = 1/zij 表示线路串联导纳;大写 Yij 表示节点导纳矩阵元素。对角元素 Yii 是节点 i 的自导纳,其值累加与 i 相连的所有接通线路的导纳。每条线路为两端的对角元素各加上 y,并从对应的两个非对角元素中减去 y;断开线路时,移除这四项贡献。本例忽略线路充电、并联支路、变压器和互感。

从一条线路到整个 Y 矩阵

先看线路两端的电流,再把它对两个节点的贡献写入矩阵。这里的 i、j、k 是通用节点符号。

先区分符号:小写 yij = 1/zij 是线路 i–j 的串联导纳;大写 Yii 是节点 i 的自导纳,大写 Yij 是节点导纳矩阵的非对角元素。下面每格先标元素名称,再写它的值。

跟踪线路
1 · 网络与线路状态
yᵢⱼyⱼₖyᵢₖ ijk VᵢVⱼVₖ
勾选表示线路接通
Iᵢⱼ = yᵢⱼ (Vᵢ − Vⱼ)
2 · 这条线路对 Y 的贡献(ΔY)
ij
iΔYii= + yᵢⱼΔYij= − yᵢⱼ
jΔYji= − yᵢⱼΔYjj= + yᵢⱼ

ΔY 表示这条线路对矩阵的增量。展开两端电流方程,这条线路为两端的自导纳各加上 +y,为两个对应的非对角元素各加上 −y;完整 Y 还需累加其他接通线路的贡献。

3 · 把接通线路的贡献相加
Yijk
iYii= yᵢⱼYij= − yᵢⱼYik= 0
jYji= − yᵢⱼYjj= yᵢⱼ + yⱼₖYjk= − yⱼₖ
kYki= 0Ykj= − yⱼₖYkk= yⱼₖ

浅蓝色对角元素是自导纳,如 Yii;其值累加节点 i 所有接通线路的导纳。只有 i–j 接通时,Yii = yij;再接通 i–k,就变为 Yii = yij + yik。橙色只标出正在跟踪的线路贡献。

本图只含串联线路,忽略并联导纳与变压器:自导纳 Yii = Σ yiℓ(对接通线路求和);非对角元素 Yij = −yij,没有接通的直接线路时为零。+、− 表示复数导纳的代数系数,不是其数值的正负。

步骤 C:从电流得到复功率注入

规定向网络供电的净注入为正:Pspec = PG − PD,Qspec = QG − QD。将基尔霍夫电流定律与 S = VI* 结合:

把发电和负荷合并为节点净注入

分布式电源Pɢ , Qɢ i 负荷Pᴅ , Qᴅ净注入网络Pˢᵖᵉᶜ = Pɢ − Pᴅ , Qˢᵖᵉᶜ = Qɢ − Qᴅ
箭头定义功率的正方向。若发电少于负荷,净注入为负,网络向该节点供电。P 和 Q 分别计算:增加有功发电并不会自动抵消无功需求。

令 Vi = viejθᵢ、Yij = Gij + jBij、δij = θi − θj,展开复数乘积:

这里保留了电阻与无功耦合。对于配电馈线,忽略 R 的近似可能丢失电压下降和损耗的重要影响。

步骤 D:确定各节点的已知量与未知量

节点类型指定量求解量
平衡 / 参考节点电压幅值、相角P、Q 注入
PQ 节点净 P、Q电压幅值、相角
PV 节点P、电压幅值Q、相角

在本章假设下,负荷和固定 PQ 分布式电源都接在 PQ 节点上。未知量是这些节点的电压相角与幅值,平衡节点电压已知。将未知量组成向量 x = [θPQT, vPQT]T。表中的 PV 节点用于完整说明节点分类,它对应电压调节,本章实验不采用该类型。节点分类与非线性功率平衡形式可参见 MATPOWER AC 潮流手册。

步骤 E:用牛顿–拉夫逊方法求解

本章以牛顿–拉夫逊(NR)建立通用的 AC 潮流求解框架:从节点导纳与功率偏差出发,用雅可比矩阵联立修正未知电压。例题虽是配电馈线,后面的实验也允许闭合联络线形成回路,因此选用不依赖树形拓扑的 NR。

三相平衡不是使用 NR 的必要条件。 平衡的辐射型网络同样可以用前推回代;不平衡网络也可以建立三相 NR 方程。下一章将利用单电源、辐射型四线结构,改用电流求和的前推回代,以展示共享中性线与逐相电压的关系。算法选择的原因与适用边界见两种方法的对照。

从平坦电压与零相角开始,计算指定功率与当前计算功率的偏差。J 定义为计算注入对 x 的导数,因此下面的更新采用加号:

一次牛顿迭代在做什么?

  1. 初始化电压给出 PQ 节点幅值和相角的初始估计。x⁽⁰⁾ = [θ, v]
  2. 计算功率偏差由当前 V 和 Y 算出 P、Q,再与指定量比较。Δs = sˢᵖᵉᶜ − s(x)
  3. 检查是否收敛最大偏差是否小于容差?满足则输出电压;否则继续。‖Δs‖∞ < ε ?
  4. 求解并更新用雅可比计算修正量,再用步长 α 更新。J Δx = Δsx ← x + α Δx
步骤 3 满足容差 → 输出电压,计算线路功率步骤 4 更新后 ↩ 返回步骤 2
每轮都重新计算功率偏差和雅可比。达到迭代上限或步长停滞时,算法报告未收敛;这与解收敛后检查电压、电流限值是两个不同步骤。

实现采用解析雅可比矩阵、带主元选择的消元和回溯步长 α,使偏差下降并保持电压幅值为正。停止条件为 ‖Δs‖∞ < 10−10 pu;迭代停滞或完成 30 次更新仍不收敛时报告失败。算法不收敛本身并不能证明物理系统不存在解。

展开雅可比矩阵各元素

当 i ≠ j:

当 i = j:

对应的复数矩阵导数可参见 MATPOWER 电压导数文档。

步骤 F:计算线路功率与损耗

根据节点电压计算线路电流,再计算两端注入线路的复功率,其和为线路复损耗。本模型只有串联阻抗,两端电流幅值相同。

3. 例题:400 V 馈线

建立馈线与节点设置

考虑一个 400 V 三节点配电馈线。节点 1 是上级电源,通过线路 1–2 向节点 2 供电,再通过线路 2–3 向下游节点 3 供电。线路 1–3 是常开联络线,后续实验中可以将其闭合,形成替代供电路径。

例题网络:参考电源、两个 PQ 节点与联络线

1–3 联络线:常开z₁₂z₂₃ 123 1∠0° pu参考电源 负荷 120 kWPF = 0.95负荷 180 kWDG 50 kWQɢ = 0

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

实线形成 1 → 2 → 3 的辐射型馈线,虚线是备用联络线。节点 3 的负荷和发电在同一节点合并为净 PQ 注入;后面的实验可改变出力并闭合联络线。
节点设备与指定量潮流节点类型
1上级电源,电压固定为 1∠0° pu平衡 / 参考节点
2120 kW 负荷,功率因数 0.95 滞后PQ
3180 kW 负荷,功率因数 0.95 滞后;另接 50 kW、单位功率因数的分布式电源PQ

节点 3 的逆变器按指定 P、Q 注入建模:PG = 50 kW、QG = 0,不调节该节点的电压幅值。将发电与负荷合并为净注入后,节点 3 仍是 PQ 节点。

取 SB = 1 MVA、VLL,B = 0.4 kV,得到 ZB = 0.16 Ω、IB = 1443.38 A。线路每相阻抗如下:

线路阻抗(Ω)阻抗(pu)
1–20.012 + j0.0080.075 + j0.050
2–30.008 + j0.0060.050 + j0.0375
1–3,常开联络线0.022 + j0.0140.1375 + j0.0875

节点 1 是参考节点,节点 2、3 是 PQ 节点,因此四个未知量为 x = [θ₂, θ₃, v₂, v₃]T。

写出注入并求解

1. 由功率因数得到无功需求。 QD = PD tan(arccos 0.95),得到节点 2 的无功为 39.44 kvar、节点 3 为 59.16 kvar。

2. 写出净注入。 S₂spec = −0.120 − j0.03944 pu,S₃spec = −0.130 − j0.05916 pu。50 kW 发电抵消部分有功负荷,不抵消无功负荷。

3. 计算第一步牛顿更新。 平坦起点的计算注入为零,所以偏差为 [−0.120, −0.130, −0.03944, −0.05916]T。在该运行点构建 J,求解 Δx,再重复更新。

4. 核对结果。 基准例题得到V₂≈ 0.97559 pu、V₃≈ 0.96657 pu、θ₂ ≈ −0.2994°、θ₃ ≈ −0.4159°,总有功损耗 ≈ 6.8389 kW。平衡节点提供约 256.8389 kW,满足 256.8389 + 50 − 300 = 6.8389 kW。

先预测两个负荷都加倍会怎样,再选择下方的高负荷场景。比较电压下降与损耗,观察非线性变化。

4. 交互实验:改变运行点

每次先改变一个控制量。上方三相相量图显示节点 3 的电压,它与电网图、电压分布、线路负载率和牛顿迭代表都基于同一运行点更新。断开辐射型支路会形成孤岛;闭合联络线可以提供替代供电路径。

低压三节点馈线

400 V · 1 MVA

箭头:有功方向;线宽:电流大小;红色与文字标记:越限。正无功注入表示支撑,负值表示吸收。

最低电压—
有功损耗—
平衡节点 P / Q—

正在初始化实验…

电压分布

线路电流负载率

0.95–1.05 pu 电压带和可调电流限值仅用于教学,不代表某个标准或设备的额定要求。

节点、线路与牛顿迭代的数值结果
节点|V| (pu)θ (°)P (kW)Q (kvar)

P、Q 是三相总净注入,正值表示发电,负值表示消耗。

线路P from (kW)I (A)损耗 (kW)
迭代‖ΔS‖∞ (pu)|V₂| (pu)|V₃| (pu)

5. 修改并运行 Python

把例题变成代码实验:先读输入字典 case,再查看定义求解器的源码,最后由 main() 组织求解与输出。先直接运行,核对例题的电压与损耗;再按代码注释改变一个参数。滑块实验使用原始 JavaScript 模型即时反馈,Python 区则运行下方可编辑的模型源码。

先看代码如何连接

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

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

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

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

正在读取参数…
参数含义与单位
load_scale同时乘在 120 kW、180 kW 基准负荷上的倍率。
power_factor负荷功率因数,用于计算 Q = P tan(arccos(pf))。
dg_kw / q_support_kvar节点 3 的固定发电注入:三相总有功 kW / 无功 kvar。
slack_pu节点 1 电压幅值(pu),相角固定为 0°。
r_scale / x_scale线路电阻 / 电抗的倍率。
current_limit_a电流限值(A),用于求解后的越限检查。
topology / open12 / open23 / open13radial 为辐射状、meshed 为带联络线;True 表示对应线路断开。
2 · 模型源码:balanced_power_flow.py(展开查看 / 修改)

依赖:cmath 用于复数相量,math 用于三角函数;两者都是 Python 标准库,不依赖 NumPy 或 pandapower。

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

源码里的函数负责什么
network(options)输入参数 → 线路阻抗、Y 矩阵、指定 P/Q,并在内部换算为 pu。
injections(y, vm, theta)Y 与电压估计 → 按 S = V(YV)* 计算节点 P/Q。
jacobian(y, vm, theta)电压估计 → PQ 节点 2、3 的 P/Q 导数(4 × 4 雅可比)。
linear_solve(matrix, rhs)J 与功率偏差 → 用高斯消元求 Newton 修正量 Δx。
solve(options)调用以上函数并迭代,返回电压、潮流、损耗和越限检查。

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

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

第一次先直接运行,核对本章例题。然后取消 parameters["q_support_kvar"] = 60 前的 #,比较无功支撑前后的电压和损耗。

下载求解器 .py

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

准备运行。

怎样读输出?

ok 表示数值求解是否收敛;buses 中的 vm_pu、theta_deg 是节点 1–3 的电压幅值与相角;loss_kw 是总有功损耗;slack_p_kw 是参考电源有功;violations 列出越限。收敛并不等于满足限值。

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

输出将在这里显示。

6. 练习与解释

“平衡”要求一个节点满足什么条件?

  1. 功率因数: 有功负荷保持不变,将功率因数从 0.95 降至 0.80。记录电流、最低电压与损耗,用 S = P + jQ 和 I = (S/V)* 解释变化。
  2. 无功支撑: 负荷倍率为 2.0 时,在节点 3 注入 60 kvar。与无支撑状态比较,能否消除所有电压越限?用实验验证。
  3. N-1 拓扑: 在辐射型网络中断开线路 1–2,再在闭合联络线后重复。区分孤岛、收敛但越限、以及满足教学限值的状态。
  4. 编写扫描: 在 Python 中将负荷倍率从 0.5 扫描到 2.0,打印每步V₃与损耗。保留最后一次成功求解的字典到 result,展示对应电压分布。

7. 模型范围与后续内容

本章是固定平衡节点电压、恒定 PQ 的平衡稳态教学模型,未包含相间不平衡、随电压变化的负荷、变压器与分接头、逆变器能力约束、电源容量限制、线路充电和保护。孤岛被标为超出单平衡节点模型范围,其 DG 不会自动转成构网电源。后续 Unbalanced Power Flow 将放宽三相对称假设,PandaPower-based Implementation 将扩展建模流程。

参考资料