ARTICLE · 1251963
开源版BPA电力系统分析软件解读(七)潮流计算是“先 PQ 分解,再牛拉法”吗?
BPA 潮流计算是“先 PQ 分解,再牛拉法”吗?
BPA 基态潮流默认采用“可配置的多阶段求解”模式。先做若干轮有功、无功解耦迭代,再把当前解交给完整 Newton-Raphson 继续收敛。
可以概括为“解耦先行、牛拉收口”,但它们不是两个独立程序,而是在 solton 内前后衔接的两个阶段。
01 源码里的主线很清楚
核心入口在 ipf/solton.f。去掉输出、异常和控制代码后,主流程可以压缩成:
fortran if (iopton(1) .gt.0) thencall savslncall dcstrt(kerr)endifif (iopton(2) .gt.0) thencall savslncall cursol(kerr)endifcall nrcnvtcall nrsoln(ittot, iopton(3), idchgx, kswsln, itlow)
对应成流程图就是:
text solton +-- Decoupled 解耦迭代 | +-- dcstrt | +-- dcfact | +-- baksln | +-- Modified Newton 可选阶段 | +-- cursol | +-- nrcnvt,切换数组和索引 | +-- 完整 Newton-Raphson +-- nrsoln +-- jacltc +-- jacbus +-- nrbksl
这里最值得记住的一点是:
解耦迭代为后面的 牛拉法 准备初值。
02 三个参数决定流程怎么走
默认参数在 ipf/restop.f 中:
fortran iopton(1) = 2iopton(2) = 0iopton(3) = 40
它们分别对应:
| 参数 | 默认值 | 含义 |
|---|---|---|
iopton(1) | 2 | 解耦迭代轮数 |
iopton(2) | 0 | Modified Newton 轮数 |
iopton(3) | 40 | 完整 Newton 最大轮数 |
换成普通话就是:
text 先做 2 轮解耦迭代跳过 Modified Newton再做最多 40 轮完整 Newton-Raphson
这就是为什么从输出上看,它像“先 PQ 分解、后牛拉法”,但本质上是一套求解器内部的阶段安排。
03 第一步:dcstrt 做解耦迭代
dcstrt 是解耦阶段的入口。
它不是单纯的矩阵求解模块。进入迭代前,它还要处理串联补偿支路、母线联络、直流系统简单注入和坐标转换等网络问题。
随后调用 dcfact 分解两组方程。
ipf/dcfact.f 开头的注释写得很直接:
text THIS SUBROUTINE FACTORS THE "A" AND "C" MATRICES IN THEDECOUPLED EQUATIONS:A * T = PC * V = Q
其中:
text A * T = P,主要处理相角和有功C * V = Q,主要处理幅值和无功
dcstrt 再调用 baksln 完成回代和状态修正。
正常情况下,求解方向按下面的规律交替:
text P -> Q -> P -> Q ...
源码注释明确写了:
text Normally, it is set to alternate P - Q - P.The sequence is interrupted if a limit is hit to forceconsecutive P - P's.
也就是说,遇到限值或控制事件时,顺序可能暂时变成 P -> P -> Q。
这说明 BPA 的解耦阶段并不是只算两个固定矩阵,它还把 LTC、限值切换和母线类型控制嵌入了迭代过程。
另外,当控制事件尚未处理完时,解耦阶段可能临时延长:
fortran if (ittot+1.ge.iopton(1)) thenif (iopton(1).le.10) then iopton(1) = iopton(1) + 2endifendif
因此,默认的 2 轮是一个常规配置,不是完全不看现场情况的一刀切上限。
04 第二步:可选的 Modified Newton
解耦结束后,solton 还预留了一个中间阶段:
fortran if (iopton(2) .gt.0) thencall savslncall cursol(kerr)endif
cursol 对应程序输出中的 Modified Newton,它内部使用:
fortran itlim = iopton(2)
默认 iopton(2)=0,所以普通基态潮流通常跳过这个阶段。
可以把 BPA 的选择理解为:
text 只做解耦迭代解耦后接 Modified Newton解耦后接完整 Newton
默认走的是第三种。
05 第三步:牛顿拉夫逊法 负责最终收口
解耦阶段结束后,程序先调用 nrcnvt。
它不负责迭代,而是切换数组、指针和网络索引,为完整 Newton 阶段准备好数据结构。
接着进入 nrsoln。它的核心循环可以概括为:
text 计算当前 P/Q 不平衡量 -> 形成 LTC 相关 Jacobian -> 形成母线功率约束 Jacobian -> 判断收敛和控制事件 -> 稀疏回代得到修正量 -> 更新电压相角和幅值 -> 未收敛则进入下一轮
几个关键子程序分别是:
| 子程序 | 任务 |
|---|---|
jacltc | 形成 LTC、移相器等控制设备的 Jacobian 元素 |
jacbus | 形成母线功率约束的 Jacobian 元素 |
nrbksl | 完成稀疏回代和状态量修正 |
前面的解耦阶段主要交替处理 P 和 Q,而完整 Newton 阶段会同时考虑相角与电压幅值之间的耦合关系。
Newton 阶段的最大轮数来自 iopton(3),默认是 40。
不过,BPA 并不是只看“最后一次不平衡量是否小于门槛”就结束。nrsoln 还会维护 dpqnu、dpqlo、pqstop、itlow 和各类控制事件计数器,用于历史最优解记录、动态终止判断和限值切换。
所以完整流程是:
text 算法阶段切换 + 稀疏 Jacobian + 历史最优解 + 动态门槛 + 离散控制事件
而不只是教材里最简形式的 Newton 迭代。
06 解耦迭代与PQ分解的差别?
源码里确实有一个明确标注为PQ分解快速解耦潮流的子程序:
fortran logicalfunction dlflow(noconv, iqsww, jout)
ipf/dlflow.f 的注释写着:
text Stott's fast decoupled load-flow with compensation methodfor line outage and Q-limited PV buses.
但继续追调用位置会发现,dlflow 只在 ipf/outage.f 的事故分析路径中被调用,主要服务于:
- N-1 开断分析
- 线路开断后的潮流重算
- 补偿法处理支路开断
- Q 限值引起的 PV/PQ 切换
普通基态潮流的 solton 主线调用的是 dcstrt,不是 dlflow。
两者可以这样区分:
| 项目 | dcstrt | dlflow |
|---|---|---|
| 所属路径 | 基态潮流 solton | 事故分析 outage |
| 当前定位 | 解耦迭代阶段 | Stott 快速解耦潮流 |
| 后续衔接 | 通常交给完整 Newton | 在开断分析路径中独立完成计算 |
因此,不能因为 BPA 源码里有 dlflow,就直接说普通基态潮流一定调用了PQ分解快速解耦。
07 小结
第一,BPA 默认不是“先 PQ分解 快速潮流,再跑独立牛拉潮流”,而是在 solton 内部分阶段衔接。
第二,默认配置确实先做 2 轮解耦迭代,跳过 Modified Newton,再用最多 40 轮完整 Newton-Raphson 收口。
第三,dcstrt 是基态潮流的解耦阶段,dlflow 是事故分析中明确标注为 Stott 快速解耦的另一条路径,两者不能混为一谈。
一句话概括这套设计:
先用解耦迭代把解带到更合适的位置,再让 牛拉法 处理耦合关系、限值和控制事件,最终完成收敛。















































































