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 PQ P₂=-0.5, Q₂=-0.3 3 PQ P₃=-0.6, Q₃=-0.4 4 PV P₄=0.4, |V₄|=1.02 z₁₂=0.02+j0.06 z₂₃=0.03+j0.08 z₂₄=0.025+j0.07 z₃₄=0.04+j0.10 第 m+1 次迭代:逐节点更新 节点2:用 V₁^(m+1)、V₃^(m)、V₄^(m) V₂^(m+1) = (1/Y₂₂)[(P₂-jQ₂)/V₂^(m)* - Y₂₁V₁ - Y₂₃V₃ - Y₂₄V₄] 节点3:用 V₁^(m+1)、V₂^(m+1)、V₄^(m) V₃^(m+1) = (1/Y₃₃)[(P₃-jQ₃)/V₃^(m)* - Y₃₁V₁ - Y₃₂V₂ - Y₃₄V₄] 节点4(PV):先算Q₄,再修正|V₄| Q₄ = Im{V₄*·ΣY₄ₖVₖ},然后 |V₄|←1.02 收敛判断 max|ΔVᵢ| < ε ? 是→输出;否→m=m+1 继续 稀疏性利用 Y₂₃=0 时跳过该项,只累加非零 Y₂ₖ 每节点仅遍历邻接表,计算量 O(n·d)

四、手工计算示例

以图中4节点网络为例,节点1为平衡节点,V₁=1.05∠0°;节点2、3为PQ节点,节点4为PV节点。设导纳矩阵已由支路参数算出,取初值 V₂⁽⁰⁾=V₃⁽⁰⁾=V₄⁽⁰⁾=1.0∠0°。第一次迭代:

  1. 更新节点2:代入 V₁=1.05∠0°、V₃⁽⁰⁾=1.0∠0°、V₄⁽⁰⁾=1.0∠0°,算出 V₂⁽¹⁾≈0.98∠-3.2°。
  2. 更新节点3:此时 V₂ 已用新值 V₂⁽¹⁾,V₄ 仍用 V₄⁽⁰⁾,算出 V₃⁽¹⁾≈0.96∠-4.5°。
  3. 更新节点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节点,每次迭代后必须把电压幅值强制拉回给定值,否则会偏离约束。

工程提示:高斯-赛德尔法收敛速度与节点编号顺序有关。把平衡节点和PV节点排在前面、PQ节点按电气距离由近及远编号,通常能减少迭代次数。若迭代超过30次仍不收敛,应检查导纳矩阵是否对角占优,或改用牛顿-拉夫逊法。

六、结果判断与验证

迭代收敛后,应把求得的节点电压代回功率方程,计算各节点注入功率和支路功率,检查是否满足给定值。对PQ节点,计算出的P、Q应与给定值一致;对PV节点,计算出的P应与给定值一致,电压幅值应等于设定值。平衡节点的注入功率则由计算结果自然确定,它代表了全网的网损和功率缺额。若代回校验误差超过允许范围,说明迭代未真正收敛或导纳矩阵有误,需要重新检查。

高斯-赛德尔法结构简单、内存需求小,适合小型网络的手工计算和教学演示。但在大规模输电网络中,由于收敛速度随节点数增加而显著下降,工程上更多采用牛顿-拉夫逊法或PQ分解法。掌握高斯-赛德尔法,是理解潮流迭代思想的基础。