4. 高斯-赛德尔迭代法
高斯-赛德尔(Gauss-Seidel)迭代法是求解电力系统潮流方程最经典的迭代方法之一。它把节点功率方程改写为节点电压的迭代更新式,每算出一个节点的新电压就立即用于后续节点的计算,因此比同步更新的雅可比迭代收敛更快。理解它的关键在于三件事:迭代格式怎么写、什么条件下收敛、以及如何利用导纳矩阵的稀疏性提高效率。
一、迭代格式的推导
潮流计算中,对PQ节点(给定注入有功P和无功Q)可写出节点功率方程:
S_i = P_i + jQ_i = V_i · Σ Y_ik* · V_k* (k = 1..n)
把含 V_i 的项单独提出,其余节点电压移到等式右边,得到节点电压的迭代格式:
V_i^(m+1) = (1/Y_ii) · [ (P_i - jQ_i)/V_i^(m)* - Σ Y_ik · V_k^(m+1或m) ] (k ≠ i)
其中 Y_ii 是自导纳,Y_ik 是互导纳。求和项中,k < i 的节点电压已在本轮更新,用 V_k^(m+1);k > i 的节点仍用上一轮值 V_k^(m)。这正是高斯-赛德尔与雅可比迭代的唯一区别,也是它收敛更快的来源。对PV节点(给定P和电压幅值),则先按上式更新无功,再把电压幅值强制拉回给定值,相角保留迭代结果。
二、收敛条件
高斯-赛德尔迭代收敛的充分条件是迭代矩阵的谱半径小于1。对潮流问题,一个实用的判据是:导纳矩阵按行满足对角占优,即
|Y_ii| > Σ |Y_ik| (k ≠ i)
输电网络中,节点自导纳通常远大于互导纳之和,因此对角占优一般成立,迭代收敛有保障。但要注意:当网络存在重载、长距离弱联系或电压接近崩溃点时,对角占优被削弱,收敛会变慢甚至发散。工程上常用相邻两次迭代电压的最大修正量作为收敛判据:
max |V_i^(m+1) - V_i^(m)| < ε
ε 一般取 10⁻⁴~10⁻⁵(标幺值)。若迭代次数超过设定上限(如50次)仍未满足,应检查网络参数或改用牛顿-拉夫逊法。
三、稀疏性利用
导纳矩阵 Y 是高度稀疏的:一个节点通常只与2~4个相邻节点有支路连接,因此每行非零元素很少。迭代格式中的求和 Σ Y_ik·V_k 只需对非零的 Y_ik 累加,跳过所有零元素。对n个节点、每节点平均d条支路的网络,每次迭代的计算量约为 O(n·d),而不是 O(n²)。在编程实现时,常用“稀疏行表”存储:对每个节点记录其邻接节点编号和对应的 Y_ik 值,迭代时只遍历这张表。手工计算时,也应只列出与待求节点直接相连的支路,避免无效运算。
四、手工计算示例
以图中4节点网络为例,节点1为平衡节点,V₁=1.05∠0°;节点2、3为PQ节点,节点4为PV节点。设导纳矩阵已由支路参数算出,取初值 V₂⁽⁰⁾=V₃⁽⁰⁾=V₄⁽⁰⁾=1.0∠0°。第一次迭代:
- 更新节点2:代入 V₁=1.05∠0°、V₃⁽⁰⁾=1.0∠0°、V₄⁽⁰⁾=1.0∠0°,算出 V₂⁽¹⁾≈0.98∠-3.2°。
- 更新节点3:此时 V₂ 已用新值 V₂⁽¹⁾,V₄ 仍用 V₄⁽⁰⁾,算出 V₃⁽¹⁾≈0.96∠-4.5°。
- 更新节点4:先由功率方程反算 Q₄,再把电压幅值拉回1.02,得到 V₄⁽¹⁾≈1.02∠-1.8°。
比较各节点电压修正量,若最大修正量仍大于10⁻⁴,则进入第二次迭代。通常小型网络迭代5~10次即可收敛。手工计算时建议用表格逐轮记录各节点电压的幅值和相角,便于观察收敛趋势。
五、编程实现要点
用Python实现时,核心是导纳矩阵的稀疏存储和迭代循环。下面给出一个简化框架:
import numpy as np
# Ybus: n×n 复数导纳矩阵(稀疏时可改用邻接表)
# P, Q: 节点注入功率(标幺值)
# V: 节点电压初值(复数数组)
# pq: PQ节点索引列表, pv: PV节点索引列表
def gauss_seidel(Ybus, S, V0, pq, pv, tol=1e-5, max_iter=50):
V = V0.copy()
n = len(V)
for m in range(max_iter):
V_old = V.copy()
for i in range(n):
if i in pq:
# PQ节点:按迭代格式更新电压
sum_yv = sum(Ybus[i, k] * V[k] for k in range(n) if k != i)
V[i] = (1/Ybus[i, i]) * (np.conj(S[i]/V[i]) - sum_yv)
elif i in pv:
# PV节点:先算无功,再修正幅值
S_calc = V[i] * np.conj(sum(Ybus[i, k]*V[k] for k in range(n)))
Q_calc = S_calc.imag
S[i] = complex(S[i].real, Q_calc)
sum_yv = sum(Ybus[i, k]*V[k] for k in range(n) if k != i)
V[i] = (1/Ybus[i, i]) * (np.conj(S[i]/V[i]) - sum_yv)
V[i] = abs(V0[i]) * V[i] / abs(V[i]) # 幅值拉回
if max(abs(V - V_old)) < tol:
break
return V, m+1
注意:求和时用条件 if k != i 跳过自导纳项,这正是稀疏性利用的体现——实际编程中可预先建立每行的非零列索引列表,避免遍历全部n个节点。对PV节点,每次迭代后必须把电压幅值强制拉回给定值,否则会偏离约束。
六、结果判断与验证
迭代收敛后,应把求得的节点电压代回功率方程,计算各节点注入功率和支路功率,检查是否满足给定值。对PQ节点,计算出的P、Q应与给定值一致;对PV节点,计算出的P应与给定值一致,电压幅值应等于设定值。平衡节点的注入功率则由计算结果自然确定,它代表了全网的网损和功率缺额。若代回校验误差超过允许范围,说明迭代未真正收敛或导纳矩阵有误,需要重新检查。
高斯-赛德尔法结构简单、内存需求小,适合小型网络的手工计算和教学演示。但在大规模输电网络中,由于收敛速度随节点数增加而显著下降,工程上更多采用牛顿-拉夫逊法或PQ分解法。掌握高斯-赛德尔法,是理解潮流迭代思想的基础。