用 pypower.api 做潮流计算和最优潮流计算入门

在用 PYPOWER 做电力系统分析时,很多人最常见到的写法就是下面这种:

1
from pypower.api import case57, runpf

或者

1
from pypower.api import case57, opf, makeYbus

这类写法之所以常见,是因为 pypower.api 本身就是一个统一导入入口。通过它可以方便地导入标准算例、潮流函数、最优潮流函数以及一些网络建模函数。

1 pypower.api 是什么

pypower.api 可以理解成一个总入口。 它把很多核心函数和标准算例统一导出,因此我们可以直接写

1
from pypower.api import case57, runpf, opf, makeYbus

而不需要分别记住每个函数位于哪个模块。

注意:case57``runpfopfmakeYbus 都是 pypower.api 里直接导出的函数,而不是模块。

常见可以从 pypower.api 中直接导入的标准算例包括:

  • case4gs
  • case6ww
  • case9
  • case14
  • case30
  • case39
  • case57
  • case118
  • case300

因此,像下面这种写法是很标准的:

1
from pypower.api import case57

然后再调用

1
ppc = case57()

这里的 case57() 返回的是一个 PYPOWER 的 case dict,通常包含 baseMVAbusgenbranch,以及在 OPF 场景下常见的 gencost


2 潮流计算和最优潮流计算的区别

在 PYPOWER 里,潮流计算和最优潮流计算是两类不同的问题。

2.1 潮流计算

潮流计算对应的典型函数是 runpf()

它的作用是,在给定系统参数、发电和负荷的条件下,求解系统的稳态运行点,例如:

  • 母线电压幅值
  • 母线电压相角
  • 支路有功潮流
  • 支路无功潮流

简单理解就是:

给定运行条件,求网络状态。

2.2 最优潮流计算

最优潮流对应的典型函数是 opf()

它不只是解潮流方程,还要在各种约束下去优化某个目标,例如:

  • 发电成本最小
  • 某些运行代价最小
  • 约束条件下的最优分配

简单理解就是:

在满足潮流方程和运行约束的前提下,求一个最优运行点。

所以可以把两者概括为:

  • runpf() 解的是潮流问题
  • opf() 解的是优化后的潮流问题

3 用 pypower.api 做潮流计算

3.1 最小示例

1
2
3
4
5
6
from pypower.api import case57, runpf
from pypower.ppoption import ppoption

ppc = case57()
ppopt = ppoption(VERBOSE=0)
results, success = runpf(ppc, ppopt)

3.2 代码说明

这几行代码分别在做下面几件事。

第一步 读取标准算例

1
ppc = case57()

这里读取的是 IEEE 57 节点测试系统。

第二步 设置求解选项

1
ppopt = ppoption(VERBOSE=0)

这里用 ppoption() 设置 PYPOWER 的选项。 VERBOSE=0 表示减少屏幕输出。

第三步 执行潮流计算

1
results, success = runpf(ppc, ppopt)

这里调用 runpf() 做普通潮流计算。 返回值里:

  • results 是求解后的结果字典
  • success 表示是否成功收敛

4 提取潮流结果

潮流计算完成后,通常还需要从结果中取出母线电压和线路潮流。

示例如下:

1
2
3
4
5
6
7
8
9
10
from pypower.idx_bus import VM, VA
from pypower.idx_brch import PF, PT, QF, QT

vm = results["bus"][:, VM]
va = results["bus"][:, VA]

pf = results["branch"][:, PF]
pt = results["branch"][:, PT]
qf = results["branch"][:, QF]
qt = results["branch"][:, QT]

这里的 VMVAPFPTQFQT 不是普通变量,而是列索引常量。 这样写的好处是代码可读性更强,不需要手动记忆矩阵第几列代表什么。

例如:

  • VM 表示母线电压幅值所在列
  • VA 表示母线电压相角所在列
  • PF 表示支路首端有功潮流所在列
  • PT 表示支路末端有功潮流所在列

5 用 pypower.api 做最优潮流计算

如果要做最优潮流,核心函数就从 runpf() 变成了 opf()

5.1 最小示例

1
2
3
4
5
6
from pypower.api import case57, opf
from pypower.ppoption import ppoption

ppc = case57()
ppopt = ppoption(VERBOSE=0)
results = opf(ppc, ppopt)

5.2 代码说明

这段代码和前面的潮流计算看起来很像,但含义不同。

1
results = opf(ppc, ppopt)

这里执行的是最优潮流求解。 它不仅要求满足潮流方程,还要在各种约束下优化目标函数。

通常在 OPF 场景下,算例中还需要 gencost 数据,因为要描述发电成本函数。


6 如何提取最优潮流结果

OPF 求解完成后,也可以从结果里读取发电机出力和其他变量。

示例如下:

1
2
3
4
5
6
from pypower.idx_gen import PG, QG, PMAX, PMIN

pg = results["gen"][:, PG]
qg = results["gen"][:, QG]
pmax = results["gen"][:, PMAX]
pmin = results["gen"][:, PMIN]

这里可以得到:

  • 各发电机有功出力
  • 各发电机无功出力
  • 发电机上下限信息

如果你的目标是经济调度或者约束优化,这部分结果通常很重要。


7 makeYbus 是做什么的

很多代码里还会看到下面这种写法:

1
from pypower.api import makeYbus

它和 runpf()opf() 不一样。 makeYbus() 不是直接用来求解潮流或最优潮流的,而是用来构造网络导纳矩阵。

7.1 最小示例

1
2
3
4
from pypower.api import case57, makeYbus

ppc = case57()
Ybus, Yf, Yt = makeYbus(ppc["baseMVA"], ppc["bus"], ppc["branch"])

7.2 它返回什么

  • Ybus 表示母线导纳矩阵
  • Yf 表示与支路首端相关的矩阵
  • Yt 表示与支路末端相关的矩阵

它们常用于:

  • 自己写潮流方程
  • 做灵敏度分析
  • 将电网模型嵌入优化或机器学习框架
  • 进行约束纠正或物理一致性建模

所以,makeYbus() 更偏向网络建模工具,而不是直接的求解器。


8 常见 import 语句怎么理解

在实际代码里,经常能看到下面这种写法:

1
2
from pypower.api import opf, makeYbus
from pypower import idx_bus, idx_gen, ppoption

这几句可以分开理解。

8.1 第一行在做什么

1
from pypower.api import opf, makeYbus

这一行表示从统一入口导入两个核心函数:

  • opf 用于最优潮流求解
  • makeYbus 用于构造导纳矩阵

8.2 第二行在做什么

1
from pypower import idx_bus, idx_gen, ppoption

这一行导入的是模块。

其中:

  • idx_bus 用来访问母线矩阵列索引
  • idx_gen 用来访问发电机矩阵列索引
  • ppoption 是选项模块

因此,这种写法下通常会这样用:

1
2
3
opt = ppoption.ppoption(VERBOSE=0)
vmax = ppc["bus"][:, idx_bus.VMAX]
pmax = ppc["gen"][:, idx_gen.PMAX]

如果你不想写两层名字,也可以直接写:

1
from pypower.ppoption import ppoption

然后就可以用:

1
opt = ppoption(VERBOSE=0)

9 一个把三部分串起来的完整示例

下面给出一个稍完整一点的例子,把标准算例读取、导纳矩阵构造、潮流计算和最优潮流计算串起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from pypower.api import case57, runpf, opf, makeYbus
from pypower.ppoption import ppoption
from pypower.idx_bus import VM, VA
from pypower.idx_gen import PG, QG

# 读取标准算例
ppc = case57()

# 构造导纳矩阵
Ybus, Yf, Yt = makeYbus(ppc["baseMVA"], ppc["bus"], ppc["branch"])

# 普通潮流计算
pf_opt = ppoption(VERBOSE=0)
pf_results, success = runpf(ppc, pf_opt)

if success:
vm = pf_results["bus"][:, VM]
va = pf_results["bus"][:, VA]
print("Power flow converged")
print("Voltage magnitude =", vm)
print("Voltage angle =", va)

# 最优潮流计算
opf_opt = ppoption(VERBOSE=0)
opf_results = opf(ppc, opf_opt)

pg = opf_results["gen"][:, PG]
qg = opf_results["gen"][:, QG]

print("Optimal generator active power =", pg)
print("Optimal generator reactive power =", qg)

10 这几个函数应该怎么记

如果刚开始接触 PYPOWER,可以先把下面几个函数记住。

case57()

读取标准算例。

runpf()

做普通潮流计算。

opf()

做最优潮流计算。

makeYbus()

构造导纳矩阵。

ppoption()

设置求解选项。

idx_busidx_gen

按名字读取 busgen 矩阵的列索引。


11 小结

本文主要总结了 pypower.api 在潮流计算和最优潮流计算中的基本用法。

核心结论可以概括为下面几点:

  1. pypower.api 是统一导入入口,适合快速导入常用函数和标准算例
  2. runpf() 用于普通潮流计算
  3. opf() 用于最优潮流计算
  4. makeYbus() 用于构造导纳矩阵,而不是直接求解潮流
  5. idx_busidx_genppoption() 对编写清晰代码很有帮助

如果后续还想继续深入,可以进一步研究以下内容:

  • ppc 结构中 busgenbranchgencost 的具体含义
  • 交流潮流和直流潮流的区别
  • AC OPF 和 DC OPF 的建模差异
  • 如何将 PYPOWER 与机器学习或优化框架结合

参考

  1. PYPOWER 官方 API 文档
  2. pypower.api 源码
  3. runpfopfmakeYbusppoption 相关模块说明

用 pypower.api 做潮流计算和最优潮流计算入门
https://nanana-szz.github.io/01-pypower/
作者
John Doe
发布于
2026年3月30日
许可协议