夜雨聆风学习资料网

ARTICLE · 1251963

开源版BPA电力系统分析软件解读(七)潮流计算是“先 PQ 分解,再牛拉法”吗?

开源版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)0Modified 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。

两者可以这样区分:

项目dcstrtdlflow
所属路径基态潮流 solton事故分析 outage
当前定位解耦迭代阶段Stott 快速解耦潮流
后续衔接通常交给完整 Newton在开断分析路径中独立完成计算

因此,不能因为 BPA 源码里有 dlflow,就直接说普通基态潮流一定调用了PQ分解快速解耦。


07 小结

第一,BPA 默认不是“先 PQ分解 快速潮流,再跑独立牛拉潮流”,而是在 solton 内部分阶段衔接。

第二,默认配置确实先做 2 轮解耦迭代,跳过 Modified Newton,再用最多 40 轮完整 Newton-Raphson 收口。

第三,dcstrt 是基态潮流的解耦阶段,dlflow 是事故分析中明确标注为 Stott 快速解耦的另一条路径,两者不能混为一谈。

一句话概括这套设计:

先用解耦迭代把解带到更合适的位置,再让 牛拉法 处理耦合关系、限值和控制事件,最终完成收敛。

相关学习资料