← 返回 Physics-informed GNN 课程

Physics-informed GNN · 第 6 模块

Physics-informed GNN · 微电网 N-1 安全预测

平衡潮流告诉我们电压必须满足哪些方程,GNN 入门介绍了怎样让节点交换信息。本章将两者连接起来:GNN 预测复电压,AC 方程检查这些电压是否解释了给定的负荷与网络,再把失配加入训练 loss。 训练后逐条退出线路,用预测电压计算电流,筛查微电网 N-1 工况。

本章目标:从给定 PQ、图结构和线路参数写出可微物理残差;解释标签项、物理项和参考节点边界;完成纯数据 / Physics-informed 对照训练;识别“残差小”“预测准”和“工况未越限”之间的区别。

1. 从电压回归走向物理约束

上一章用线性电压近似说明消息传递;本章参考标签改为完整的平衡 AC 潮流。继续使用五节点微电网:节点 1 是唯一外部电压源,节点 2 为带负荷的连接节点,节点 3、5 接负荷,节点 4 接负荷与固定 PQ 光伏。为观察有备用供电路径时的故障,增加 1–3 线路;默认 3–5 联络线也闭合。两条路径都接向同一个节点 1,并没有新增第二个电压源。

① 给定工况P、Q、线路 r/x、故障后连接关系。没有已求解的电压标签作为输入。
② GNN 输出四层消息传递 → 各 PQ 节点的 Re(V)、Im(V)。参考节点硬固定。
③ AC 残差 → lossYbus V → I → S。检查预测电压与指定功率是否一致,反传至 θ。
④ 安全筛查固定 θ,逐个故障推理,再检查失供、电压和电流限值。

先明确假设、单位与符号

  • 平衡三相稳态;线路只含串联阻抗,无变压器、并联电纳、调压器。负荷与逆变器均为指定的恒定 PQ,没有 PV 电压控制。
  • 三相功率基值 1 MVA,线电压基值 0.4 kV,因此 Zbase = 0.16 Ω、Ibase = 1443.376 A。下文 V、P、Q、r、x 及潮流方程均用 pu;kW/kvar 在输入时换算。
  • Pnet、Qnet 以消耗为正:净负荷 = 负荷 − 发电。AC 方程的 Sinj 以注入网络为正,所以 PQ 节点指定 Sinj = −Pnet − jQnet。
  • 节点 1 固定 V₁ = 1 + j0。其输入 P = Q = 0 是占位值,实际供电由 AC 解决定,不能强迫参考节点满足“零注入”。光伏 Q = 0,不会在断网后自动形成电压。
节点倍率为 1 时的负荷发电 / 输入约定
1外部参考源V = 1∠0;P/Q 输入占位为 0
280 kW / 30 kvar无发电
3100 kW / 40 kvar无发电
460 kW / 25 kvar默认光伏 50 kW,Q = 0
5默认 100 kW / 40 kvar可改基准 kW,Q/P = 0.4

负荷倍率作用于所有负荷,光伏独立设置。默认负荷倍率 1.2,所以节点 4 净功率为 22 kW / 30 kvar。

线路r pux pu电流额定值 pu(A)
1–20.0400.0250.50(721.69)
2–30.0600.0350.22(317.54)
2–40.0500.0300.22(317.54)
4–50.0550.0350.18(259.81)
3–50.0800.0500.18(259.81)
1–30.0700.0450.45(649.52)

这些是教学算例的假定参数与额定值。阻抗倍率缩放 r/x,额定值倍率单独缩放电流上限。

2. 从复电压推导 AC 物理残差

用 c 表示基准工况或某个单线路退出工况。每个 c 都要同时重建计算弧和导纳矩阵 Yᶜ。线路 i–j 退出时,去掉两个方向的消息弧,也去掉该线路对 Yii、Yjj 的 +yij 和对 Yij、Yji 的 −yij 贡献。其中小写 yij = 1/(rij + jxij) 是线路导纳,大写 Yij 是节点导纳矩阵元素。

电压状态GNN 给出 u、w;它们是可求导的连续输出。
网络电流Ir = Gu − Bw
Ii = Bu + Gw
节点功率Pcalc = u Ir + w Ii
Qcalc = w Ir − u Ii
与指定值比较rP = Pcalc + Pnet
rQ = Qcalc + Qnet

因此对于 PQ 节点集合 ℒ = {2,3,4,5}:

准确潮流解应使上述失配接近零;GNN 输出通常不完全满足。参考源节点的 P、Q 不加入残差,因为其供电并非预先指定。模型直接令 V̂₁ = 1 + j0,是硬边界;对 PQ 节点功率平衡使用有限权重的 loss,是软约束。

例题:残差里的正负号

默认倍率 1.2 时,节点 2 消耗 0.096 + j0.036 pu。若某个预测状态产生的网络注入为 −0.090 − j0.030 pu,则 rP,2 = +0.006、rQ,2 = +0.006 pu。它尚未解释给定消耗。取功率尺度 sS = 0.2 pu,这一节点的两个归一化残差均为 0.03;在四个 PQ 节点、八项平均中,该节点贡献 (0.03² + 0.03²)/8 = 0.000225。电流和功率均由同一组预测电压计算,没有额外的隐藏标签。

3. 把物理方程加入 loss

一张图的标签项使用复电压实部、虚部;物理项使用 PQ 功率失配。固定 sV = 0.05 pu、sS = 0.2 pu,避免直接把不同单位和尺度的误差相加。

将有标签的训练图集合记为 𝒟L,全部训练输入 / 配点图集合记为 𝒟C。一个无标签图仍提供线路参数和指定 PQ,所以可以计算物理项,但不能计算监督项。

两项分别按自己的样本数平均。无标签时监督项省略;无标签且 λ = 0 就没有训练信号,不能把随机初始化叫作训练完成。λ 是归一化后两项的权衡,不是满足约束的概率。改变归一化尺度也会改变相同 λ 的意义。

为什么不惩罚所有越限,让模型输出“安全”?

功率平衡等式描述可行的电气状态,其中既有安全状态,也有过载、欠压状态。安全预测必须保留危险工况的真实电压和电流。若对所有输入都加入“必须在限值内”的惩罚,可能会把真正的危险输出推向看似安全,反而破坏任务。

本章 loss 不含电压 / 电流不等式惩罚;限值用于推理后的筛查。在可控的调度优化任务中,可以把发电、负荷削减等控制量作为决策变量,并有条件地处理不等式;那与本章“固定 PQ 下预测实际状态”是不同的问题。

4. 用一个电压扰动看见 loss

下方工作台联动第 8 节安全表中选中的故障,默认退出 2–4。先保持 AC 电压无扰动,物理残差应接近求解容差;再给 Re(V₅) 加 0.01 pu。因为 Ybus 将邻接节点耦合起来,失配会出现在节点 5 及其接通邻居。对照故障后与故障前矩阵的结果,检查拓扑是否用对。

Loss 工作台 · 在固定输出上观察物理项

使用安全表中选中的工况。先选 AC 参考,再把节点 5 的实部扰动到 +0.01 pu,观察失配如何出现在该节点及邻居。扰动只作用于本面板,不改变安全表。

Ldata—
Lphys—
λ Lphys—
Ldata + λ Lphys—

ΔP, ΔQ · pu

ΔPΔQ

按当前拓扑计算

此处用干净 AC 参考演示单工况 Ldata;训练面板另外施加标签掩码与噪声。改变 λ 会立即改变这个固定输出的 loss;重新训练后 θ 才会改变。这里同时显示误用基准 Ybus 的残差,帮助检查 N-1 拓扑是否正确更新。

5. GNN 输出怎样得到物理梯度?

沿用上一章的输入 xᵢ = [Pnet/0.2 pu, Qnet/0.1 pu, ref],每条在运物理线路展开为双向计算弧。本章采用六维隐藏状态、四层同步消息传递;下列矩阵在节点和消息层之间共享,共 146 个可训练参数。

阻抗门控 a 是人工选择的特征变换,不是导纳。空邻居的 mean 取零。读出没有把电压裁剪到安全区间。模型不使用节点编号、画图坐标、AC 标签或参考源的已求解功率作为输入。

上式给出一张图的梯度;训练时再对配点图平均。AC 运算由加、乘、共轭和固定 Ybus 构成,对 u、w 可微。先计算残差对电压的梯度,再穿过读出、tanh、聚合与四层共享计算反向传播。训练时不需要对 Newton 求解器反传;本例用解析导数与完整反向传播,代码可以逐行检查。全部 146 个参数的联合梯度通过中心差分检验;参考潮流另与 pandapower 核对。

6. 控制变量训练与诚实的验证

固定种子生成 8 个训练运行工况组和另外 3 个验证组;每组先确定负荷、光伏、阻抗,再扩展为基准与六种已知退出,共 56 个训练图、21 个验证图。先分运行组,再扩展故障,避免同一个运行点的不同故障跨到训练与验证两边。

运行组范围:负荷倍率 0.6–1.5,节点 5 基准负荷 60–160 kW,光伏 0–100 kW,阻抗倍率 0.8–1.2;均以默认六线路拓扑为基准。默认仅前 2 个训练组有标签,即 14 张图,其余 42 张图只有物理输入。无标签图不求解或存储 AC 电压供训练使用。标签实部与虚部分别叠加 σ = 0.002 pu 的独立高斯噪声;验证使用干净 AC 标签,且不参与梯度。

控制变量实验 · 纯数据与 Physics-informed GNN

两者使用相同初始化、工况组、标签、优化器和轮数,只有物理项权重不同。默认载入由完整 Python 源码生成的课程权重,可立即运行;也可以在浏览器重新训练。

正在加载课程默认权重…

验证指标 · raw GNN纯数据PI-GNN

验证电压 MAE(pu)

验证功率残差 RMS(pu)

纯数据 GNNPI-GNN · raw

验证集为另外 3 个运行工况组,共 21 个案例,包含相同的 6 类线路退出;它评估新运行值,不证明全新拓扑的泛化。以上指标始终统计 raw GNN,不包含可选 Newton 校正。误判为安全 = AC 已越限、GNN 却预测未越限。

当前 loss 记录、训练设置与完整模型权重
下载课程默认模型快照

默认 400 epochs、Adam 学习率 0.003。固定数据、初始化和优化设置,纯数据组 λ = 0,PI 组 λ = 1。课程快照的验证结果:功率残差 RMS 从纯数据的约 0.04217 pu 降到 PI 的 0.02441 pu;电压幅值 MAE 却从 0.00445 pu 变为 0.00577 pu。物理项在这个实验中改善了方程一致性,但没有改善电压 MAE。 这是带噪标签、有限模型与有限训练下可能出现的权衡。

两组默认都把验证集 3 个 AC 不安全工况误判为安全。总体正确 18/21 看起来不低,但对危险工况的检出率为 0。检查误判比只展示平均 loss 或总体准确率更有教学意义。尝试改变 λ、标签比例、噪声和轮数,记录各指标;不要预设 PI 必然胜出。调参用验证组,最终报告还需要独立测试组,Notebook 提供一个留出组示例。

7. 从状态预测得到 N-1 安全判据

固定训练后的 θ,枚举基准工况和当前每条在运线路单独退出。每次从原基准分别退出一条,故障不累积。 对每个 c,先检查是否仍可连到唯一参考源;然后从预测电压计算:

  • 有失供节点,直接由图连接判为不通过;固定 PQ 光伏不承担孤岛电压参考。
  • 已供电工况中,任一节点电压或在运线路电流越限即不通过。默认电压带为 0.95–1.05 pu。
  • AC 数值求解失败为未知;缺少训练权重时模型结果也为未知。已知失供与数值失败有不同含义。
  • 总判据包含基准工况及全部候选:任一不通过则总判据不通过;没有不通过但存在未知则总判据未知;全部满足才显示未越限。模型列是预测,需要 AC 或其他可信分析验证。

一次物理校正是什么?

可选地从 PI-GNN 输出出发,用故障后 Jacobian 做一次带回溯的 Newton 步,再检查安全限值。它使用数值求解器计算,是推理之后的独立步骤;页面会标为“PI + 1 Newton”。训练面板的验证指标始终使用 raw GNN。单步校正不等于收敛证明,低残差也不等于没有越限。

本例只筛查平衡 AC 静态、固定 PQ、无再调度的单线路退出,不评价暂态稳定性、频率、保护配合、设备控制或源容量。三相不平衡扩展可以让 GNN 预测 Vabc(必要时含中性线),再用 不平衡潮流的逐相 / 中性线方程替换残差;正负零序是输出分析工具,不能代替适用的相域物理模型。

8. 微电网 N-1 交互实验

先点“轻载”,再点“高负荷”,比较 AC 与两个模型的判断。默认双路径网每个单故障都保持连接;“观察失供”会回到 1–3 断开的馈线并退出 1–2。改变电流额定值只改变安全边界,不应改变 GNN 电压或功率残差。改变负荷 / 光伏 / 阻抗则改变物理输入。

微电网 N-1 筛查 · 平衡 AC

当前基准工况 + 每条接通线路单独退出

AC 参考 · N-1 总判据—
纯数据 GNN · 预测—
PI-GNN—
工况(点击查看)AC纯数据PI-GNNAC min |V|AC max I/ImaxPI RMS ΔS (pu)

总判据包含基准工况和当前全部候选故障。已知失供为“不通过”;AC 数值未收敛为“未知”,不会伪装成零电压或直接判成不安全。模型列是预测判据;低残差本身不保证未越限。

节点电压幅值

支路电流 / 额定值

AC纯数据 GNNPI-GNN
查看当前工况的电压、角度、线路与安全判据明细
BusAC |V|Data |V|PI |V|AC θ°PI θ°
Linestatusr / x puImax AAC I API I A

9. 阅读、运行和修改完整 Python

折叠的 model.py 包含从图、AC 残差到全部反向传播和训练的实现。main.py 负责选择输入、调用当前权重、枚举故障并输出结果。默认推理不调用 pandapower;AC 参考由单独的 solve_ac() 计算。Python 面板独立执行,返回值直接用于其图表。

1 · 输入、模型权重与函数来源

case.operating 是物理控件快照,case.models 含当前两个模型的 146 个参数,case.selected_outage 与 case.correct_physics 控制输出展示及独立校正步骤。下面折叠预览省略权重数值;完整数组可在训练面板展开。

2 · 展开 model.py:完整 AC、GNN、loss 与反向传播

仅依赖标准库 math。build_graph() 重建图与 Ybus;predict() 只做 GNN 前向;objective() 计算归一化损失及电压梯度;backward() 将梯度传回全部参数;train_model() 训练。solve_ac() 生成参考,screen() 枚举故障,refine() 是可选的独立 Newton 单步。推理默认不调用 pandapower。

3 · main():预测状态,再计算安全判据

下载完整模型

首次运行联网下载 Pyodide,计算在独立 Worker 中完成。默认 Python 实验使用当前权重做推理与参考对照;可在 main 中单独调用 train_model() 重新训练。源码或参数修改只作用于代码实验,可下载保存。

准备运行。

10. 练习与下载

  1. 在默认退出 2–4 的 AC 电压上,把 Re(V₅) 增加 0.01 pu,记录 ΔP/ΔQ。哪些接通邻居出现失配?误用基准 Ybus 有什么后果?
  2. 保持同一预测输出,把 λ 从 0 调到 2;哪些数字立即变化?重新训练后,变化的对象又是什么?
  3. 标签比例设为 0、λ = 0,然后训练。为什么纯数据组保持未知?λ > 0 时无标签图提供哪些训练信息?
  4. 用两组默认模型查看高负荷工况,找出一次“误判为安全”。分别比较电压误差、功率残差和越限距离。
  5. 开启一次 Newton 校正,记录前后的最大功率残差和判断;解释为什么不能把校正后的结果记为 raw GNN 表现。
  6. 若目标是“未见过的线路故障”或“未见过的网络”,如何重新按故障 / 拓扑划分训练、验证、测试?当前按运行组的划分回答了哪个问题?