Physics-informed GNN · 微电网与配电系统
Balanced Power Flow · 平衡潮流
为什么负荷增加时馈线电压会下降?本地发电能否使潮流反向?无功支撑会改变什么?本章从模型推导出发,计算一个具体例题,再通过参数实验与 Python 验证你的预测。
1. 背景:微电网的一个运行快照
潮流计算描述的是一个稳态运行点。给定网络阻抗、负荷、发电与电压参考,求解节点电压,再计算线路电流、功率传输和损耗。对于微电网与配电馈线,这些结果可以帮助判断切换操作前后的电压下降、反向潮流与线路负载情况。
平衡三相系统中,三相幅值相等,相角相差 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 · 网络与线路状态
2 · 这条线路对 Y 的贡献(ΔY)
| i | j | |
|---|---|---|
| i | ΔYii= + yᵢⱼ | ΔYij= − yᵢⱼ |
| j | ΔYji= − yᵢⱼ | ΔYjj= + yᵢⱼ |
ΔY 表示这条线路对矩阵的增量。展开两端电流方程,这条线路为两端的自导纳各加上 +y,为两个对应的非对角元素各加上 −y;完整 Y 还需累加其他接通线路的贡献。
3 · 把接通线路的贡献相加
| Y | i | j | k |
|---|---|---|---|
| i | Yii= yᵢⱼ | Yij= − yᵢⱼ | Yik= 0 |
| j | Yji= − yᵢⱼ | Yjj= yᵢⱼ + yⱼₖ | Yjk= − yⱼₖ |
| k | Yki= 0 | Ykj= − yⱼₖ | Ykk= yⱼₖ |
浅蓝色对角元素是自导纳,如 Yii;其值累加节点 i 所有接通线路的导纳。只有 i–j 接通时,Yii = yij;再接通 i–k,就变为 Yii = yij + yik。橙色只标出正在跟踪的线路贡献。
步骤 C:从电流得到复功率注入
规定向网络供电的净注入为正:Pspec = PG − PD,Qspec = QG − QD。将基尔霍夫电流定律与 S = VI* 结合:
把发电和负荷合并为节点净注入
令 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 的导数,因此下面的更新采用加号:
一次牛顿迭代在做什么?
- 初始化电压给出 PQ 节点幅值和相角的初始估计。
x⁽⁰⁾ = [θ, v] - 计算功率偏差由当前 V 和 Y 算出 P、Q,再与指定量比较。
Δs = sˢᵖᵉᶜ − s(x) - 检查是否收敛最大偏差是否小于容差?满足则输出电压;否则继续。
‖Δs‖∞ < ε ? - 求解并更新用雅可比计算修正量,再用步长 α 更新。
J Δx = Δsx ← x + α Δx
实现采用解析雅可比矩阵、带主元选择的消元和回溯步长 α,使偏差下降并保持电压幅值为正。停止条件为 ‖Δs‖∞ < 10−10 pu;迭代停滞或完成 30 次更新仍不收敛时报告失败。算法不收敛本身并不能证明物理系统不存在解。
步骤 F:计算线路功率与损耗
根据节点电压计算线路电流,再计算两端注入线路的复功率,其和为线路复损耗。本模型只有串联阻抗,两端电流幅值相同。
3. 例题:400 V 馈线
建立馈线与节点设置
考虑一个 400 V 三节点配电馈线。节点 1 是上级电源,通过线路 1–2 向节点 2 供电,再通过线路 2–3 向下游节点 3 供电。线路 1–3 是常开联络线,后续实验中可以将其闭合,形成替代供电路径。
例题网络:参考电源、两个 PQ 节点与联络线
左右滑动查看完整示意图。
| 节点 | 设备与指定量 | 潮流节点类型 |
|---|---|---|
| 1 | 上级电源,电压固定为 1∠0° pu | 平衡 / 参考节点 |
| 2 | 120 kW 负荷,功率因数 0.95 滞后 | PQ |
| 3 | 180 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–2 | 0.012 + j0.008 | 0.075 + j0.050 |
| 2–3 | 0.008 + j0.006 | 0.050 + j0.0375 |
| 1–3,常开联络线 | 0.022 + j0.014 | 0.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箭头:有功方向;线宽:电流大小;红色与文字标记:越限。正无功注入表示支撑,负值表示吸收。
正在初始化实验…
电压分布
线路电流负载率
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 区则运行下方可编辑的模型源码。
先看代码如何连接
- case滑块提供输入字典
- balanced_power_flow.py源码定义模型函数
- 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 / open13 | radial 为辐射状、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 前的 #,比较无功支撑前后的电压和损耗。
首次运行需联网下载 Python 环境;计算在浏览器内完成,不需安装软件。求解器只用 Python 标准库。
准备运行。
怎样读输出?
ok 表示数值求解是否收敛;buses 中的 vm_pu、theta_deg 是节点 1–3 的电压幅值与相角;loss_kw 是总有功损耗;slack_p_kw 是参考电源有功;violations 列出越限。收敛并不等于满足限值。
“下载实验”包含当前输入、当前模型源码和当前主程序,可以作为一个完整的 .py 文件运行。
输出将在这里显示。
代码运行结果:电压分布
6. 练习与解释
- 功率因数: 有功负荷保持不变,将功率因数从 0.95 降至 0.80。记录电流、最低电压与损耗,用 S = P + jQ 和 I = (S/V)* 解释变化。
- 无功支撑: 负荷倍率为 2.0 时,在节点 3 注入 60 kvar。与无支撑状态比较,能否消除所有电压越限?用实验验证。
- N-1 拓扑: 在辐射型网络中断开线路 1–2,再在闭合联络线后重复。区分孤岛、收敛但越限、以及满足教学限值的状态。
编写扫描: 在 Python 中将负荷倍率从 0.5 扫描到 2.0,打印每步 V₃ 与损耗。保留最后一次成功求解的字典到 result,展示对应电压分布。
7. 模型范围与后续内容
本章是固定平衡节点电压、恒定 PQ 的平衡稳态教学模型,未包含相间不平衡、随电压变化的负荷、变压器与分接头、逆变器能力约束、电源容量限制、线路充电和保护。孤岛被标为超出单平衡节点模型范围,其 DG 不会自动转成构网电源。后续 Unbalanced Power Flow 将放宽三相对称假设,PandaPower-based Implementation 将扩展建模流程。
参考资料
- MATPOWER:AC 潮流:节点类型与牛顿求解。
- MATPOWER:功率注入的电压导数:解析电压灵敏度。
- pandapower:平衡 AC 潮流:后续实现模块的算法接口。
- Pyodide:在浏览器 Worker 内执行 Python:代码区运行方式。