ARTICLE · 1197902
开源版BPA电力系统分析软件解读(五)潮流计算中的离散变量处理机制
聊聊 BPA 潮流计算的离散变量处理机制
上一篇讲了 BPA 的动态门槛、历史最优和控制事件清零。
这一篇继续讲离散变量的处理机制:
为什么一次潮流求解,还要分成“连续解”和“离散解”两个阶段。
如果只看牛顿迭代本身,很容易以为“不平衡量降下来就算完成”。但在 BPA 里,求解状态机还有一套独立的阶段划分。真正理解这套划分,才能看懂为什么某一轮看起来已经收敛,程序却还不结束。
01 先看官方注释
在 ipf/nrsoln.f 开头,KSWSLN 的含义写得很清楚:
text 1 - Seek continuous solution.2 - Convert to discrete values.3 - Seek discrete solution.
翻译成工程语言就是:
text 第一阶段:求连续解第二阶段:把连续量转成离散值第三阶段:求离散解
在 nrsoln 内部,这个状态会先复制到 msw:
fortran msw = kswsln
求解结束时,再把最新状态写回去:
fortran kswsln = msw
所以 kswsln 不是某个局部循环变量,而是一个会跨调用保存的求解阶段状态。
这也是为什么 nrsoln 不能简单理解成“一次算完就退出”的函数。它更像一个带阶段状态的求解引擎。
02 什么叫连续解
连续解阶段对应:
text msw = 1
它的目标是先把网络方程解到一个相对平滑的状态。
为什么叫“连续”?
因为在真正的工程设备里,有些量最终必须是离散的。例如变压器分接头通常只能一档一档地调,不可能永远停在任意小数位置。
但在牛顿迭代里,如果一开始就强制这些量只能取离散值,求解会变得很困难。控制量每次跳一档,都会给方程带来新的扰动。
所以 BPA 的第一阶段会先允许这些控制量以连续方式参与求解,先让系统稳定下来。
可以把第一阶段理解成:
text 先不管设备最终能不能停在那个位置先把方程解到一个连续、平滑、可控的状态
这就是“连续解”。
03 什么叫离散化
连续解稳定以后,程序进入:
text msw = 2
对应注释:
text Convert to discrete values.
这一步的核心任务,是把连续控制量转换成工程上真正可执行的值。
最典型的例子就是变压器分接头。连续解可能会给出一个中间值,但实际设备只能选择相邻档位。离散化就是把连续结果映射到实际可用的档位。
离散化会带来新的问题:
text 连续解算得再好一旦分接头跳到离散档位网络方程又会重新产生不平衡
所以离散化不是求解的终点,而是一个新的起点。
04 什么叫离散解
离散化完成后,程序进入:
text msw = 3
对应注释:
text Seek discrete solution.
这一阶段要做的,是在离散条件下继续求解,直到控制事件重新清零。
也就是说:
text 连续解稳定 -> 分接头等量离散化 -> 网络出现新的扰动 -> 继续迭代 -> 离散条件下重新稳定
只有走到这一步,程序才认为最终结果可以作为工程解使用。
所以 msw = 1 下看到收敛,并不代表整个潮流已经完成。
真正完整的路径是:
text 连续解收敛 -> 转离散值 -> 离散解收敛
05 状态机是怎么推进的
在 ipf/nrsoln.f 后段可以看到状态机的推进逻辑:
fortran if (msw.eq.1) then ...elseif (msw.eq.2) then msw = 3 ...else ...endif
它和前面讲的控制事件清零是配合使用的。
只有当 kownt 系列计数器全部为零时,程序才会考虑推进阶段。否则就继续做回代、继续处理控制事件、继续迭代。
所以 BPA 的求解循环可以抽象成:
text 计算不平衡量 -> 判断控制事件是否清零 -> 未清零:继续迭代 -> 已清零: msw = 1:连续解完成,进入离散化 msw = 2:执行离散化,转入离散解 msw = 3:离散解完成,输出最终结果
这也是为什么调试时只盯 dpqnu 不够。还要同时看 msw、kswsln 和 kownt 系列计数器。
06 为什么 BPA 要设计成两阶段
如果把连续解和离散解混在一起,会遇到几个问题:
- 控制量一开始就跳档,牛顿法容易震荡。
- 分接头离散化后,网络不平衡量会突然变大。
- 很难区分“方程还没收敛”和“离散化带来的新扰动”。
- 调试时无法判断当前结果到底是连续解还是工程离散解。
分成两阶段以后,逻辑就清楚多了:
text 连续解阶段:先把网络方程稳定下来离散解阶段:再处理真实设备的离散约束
这更符合工程软件的处理方式,也更方便输出中间结果和诊断日志。
07 连续解和离散解的关系
msw 和 kswsln 不是孤立的。
在 ipf/solton.f 中,进入牛顿迭代前会初始化:
fortran ittot = 0kswsln = 1idchgx = 0
这说明一次全新的潮流求解通常从连续解阶段开始。
但在 /CHANGE_PARAMETERS 这类连续参数研究中,程序可能直接从 ittot = 3 开始调用 nrsoln,不会重新走完整的前三轮启动逻辑。它沿用之前的求解状态和历史信息,继续在当前工况附近求解。
GEN_DROP 也会影响求解循环。它可能迫使程序继续迭代、重新分配发电,或者改变解耦迭代次数。所以看到 msw 没有按预期推进时,不能只看 nrsoln,还要检查 solton 和 GEN_DROP 相关逻辑。
小结
BPA 的潮流求解,不是一次牛顿迭代从头算到尾,而是:
text 先求连续解 -> 再把连续控制量转成离散值 -> 最后求离散解
连续解解决的是“方程先稳定下来”。
离散解解决的是“真实设备能不能停在那个位置”。
只有离散解也稳定,结合上一篇中的控制事件清零,程序才会给出最终的工程解。















































































