用 pypower.api 做潮流计算和最优潮流计算入门
在用 PYPOWER 做电力系统分析时,很多人最常见到的写法就是下面这种:
1 | |
或者
1 | |
这类写法之所以常见,是因为 pypower.api 本身就是一个统一导入入口。通过它可以方便地导入标准算例、潮流函数、最优潮流函数以及一些网络建模函数。
1 pypower.api 是什么
pypower.api 可以理解成一个总入口。 它把很多核心函数和标准算例统一导出,因此我们可以直接写
1 | |
而不需要分别记住每个函数位于哪个模块。
注意:
case57``runpf、opf、makeYbus都是pypower.api里直接导出的函数,而不是模块。
常见可以从 pypower.api 中直接导入的标准算例包括:
case4gscase6wwcase9case14case30case39case57case118case300
因此,像下面这种写法是很标准的:
1 | |
然后再调用
1 | |
这里的 case57() 返回的是一个 PYPOWER 的 case dict,通常包含 baseMVA、bus、gen、branch,以及在 OPF 场景下常见的 gencost。
2 潮流计算和最优潮流计算的区别
在 PYPOWER 里,潮流计算和最优潮流计算是两类不同的问题。
2.1 潮流计算
潮流计算对应的典型函数是 runpf()。
它的作用是,在给定系统参数、发电和负荷的条件下,求解系统的稳态运行点,例如:
- 母线电压幅值
- 母线电压相角
- 支路有功潮流
- 支路无功潮流
简单理解就是:
给定运行条件,求网络状态。
2.2 最优潮流计算
最优潮流对应的典型函数是 opf()。
它不只是解潮流方程,还要在各种约束下去优化某个目标,例如:
- 发电成本最小
- 某些运行代价最小
- 约束条件下的最优分配
简单理解就是:
在满足潮流方程和运行约束的前提下,求一个最优运行点。
所以可以把两者概括为:
runpf()解的是潮流问题opf()解的是优化后的潮流问题
3 用 pypower.api 做潮流计算
3.1 最小示例
1 | |
3.2 代码说明
这几行代码分别在做下面几件事。
第一步 读取标准算例
1 | |
这里读取的是 IEEE 57 节点测试系统。
第二步 设置求解选项
1 | |
这里用 ppoption() 设置 PYPOWER 的选项。 VERBOSE=0 表示减少屏幕输出。
第三步 执行潮流计算
1 | |
这里调用 runpf() 做普通潮流计算。 返回值里:
results是求解后的结果字典success表示是否成功收敛
4 提取潮流结果
潮流计算完成后,通常还需要从结果中取出母线电压和线路潮流。
示例如下:
1 | |
这里的 VM、VA、PF、PT、QF、QT 不是普通变量,而是列索引常量。 这样写的好处是代码可读性更强,不需要手动记忆矩阵第几列代表什么。
例如:
VM表示母线电压幅值所在列VA表示母线电压相角所在列PF表示支路首端有功潮流所在列PT表示支路末端有功潮流所在列
5 用 pypower.api 做最优潮流计算
如果要做最优潮流,核心函数就从 runpf() 变成了 opf()。
5.1 最小示例
1 | |
5.2 代码说明
这段代码和前面的潮流计算看起来很像,但含义不同。
1 | |
这里执行的是最优潮流求解。 它不仅要求满足潮流方程,还要在各种约束下优化目标函数。
通常在 OPF 场景下,算例中还需要 gencost 数据,因为要描述发电成本函数。
6 如何提取最优潮流结果
OPF 求解完成后,也可以从结果里读取发电机出力和其他变量。
示例如下:
1 | |
这里可以得到:
- 各发电机有功出力
- 各发电机无功出力
- 发电机上下限信息
如果你的目标是经济调度或者约束优化,这部分结果通常很重要。
7 makeYbus 是做什么的
很多代码里还会看到下面这种写法:
1 | |
它和 runpf()、opf() 不一样。 makeYbus() 不是直接用来求解潮流或最优潮流的,而是用来构造网络导纳矩阵。
7.1 最小示例
1 | |
7.2 它返回什么
Ybus表示母线导纳矩阵Yf表示与支路首端相关的矩阵Yt表示与支路末端相关的矩阵
它们常用于:
- 自己写潮流方程
- 做灵敏度分析
- 将电网模型嵌入优化或机器学习框架
- 进行约束纠正或物理一致性建模
所以,makeYbus() 更偏向网络建模工具,而不是直接的求解器。
8 常见 import 语句怎么理解
在实际代码里,经常能看到下面这种写法:
1 | |
这几句可以分开理解。
8.1 第一行在做什么
1 | |
这一行表示从统一入口导入两个核心函数:
opf用于最优潮流求解makeYbus用于构造导纳矩阵
8.2 第二行在做什么
1 | |
这一行导入的是模块。
其中:
idx_bus用来访问母线矩阵列索引idx_gen用来访问发电机矩阵列索引ppoption是选项模块
因此,这种写法下通常会这样用:
1 | |
如果你不想写两层名字,也可以直接写:
1 | |
然后就可以用:
1 | |
9 一个把三部分串起来的完整示例
下面给出一个稍完整一点的例子,把标准算例读取、导纳矩阵构造、潮流计算和最优潮流计算串起来。
1 | |
10 这几个函数应该怎么记
如果刚开始接触 PYPOWER,可以先把下面几个函数记住。
case57()
读取标准算例。
runpf()
做普通潮流计算。
opf()
做最优潮流计算。
makeYbus()
构造导纳矩阵。
ppoption()
设置求解选项。
idx_bus 和 idx_gen
按名字读取 bus 和 gen 矩阵的列索引。
11 小结
本文主要总结了 pypower.api 在潮流计算和最优潮流计算中的基本用法。
核心结论可以概括为下面几点:
pypower.api是统一导入入口,适合快速导入常用函数和标准算例runpf()用于普通潮流计算opf()用于最优潮流计算makeYbus()用于构造导纳矩阵,而不是直接求解潮流idx_bus、idx_gen和ppoption()对编写清晰代码很有帮助
如果后续还想继续深入,可以进一步研究以下内容:
ppc结构中bus、gen、branch、gencost的具体含义- 交流潮流和直流潮流的区别
- AC OPF 和 DC OPF 的建模差异
- 如何将 PYPOWER 与机器学习或优化框架结合
参考
- PYPOWER 官方 API 文档
pypower.api源码runpf、opf、makeYbus、ppoption相关模块说明