Part 4 · Chapter 19

Gauss-Seidel Load Flow

Each power flow equation contains one bus voltage more prominently than the rest, and solving it for that voltage turns the whole nonlinear system into a rule that can simply be applied over and over until the numbers stop moving.

Electric Power Systems Prof. Mithun Mondal Reading time ≈ 42 min
i What you'll learn
  • How a nonlinear equation is turned into an iteration by rearranging it as \(x = g(x)\), and the condition \(|g'| < 1\) that decides whether the iteration converges.
  • Why using the latest available voltage inside the sweep — the Seidel refinement — roughly squares the rate at which the error falls.
  • How the power flow equation of Chapter 18 is solved for \(V_i\) to give the Gauss-Seidel bus voltage update, and why \(\mathbf{Y}_{bus}\) is the right matrix to build it on.
  • The extra two steps a PV bus demands: estimating \(Q_i\) from the present iterate, then forcing the magnitude back to its scheduled value.
  • What the acceleration factor \(\lambda\) does to the error, why \(\lambda > 1\) helps, and why \(\lambda\) near \(2\) destroys the iteration.
  • How to recognise slow convergence, genuine divergence, and a case with no solution — three failures that look alike on screen.
  • Where Gauss-Seidel still earns its place, and exactly what Chapter 20 improves on.
Section 19-1

Successive Substitution: the Gauss Idea

Chapter 18 ended with a set of nonlinear algebraic equations and the plain statement that they cannot be solved in closed form beyond two buses. What remains is to guess an answer, use the equations to produce a better guess, and repeat. Every load flow program ever written does exactly this; the methods differ only in how the improvement is manufactured.

The oldest device is the simplest. Take a single equation \(f(x)=0\) and rearrange it, by whatever algebra is convenient, into the form

Fixed-point form
\[ x = g(x) \]

A solution \(x^{*}\) is now a value that the function \(g\) returns unchanged — a fixed point. Start from any estimate \(x^{(0)}\) and compute \(x^{(1)}=g(x^{(0)})\), then \(x^{(2)}=g(x^{(1)})\), and so on. This is successive substitution, or the Gauss iterative method. If the sequence settles down at all, it settles at a fixed point, because the moment \(x^{(k+1)}\) equals \(x^{(k)}\) the defining equation is satisfied exactly.

Whether it settles is a separate question, and it has a clean answer. Let \(e^{(k)} = x^{(k)}-x^{*}\) be the error. Then

How the error propagates
\[ e^{(k+1)} = g\big(x^{*}+e^{(k)}\big) - g\big(x^{*}\big) \approx g'\big(x^{*}\big)\,e^{(k)} \]

Each pass multiplies the error by the slope of \(g\) at the solution. The iteration converges if and only if that slope is smaller than one in magnitude, and the smaller it is the faster the error dies. The decay is geometric: the error is multiplied by a constant factor every pass, so it takes a fixed number of iterations to gain each decimal place. This is called linear convergence, and it is the essential character of the entire Gauss-Seidel family.

🔑
Convergence of successive substitution
\[ x^{(k+1)} = g\big(x^{(k)}\big) \quad\text{converges to } x^{*} \iff \big|g'(x^{*})\big| < 1, \qquad \big|e^{(k)}\big| \sim \big|g'\big|^{k}\big|e^{(0)}\big| \]

The rearrangement \(x=g(x)\) is not unique, and different rearrangements of the same \(f(x)=0\) give different \(g'\). One choice may converge briskly, another may diverge. Choosing the rearrangement is designing the method.

The geometry makes the criterion obvious. Plot \(y=g(x)\) and the line \(y=x\) on the same axes; the solution is where they cross. Starting from \(x^{(0)}\), move vertically to the curve to get \(g(x^{(0)})\), then horizontally to the line \(y=x\) to make that value the new \(x\), and repeat. The path is a staircase. If the curve is flatter than the \(45^\circ\) line the staircase closes in on the crossing; if it is steeper the staircase walks away.

x y = x y = g(x) x* x⁽⁰⁾ |g′| < 1 staircase converges x y = x y = g(x) x* |g′| > 1 staircase escapes
The slope of the iteration function at the fixed point decides everything
The rearrangement carries all the engineering. Nothing in successive substitution is clever; the entire art lies in picking the form \(x=g(x)\) whose slope at the solution is small. In load flow that choice is made for us by physics: each bus's own admittance \(Y_{ii}\) is much the largest term in its equation, so solving that equation for its own voltage produces a \(g\) with a comfortably small slope. Section 19-3 makes this precise.
Section 19-2

Gauss-Seidel: Use the Newest Value

Move from one equation to \(n\) of them. Suppose each equation has been solved for one variable, so that we have a set of update rules \(x_i = g_i(x_1,\dots,x_n)\), one per variable. There are two ways to run them.

The Gauss (or Jacobi) method computes every new value from the old ones, keeping the whole vector frozen until all \(n\) updates are complete:

Gauss (Jacobi) update
\[ x_i^{(k+1)} = g_i\Big(x_1^{(k)},\,x_2^{(k)},\,\dots,\,x_n^{(k)}\Big), \qquad i=1,\dots,n \]

The Gauss-Seidel method does the obvious thing instead. By the time variable \(i\) is being updated, variables \(1\) through \(i-1\) have already been improved in this very sweep. Throwing that improvement away is wasteful, so use it:

🔑
Gauss-Seidel update
\[ x_i^{(k+1)} = g_i\Big(\underbrace{x_1^{(k+1)},\dots,x_{i-1}^{(k+1)}}_{\text{already updated this sweep}},\;\underbrace{x_i^{(k)},x_{i+1}^{(k)},\dots,x_n^{(k)}}_{\text{not yet updated}}\Big) \]

No extra arithmetic and no extra storage — the new value simply overwrites the old one in place, and the next equation reads whatever is currently in memory. It is the same algorithm with the array copy removed.

The gain is real and can be quantified for a linear system. Write \(\mathbf{A}\mathbf{x}=\mathbf{b}\) and split \(\mathbf{A}=\mathbf{L}+\mathbf{D}+\mathbf{U}\) into its strictly lower, diagonal and strictly upper parts. Solving the \(i\)-th equation for \(x_i\) gives \(\mathbf{D}\mathbf{x} = \mathbf{b}-(\mathbf{L}+\mathbf{U})\mathbf{x}\), and the two schemes become

Iteration matrices of the two schemes
\[ \text{Gauss:}\quad \mathbf{x}^{(k+1)} = -\mathbf{D}^{-1}\big(\mathbf{L}+\mathbf{U}\big)\mathbf{x}^{(k)} + \mathbf{D}^{-1}\mathbf{b} \]
\[ \text{Gauss-Seidel:}\quad \mathbf{x}^{(k+1)} = -\big(\mathbf{D}+\mathbf{L}\big)^{-1}\mathbf{U}\,\mathbf{x}^{(k)} + \big(\mathbf{D}+\mathbf{L}\big)^{-1}\mathbf{b} \]

The error is multiplied at each pass by the largest eigenvalue in magnitude — the spectral radius \(\rho\) — of the corresponding matrix, which is the multivariable version of the slope \(g'\) of Section 19-1. For a large class of matrices, including those arising from networks, the Gauss-Seidel spectral radius is the square of the Gauss one. Squaring a number smaller than one halves the number of iterations needed. Example 1 shows this happening digit for digit.

Both schemes converge for certain if \(\mathbf{A}\) is strictly diagonally dominant, meaning that in every row the diagonal entry outweighs the sum of the others:

Diagonal dominance
\[ \big|A_{ii}\big| \;>\; \sum_{k \neq i}\big|A_{ik}\big| \qquad\text{for every } i \]

This is where the load flow problem hands the method a gift. Chapter 16 built \(\mathbf{Y}_{bus}\) by the rule that the diagonal entry is the sum of every admittance touching the bus and the off-diagonal entry is the negative of the admittance joining two buses. Therefore

Why \(\mathbf{Y}_{bus}\) is the right matrix to iterate on
\[ Y_{ii} = y_{i0} + \sum_{k\neq i} y_{ik}, \qquad Y_{ik} = -y_{ik} \;\Longrightarrow\; \big|Y_{ii}\big| \;\ge\; \sum_{k\neq i}\big|Y_{ik}\big| \]

with strict inequality wherever a shunt \(y_{i0}\) is present — line charging, a shunt capacitor, a transformer magnetising branch. \(\mathbf{Y}_{bus}\) is diagonally dominant by construction, not by luck, and that single structural fact is the reason a method as unsophisticated as Gauss-Seidel works on power networks at all. It is also the reason the method is built on \(\mathbf{Y}_{bus}\) rather than on the \(\mathbf{Z}_{bus}\) of Chapter 17, which is full and has no such structure.

The load flow is nonlinear, so this is a guide and not a guarantee. The dominance argument is exact only for the linear system \(\mathbf{Y}_{bus}\mathbf{V}=\mathbf{I}\). What makes the load flow nonlinear is the term \((P_i-jQ_i)/V_i^{*}\), which behaves like an extra load-dependent contribution to the row. Heavily loaded buses weaken the dominance, which is exactly why convergence deteriorates as a system is loaded toward the limit of Section 18-2 — the numerical behaviour is reporting a physical fact.
Section 19-3

Rearranging the Power Flow Equation

Chapter 18 wrote the complex power injected at bus \(i\) in conjugated form so that the admittance sum was left intact:

The starting equation
\[ P_i - jQ_i \;=\; V_i^{*}\sum_{k=1}^{n} Y_{ik}V_k \;=\; V_i^{*}\Big[Y_{i1}V_1 + Y_{i2}V_2 + \cdots + Y_{ii}V_i + \cdots + Y_{in}V_n\Big] \]

The variable we want to isolate, \(V_i\), sits inside the sum multiplied by \(Y_{ii}\) — the largest coefficient in the row, by the dominance argument just made. Divide through by \(V_i^{*}\), separate the \(k=i\) term, and solve for \(V_i\):

Isolating \(V_i\)
\[ \frac{P_i-jQ_i}{V_i^{*}} \;=\; Y_{ii}V_i + \sum_{k\neq i} Y_{ik}V_k \]
\[ \Longrightarrow\quad V_i \;=\; \frac{1}{Y_{ii}}\left[\frac{P_i-jQ_i}{V_i^{*}} \;-\; \sum_{\substack{k=1\\k\neq i}}^{n} Y_{ik}V_k\right] \]

This is the required \(x=g(x)\). The right-hand side still contains \(V_i\) through the conjugate \(V_i^{*}\), which is precisely what makes it a fixed-point equation rather than a formula. Read it physically and it is nothing but Kirchhoff's current law at bus \(i\), solved for the voltage that would make the current drawn by the specified power balance the current arriving through the network.

🔑
The Gauss-Seidel bus voltage update
\[ V_i^{(k+1)} = \frac{1}{Y_{ii}}\left[\frac{P_{i,\text{inj}}-jQ_{i,\text{inj}}}{V_i^{*(k)}} - \sum_{m < i} Y_{im}V_m^{(k+1)} - \sum_{m > i} Y_{im}V_m^{(k)}\right] \]

The two sums carry the Seidel refinement: buses already visited in this sweep contribute their new values, buses not yet reached contribute their old ones. The slack bus appears in the first sum with a voltage that never changes.

Two points of bookkeeping decide whether a student's arithmetic comes out right, and both were settled in Chapter 18. First, \(P_{i,\text{inj}}\) and \(Q_{i,\text{inj}}\) are net injections: generation minus load at that bus. A pure load bus injects negative power, so a load of \(4.0+j2.5\) per unit enters the formula as \(P_i=-4.0\), \(Q_i=-2.5\). A bus with both a machine and a local load carries the difference. Second, everything is in per unit on the common base of Chapter 4, so a \(400\) MW load on a \(100\) MVA base is \(4.0\), not \(400\).

An equivalent form is sometimes more convenient for hand calculation because it avoids forming \(\mathbf{Y}_{bus}\) explicitly. Writing \(Y_{ii}=y_{i0}+\sum_{k\neq i}y_{ik}\) and \(Y_{ik}=-y_{ik}\),

Branch-admittance form of the same update
\[ V_i^{(k+1)} = \frac{\dfrac{P_i-jQ_i}{V_i^{*(k)}} + \displaystyle\sum_{k\neq i} y_{ik}V_k}{y_{i0} + \displaystyle\sum_{k\neq i} y_{ik}} \]

The two are the same equation written twice; the second makes the physical reading immediate. The numerator is the total current entering bus \(i\) — the load current plus everything arriving along the branches — and the denominator is the total admittance seen at the bus. The quotient is a voltage.

Section 19-4

The Sweep Over the PQ Buses

At a PQ bus both \(P_i\) and \(Q_i\) are known numbers, so the update of Section 19-3 can be applied directly with nothing left to estimate. This is the easy case and it is worth writing out in full for a small system before adding the complication of generator buses.

Number the buses so that bus \(1\) is the slack. One iteration means one complete sweep over buses \(2\) through \(n\), taken in order. For a five-bus system with buses \(2,3,4\) of PQ type, the first sweep from a flat start reads

One sweep, written out
\[ V_2^{(1)} = \frac{1}{Y_{22}}\left[\frac{P_2-jQ_2}{V_2^{*(0)}} - Y_{21}V_1 - Y_{23}V_3^{(0)} - Y_{24}V_4^{(0)} - Y_{25}V_5^{(0)}\right] \]
\[ V_3^{(1)} = \frac{1}{Y_{33}}\left[\frac{P_3-jQ_3}{V_3^{*(0)}} - Y_{31}V_1 - Y_{32}\,\underline{V_2^{(1)}} - Y_{34}V_4^{(0)} - Y_{35}V_5^{(0)}\right] \]
\[ V_4^{(1)} = \frac{1}{Y_{44}}\left[\frac{P_4-jQ_4}{V_4^{*(0)}} - Y_{41}V_1 - Y_{42}\,\underline{V_2^{(1)}} - Y_{43}\,\underline{V_3^{(1)}} - Y_{45}V_5^{(0)}\right] \]

The underlined entries are the Seidel refinement in action: by the time bus \(4\) is reached, the improved voltages at buses \(2\) and \(3\) are already in memory and are used. The slack voltage \(V_1\) never carries an iteration superscript because it is fixed data. And the conjugate \(V_i^{*(k)}\) in the numerator always uses the previous value of the bus's own voltage, since the new one does not exist yet — that is the fixed-point structure of Section 19-1.

Everything in this chapter is worked on the three-bus system that Chapter 18 introduced and solved, so that every intermediate number can be checked against a known answer.

BUS 1 BUS 3 BUS 2 SLACK V₁ = 1.05∠0° PV BUS P₃ = 2.0, |V₃| = 1.04 S₂ = 4.0 + j2.5 pu (PQ bus: P₂ = −4.0, Q₂ = −2.5) 0.01 + j0.03 0.02 + j0.04 0.0125 + j0.025 all impedances per unit on 100 MVA base · line charging neglected
The three-bus test system carried through Chapters 18, 19 and 20

Its admittance matrix was formed in Chapter 18 and is repeated here because every worked example needs it:

Bus admittance matrix of the test system
\[ y_{12}=10-j20,\qquad y_{13}=10-j30,\qquad y_{23}=16-j32 \]
\[ \mathbf{Y}_{bus} = \begin{bmatrix} 20-j50 & -10+j20 & -10+j30\\ -10+j20 & 26-j52 & -16+j32\\ -10+j30 & -16+j32 & 26-j62 \end{bmatrix} \]

Every row obeys the dominance inequality of Section 19-2 with equality, since no shunts are present. Row two, for instance, gives \(|Y_{22}| = |26-j52| = 58.14\) against \(|Y_{21}|+|Y_{23}| = 22.36+35.78 = 58.14\). The margin is exactly zero, which warns in advance that convergence will be steady rather than quick.

Section 19-5

The PV Bus: Reactive Estimate and Magnitude Correction

At a generator bus under automatic voltage regulator control, Chapter 18 established that \(P_i\) and \(|V_i|\) are specified and \(Q_i\) and \(\delta_i\) are not. The update of Section 19-3 demands \(Q_i\), which we do not have. It also produces a complete complex number, magnitude included, when only the angle is wanted. Both difficulties are handled inside the sweep, and the two fixes together are the only structural difference between a PQ bus and a PV bus in Gauss-Seidel.

Step one — estimate the reactive injection. The reactive power flow equation of Chapter 18 is an identity that holds at the solution. Evaluate it at the present iterate and it returns the reactive power that the current voltages imply:

Reactive injection from the present voltages
\[ Q_{i,\text{inj}} = -\operatorname{Im}\left[V_i^{*}\sum_{k=1}^{n}Y_{ik}V_k\right] \]
\[ Q_{i,\text{inj}}^{(k+1)} = -\operatorname{Im}\left[V_i^{*(k)}\Big(\textstyle\sum_{m < i}Y_{im}V_m^{(k+1)} + Y_{ii}V_i^{(k)} + \sum_{m > i}Y_{im}V_m^{(k)}\Big)\right] \]

This is not the true \(Q_i\) — the voltages are not yet the true voltages — but it is the best estimate available, and it becomes exact as the iteration converges. The bus's own voltage enters at its old value while the neighbours already visited enter at their new ones, keeping faith with the Seidel principle.

Step two — correct the magnitude. Feed that \(Q\) into the ordinary voltage update. The result is a complex number \(V_i^{(k+1)}\) whose magnitude will generally miss the scheduled value, because nothing in the update was told about the schedule. The angle, however, is genuine new information. Keep the angle and impose the magnitude:

🔑
PV bus magnitude correction
\[ V_{i,\text{corr}}^{(k+1)} \;=\; \big|V_i\big|_{\text{sched}}\;\frac{V_i^{(k+1)}}{\big|V_i^{(k+1)}\big|} \qquad\text{equivalently}\qquad V_{i,\text{corr}}^{(k+1)} = \big|V_i\big|_{\text{sched}}\,\angle\,\delta_i^{(k+1)} \]

The corrected value, not the raw one, is what goes into memory and into the next bus's update. The scheduled magnitude is data and must never be allowed to drift; the angle is the unknown and is taken as computed.

The correction is legitimate for a reason worth stating plainly. The load flow at a PV bus has exactly one unknown, \(\delta_i\). The update formula, being a complex equation, delivers two real numbers. Discarding the magnitude discards a quantity that was never an unknown; retaining the angle keeps the quantity that was. What the discarded magnitude actually measures is the residual error in the reactive estimate, and watching it approach the scheduled value is a useful convergence check in its own right.

Step three — check the reactive limit. Chapter 18 closed with the physical fact that a machine's reactive output is bounded above by field heating and below by end-region heating and steady-state stability. The estimate \(Q_{i}^{(k+1)}\) must be tested against those bounds at every iteration:

Limit enforcement inside the sweep
\[ Q_i^{(k+1)} = \begin{cases} Q_i^{max}, & \text{if } Q_i^{(k+1)} > Q_i^{max}\\[2pt] Q_i^{min}, & \text{if } Q_i^{(k+1)} < Q_i^{min}\\[2pt] Q_i^{(k+1)}, & \text{otherwise} \end{cases} \]

When a limit binds, the clamped value is used and — this is the part students forget — the magnitude correction is skipped. The bus has become a PQ bus with its reactive injection pinned at the limit, and its voltage magnitude is now an unknown free to settle wherever the network puts it. The scheduled magnitude is remembered so that the bus can be restored to PV type if a later iteration finds the constraint no longer binding. Example 6 carries this through on the test system.

A hit limit is a result, not a nuisance. When a PV bus reverts to PQ and its voltage settles below the set point, the study is reporting that the reactive support at that point of the network is insufficient for the scheduled voltage. The remedy is a shunt capacitor, a transformer tap or a compensator — Chapters 34 and 38 — not a change to the load flow.
Section 19-6

Acceleration

The linear convergence of Section 19-1 has one redeeming feature: it is predictable. If each pass multiplies the error by roughly the same factor \(\rho\), then successive iterates march toward the solution along a nearly straight path, each step a fixed fraction of the one before. A method that knows it will keep travelling in the same direction should travel further while it is there.

That is the whole of the acceleration idea. Let \(V_i^{(k)}\) be the value the update formula produces and \(V_{i,\text{acc}}^{(k-1)}\) the accelerated value currently held. Instead of accepting the step, stretch it by a factor \(\lambda\):

🔑
Acceleration factor
\[ V_{i,\text{acc}}^{(k)} = V_{i,\text{acc}}^{(k-1)} + \lambda\Big(V_i^{(k)} - V_{i,\text{acc}}^{(k-1)}\Big) \;=\; \big(1-\lambda\big)V_{i,\text{acc}}^{(k-1)} + \lambda\,V_i^{(k)} \]

\(\lambda=1\) is ordinary Gauss-Seidel. \(\lambda>1\) over-shoots deliberately, in the expectation that the iteration was going to keep moving that way. \(\lambda<1\) under-relaxes and is used only to stabilise a case that oscillates.

The arithmetic of why over-shooting helps is one line. Suppose the unaccelerated iteration reduces the error by a factor \(\rho\), so that \(V^{(k)}-V^{*} = \rho\,(V_{\text{acc}}^{(k-1)}-V^{*})\). Substituting into the acceleration formula,

Effect of \(\lambda\) on the error
\[ e_{\text{acc}}^{(k)} = e^{(k-1)} + \lambda\big(\rho\,e^{(k-1)} - e^{(k-1)}\big) = \Big[1-\lambda\big(1-\rho\big)\Big]e^{(k-1)} \]

With \(\lambda=1\) the factor is \(\rho\), as it must be. Increasing \(\lambda\) drives the bracket toward zero and then past it; the value \(\lambda=1/(1-\rho)\) would annihilate the error in a single step. That ideal is unattainable in practice for two reasons, and both are instructive. The convergence ratio \(\rho\) is not known before the study is run. More fundamentally, a system with many buses has many error modes, each decaying at its own rate; a \(\lambda\) tuned to eliminate the slowest mode multiplies the bracket for the faster modes by something larger than one and amplifies them. The practical optimum therefore sits well below \(1/(1-\rho)\).

Past \(\lambda = 2\) the bracket exceeds one in magnitude for every \(\rho\) between \(0\) and \(1\), and the iteration cannot converge at all. This is the origin of the standard rule.

🔑
Choosing \(\lambda\)
\[ 1 < \lambda < 2, \qquad \text{typically } 1.4 \le \lambda \le 1.7 \text{ for transmission networks} \]

The value is found by experiment on a representative case and then kept. Acceleration is normally applied at PQ buses only; at a PV bus the magnitude correction of Section 19-5 already overwrites part of the result, so stretching the step there gains little.

On the three-bus system of this chapter, \(\lambda=1.2\) reduces the iteration count from twelve to seven, \(\lambda=1.6\) is worse than no acceleration at all, and at \(\lambda=2.1\) the iteration diverges outright. A three-bus network is far stiffer than a real one and its optimum is unusually low, but the shape of the result — a modest gain, a clear optimum, rapid deterioration on the high side — is what every system shows.

10¹ 10⁰ 10⁻¹ 10⁻² 10⁻³ 10⁻⁴ 10⁻⁵ 10⁻⁶ max |ΔP|, |ΔQ| (pu) 0 2 4 6 8 10 12 14 iteration tolerance 10⁻⁵ λ = 1.0 · 12 iterations λ = 1.2 · 7 iterations
Straight lines on a log scale: geometric error decay, with and without acceleration

The straightness of both traces is the visible signature of linear convergence. Each iteration multiplies the mismatch by the same factor — \(0.411\) without acceleration on this system — so each buys the same number of decimal places, and the cost of one more digit is always the same handful of sweeps. Chapter 20 shows what a curve that bends downward looks like.

Section 19-7

Convergence, Tolerance and Failure

Two stopping tests are in circulation and they are not equally good. The weaker one watches the voltages and stops when they cease to move:

Voltage-change test
\[ \max_i\Big|V_i^{(k+1)} - V_i^{(k)}\Big| \;<\; \varepsilon_V \]

It is cheap, since the differences are already computed, but it can lie. An iteration crawling along with a convergence ratio close to one produces tiny voltage changes while the equations are still badly violated, and the program reports success on a wrong answer. Worse, the danger is greatest exactly where it matters — a heavily loaded system, where the ratio is worst.

The honest test is the mismatch test of Chapter 18, applied to the equations themselves. After each sweep, evaluate the power flow equations at the current voltages, subtract from the scheduled values, and examine the residuals:

🔑
Convergence test
\[ \Delta P_i = P_i^{sch} - P_i^{calc}, \qquad \Delta Q_i = Q_i^{sch} - Q_i^{calc}, \qquad \max\big|\Delta P\big|,\;\max\big|\Delta Q\big| \;<\; \varepsilon \]

\(\Delta P\) is formed at every non-slack bus and \(\Delta Q\) at PQ buses only, which is the count established in Section 18-7. A tolerance of \(10^{-4}\) per unit is \(10\) kW on a \(100\) MVA base — far tighter than any load forecast, so nothing physical is gained by going below about \(10^{-6}\).

How many iterations should be expected? Gauss-Seidel has an unwelcome scaling property. The error modes of the sweep correspond to patterns of voltage spread over the network, and the slowest mode is the one that has to propagate information from one end of the system to the other. A single sweep moves information only one bus along in the direction opposite to the ordering, so the number of iterations rises roughly in proportion to the number of buses.

System sizeTypical Gauss-Seidel iterationsWork per iterationTotal work
\(3\) buses (this chapter)\(12\) at \(\varepsilon=10^{-5}\)\(\propto\) number of branchessmall
\(30\) buses\(30\)–\(60\)\(\propto n\) with sparse storage\(\propto n^2\)
\(300\) buses\(150\)–\(400\)\(\propto n\)\(\propto n^2\)
\(3000\) busesoften will not converge in any useful time\(\propto n\)impractical

Compare this with the Newton-Raphson result of Chapter 20, where the iteration count is three to five almost regardless of size. That contrast — not the cost of a single iteration — is why Gauss-Seidel was displaced as the production method in the late nineteen-sixties.

When the iteration does not converge, three quite different things may be happening, and telling them apart saves a great deal of wasted effort.

SymptomLikely causeWhat to do
Mismatch falls but far too slowlyConvergence ratio close to one: long radial feeders, very high or very low \(R/X\), a heavily loaded systemApply or retune acceleration; re-order buses; consider Newton-Raphson
Mismatch oscillates and grows\(\lambda\) too large, or a negative-reactance branch (a series capacitor or a three-winding transformer equivalent) destroying diagonal dominanceReduce \(\lambda\) below \(1\); check the branch data
Voltages run away immediatelyData error: impedance in ohms instead of per unit, a bus with no connection, an omitted slack, \(Y_{ii}=0\)Check the network topology and the per-unit conversion of Chapter 4
Voltage at one bus collapses steadilyCase is beyond the loadability limit of Section 18-2 — no solution existsScale the load down and re-run; if it converges at \(80\%\), the original case is genuinely infeasible
Converges, then loses convergenceA PV bus repeatedly switching between PV and PQ type as its \(Q\) crosses a limitAdd a small dead-band to the limit test, or fix the bus at the limit
Divergence and infeasibility look identical. A numerical failure and a system that genuinely cannot carry the load both show as voltages walking away. The distinguishing experiment costs one extra run: scale every load and generation by \(0.8\) and try again. Convergence at reduced load points to a physical limit and a planning problem; failure at reduced load points to bad data.
Section 19-8

The Complete Algorithm

Everything of Sections 19-3 to 19-7 assembles into a procedure short enough to program in an afternoon, which was a large part of its original appeal.

StepActionReference
1Convert all line, transformer and load data to per unit on a common base and form \(\mathbf{Y}_{bus}\)Chapters 4 and 16
2Classify every bus; fix the slack voltage \(|V_1|\angle0^\circ\)Section 18-4
3Set the flat start: \(|V_i|=1.0\), \(\delta_i=0\) at PQ buses; \(|V_i|=|V_i|_{sched}\), \(\delta_i=0\) at PV busesSection 18-8
4Sweep \(i=2,\dots,n\). At a PV bus first estimate \(Q_i\) and test it against its limitsSection 19-5
5Apply the voltage update; accelerate at PQ buses if \(\lambda \ne 1\)Sections 19-3, 19-6
6At a PV bus still within its limits, force the magnitude back to the scheduled valueSection 19-5
7After the sweep, evaluate all mismatches \(\Delta P_i\), \(\Delta Q_i\)Section 19-7
8If any mismatch exceeds \(\varepsilon\), return to step 4; otherwise stopSection 19-7
9Compute slack output, PV bus reactive output, line flows and lossesSection 18-9

Three implementation habits separate a program that works from one that only sometimes works. Store \(\mathbf{Y}_{bus}\) sparsely, keeping only the non-zero entries, since a real network has three or four branches per bus and the matrix is more than \(99\%\) empty. Precompute the constants \(1/Y_{ii}\) once rather than dividing inside the loop. And carry the voltages in rectangular form throughout, converting to polar only for output — the update formula is entirely rectangular, and repeated polar conversion is both slow and a source of angle-wrapping bugs.

Section 19-9

What Gauss-Seidel Is Good For

The method's reputation has suffered from being compared only against Newton-Raphson on large transmission cases, which is the one contest it is certain to lose. Set against the criteria that actually matter in a given application, it retains a clear set of strengths.

PropertyGauss-SeidelNewton-Raphson (Chapter 20)
Iterations to convergeGrows roughly as \(n\)\(3\)–\(5\), nearly independent of \(n\)
Work per iterationVery small, \(\propto\) branch countLarge: build and factorise the Jacobian
Memory\(\mathbf{Y}_{bus}\) only\(\mathbf{Y}_{bus}\) plus Jacobian and its factors
Programming effortAn afternoonSubstantial
Sensitivity to the starting pointLow — a flat start almost always worksHigher — can diverge from a poor start
Behaviour near the loadability limitSlows down gracefullyJacobian becomes ill-conditioned
Convergence typeLinearQuadratic

The last two rows explain why the method never quite disappeared. Its insensitivity to the initial estimate makes it the standard way to begin a difficult case: run one or two Gauss-Seidel sweeps from a flat start to pull the voltages into the neighbourhood of the solution, then hand over to Newton-Raphson, which converges quadratically once it is close. Almost every serious load flow program offers this hybrid.

Two further niches are worth knowing. Distribution feeders — long, radial, with \(R/X\) ratios near unity — defeat the fast decoupled method of Chapter 20, whose central approximation requires \(X \gg R\), while Gauss-Seidel and its relatives handle them without complaint. And in a system with only a handful of buses, twelve trivial sweeps beat three expensive Jacobian factorisations on any measure, which is why every examination question on hand-computed load flow is a Gauss-Seidel question.

A refinement worth naming is the \(\mathbf{Z}_{bus}\) Gauss-Seidel method, which uses the impedance matrix of Chapter 17 in place of \(\mathbf{Y}_{bus}\). Because \(\mathbf{Z}_{bus}\) is full, every bus feels every other bus in a single sweep and the iteration count collapses to a handful. The price is the storage and the formation cost of a full \(n\times n\) matrix, which is why the idea belongs to fault analysis in Chapter 21, where \(\mathbf{Z}_{bus}\) has to be built anyway, rather than to routine load flow.

Section 19-10

Worked Examples

1 Gauss against Gauss-Seidel on a linear pair

Problem. Solve \(8x_1 - 3x_2 = 10\) and \(-2x_1+6x_2 = 8\) by both the Gauss and the Gauss-Seidel methods from \(x^{(0)}=(0,0)\), and compare how the error falls.

Solution. Solve each equation for its own diagonal variable, which is the rearrangement of Section 19-2:

Iteration rules
\[ x_1 = \frac{10+3x_2}{8}, \qquad x_2 = \frac{8+2x_1}{6} \]

Both rows are diagonally dominant (\(8 > 3\) and \(6 > 2\)), so convergence is assured. Eliminating by hand gives the exact answer \(x_1=x_2=2\), against which the iterates can be measured.

PassGauss \(x_1\)Gauss \(x_2\)errorGauss-Seidel \(x_1\)Gauss-Seidel \(x_2\)error
11.250001.333330.750001.250001.750000.75000
21.750001.750000.250001.906251.968750.09375
31.906251.916670.093751.988281.996090.01172
41.968751.968750.031251.998541.999510.001465
51.988281.989580.011721.999821.999940.000183
61.996091.996090.0039061.999981.999990.0000229

The error column shows the largest of the two component errors. The Gauss errors fall by factors that alternate between \(1/3\) and \(3/8\), averaging \(0.354\) per pass; the Gauss-Seidel errors fall by exactly \(0.125\) every pass. Those two numbers are related as Section 19-2 predicted: \(0.354^2 = 0.125\). After six passes Gauss is correct to two decimal places and Gauss-Seidel to four, for identical arithmetic. The only difference in the two calculations is that the Gauss-Seidel line for \(x_2\) uses the \(x_1\) computed moments earlier on the same line.

2 A two-bus load flow by hand

Problem. A slack bus at \(1.0\angle0^\circ\) per unit feeds a load of \(0.5+j0.2\) per unit through a line of impedance \(0.02+j0.04\) per unit. Charging is neglected. Find the load bus voltage by Gauss-Seidel from a flat start.

Solution. The series admittance is \(y_{12} = 1/(0.02+j0.04) = 10-j20\), so \(Y_{22}=10-j20\) and \(Y_{21}=-10+j20\). The injections at bus \(2\) are \(P_2=-0.5\) and \(Q_2=-0.2\) — negative, because the bus draws power. The update of Section 19-3 with only one neighbour reads

First iteration from \(V_2^{(0)}=1.0\angle0^\circ\)
\[ V_2^{(1)} = \frac{1}{10-j20}\left[\frac{-0.5+j0.2}{1.0} - \big(-10+j20\big)\big(1.0\big)\right] = \frac{9.5-j19.8}{10-j20} \]
\[ = \frac{\big(9.5-j19.8\big)\big(10+j20\big)}{100+400} = \frac{491-j8}{500} = 0.98200 - j0.01600 \]

so \(V_2^{(1)} = 0.98213\angle-0.9335^\circ\). For the second iteration the conjugate in the numerator now carries this value:

Second iteration
\[ \frac{-0.5+j0.2}{0.98200+j0.01600} = \frac{\big(-0.5+j0.2\big)\big(0.98200-j0.01600\big)}{0.96458} = -0.50571+j0.21191 \]
\[ V_2^{(2)} = \frac{-0.50571+j0.21191 + 10 - j20}{10-j20} = \frac{9.49429-j19.78809}{10-j20} = 0.98141-j0.01599 \]

giving \(V_2^{(2)} = 0.98154\angle-0.9335^\circ\). A third pass returns \(0.98153\angle-0.9340^\circ\) and a fourth changes nothing in five figures. Three iterations suffice because a two-bus system has only one error mode and no distance for information to travel — precisely the scaling argument of Section 19-7 seen from its favourable end.

3 First iteration at the PQ bus of the test system

Problem. For the three-bus system of Section 19-4, carry out the first Gauss-Seidel update at bus \(2\) from the flat start \(V_2^{(0)}=1.0\angle0^\circ\), \(V_3^{(0)}=1.04\angle0^\circ\), and compare the result with the converged answer \(V_2 = 0.97168\angle-2.6965^\circ\).

Solution. Bus \(2\) is a PQ bus carrying a load of \(4.0+j2.5\) per unit, so \(P_2=-4.0\) and \(Q_2=-2.5\) and \(P_2-jQ_2 = -4.0+j2.5\). Assemble the two neighbour terms first:

Neighbour contributions
\[ Y_{21}V_1 = \big(-10+j20\big)\big(1.05\big) = -10.50+j21.00 \]
\[ Y_{23}V_3^{(0)} = \big(-16+j32\big)\big(1.04\big) = -16.64+j33.28 \]
\[ Y_{21}V_1 + Y_{23}V_3^{(0)} = -27.14 + j54.28 \]

The load term is \(\big(-4.0+j2.5\big)/1.0 = -4.0+j2.5\). Subtracting the neighbour sum:

The bracket and the division
\[ \big(-4.0+j2.5\big) - \big(-27.14+j54.28\big) = 23.14 - j51.78 \]
\[ V_2^{(1)} = \frac{23.14-j51.78}{26-j52} = \frac{\big(23.14-j51.78\big)\big(26+j52\big)}{26^2+52^2} \]
\[ = \frac{601.64 + j1203.28 - j1346.28 + 2692.56}{3380} = \frac{3294.20 - j143.00}{3380} = 0.97462 - j0.04231 \]

In polar form \(V_2^{(1)} = 0.97553\angle-2.4856^\circ\). One sweep has taken the magnitude from \(1.0\) to within \(0.4\%\) of its final value and produced an angle already \(92\%\) of the way to \(-2.6965^\circ\). The bulk of the correction always arrives in the first iteration; the remaining eleven sweeps are spent grinding out the last few digits, which is the characteristic profile of a linearly convergent method.

4 The PV bus in the same sweep

Problem. Continue the sweep of Example 3 to bus \(3\), which is a PV bus scheduled at \(P_3 = 2.0\) with \(|V_3| = 1.04\). Estimate its reactive injection, update its voltage, and apply the magnitude correction.

Solution. The bus \(2\) voltage just computed is used immediately — that is the Seidel refinement. First the reactive estimate, which needs the full row-three sum including the diagonal term:

Reactive injection at bus 3
\[ \sum_k Y_{3k}V_k = \big(-10+j30\big)\big(1.05\big) + \big(-16+j32\big)\big(0.97462-j0.04231\big) + \big(26-j62\big)\big(1.04\big) \]
\[ = \big(-10.50+j31.50\big) + \big(-14.24+j31.8646\big) + \big(27.04-j64.48\big) = 2.30 - j1.11538 \]
\[ V_3^{*(0)}\sum_k Y_{3k}V_k = \big(1.04\big)\big(2.30-j1.11538\big) = 2.392 - j1.160 \]
\[ Q_3^{(1)} = -\operatorname{Im}\big[\,2.392-j1.160\,\big] = 1.160 \]

The estimate lies inside the machine's limits of \(-0.20 \le Q_{G3} \le 1.20\) from Chapter 18, so the bus stays PV for now. Apply the ordinary update with \(P_3-jQ_3 = 2.0 - j1.160\):

Voltage update at bus 3
\[ \frac{2.0-j1.160}{1.04} = 1.92308 - j1.11538 \]
\[ Y_{31}V_1 + Y_{32}V_2^{(1)} = \big(-10.50+j31.50\big) + \big(-14.24+j31.8646\big) = -24.74 + j63.3646 \]
\[ V_3^{(1)} = \frac{\big(1.92308-j1.11538\big) - \big(-24.74+j63.3646\big)}{26-j62} = \frac{26.66308 - j64.48}{26-j62} \]
\[ = 1.03783 - j0.00517 \;=\; 1.03784\angle-0.28543^\circ \]

The magnitude has come out as \(1.03784\) rather than the scheduled \(1.04\). Keep the angle and impose the schedule:

Magnitude correction
\[ V_{3,\text{corr}}^{(1)} = 1.04\,\angle-0.28543^\circ = 1.03999 - j0.00518 \]

This corrected value enters the second sweep. The discrepancy of \(0.00216\) per unit that was discarded is a measure of how wrong the reactive estimate still is; by the fourth sweep it has fallen below \(10^{-4}\), and the converged angle is \(-0.4988^\circ\) with \(Q_3 = 1.4618\).

5 What acceleration buys, and what it costs

Problem. Repeat the Gauss-Seidel solution of the test system with acceleration factors \(\lambda = 1.0\), \(1.2\), \(1.6\) and \(1.9\) applied at the PQ bus, and account for the pattern in the iteration counts.

Solution. With \(\lambda = 1.2\) the first update at bus \(2\) is stretched from the raw value found in Example 3:

Accelerating the first step
\[ V_{2,\text{acc}}^{(1)} = 1.0 + 1.2\Big[\big(0.97462-j0.04231\big) - 1.0\Big] = 1.0 + 1.2\big(-0.02538-j0.04231\big) \]
\[ = 0.96954 - j0.05077 \;=\; 0.97087\angle-2.9975^\circ \]

The step has been pushed past the unaccelerated landing point and slightly beyond the final answer of \(-2.6965^\circ\), which is exactly the intention: the next sweep will come back a shorter distance. Running each case to \(\max|\Delta P|,|\Delta Q| < 10^{-5}\):

\(\lambda\)IterationsMismatch after 4 sweepsComment
1.012\(1.18\times10^{-2}\)Plain Gauss-Seidel; error ratio \(0.411\) per sweep
1.27\(1.10\times10^{-3}\)Best on this system
1.618\(2.99\times10^{-2}\)Worse than no acceleration
1.965\(2.06\times10^{-1}\)Erratic; the mismatch barely falls at first
2.1diverges\(5.31\times10^{-1}\) and risingPast the stability bound of Section 19-6

The scalar formula of Section 19-6, using the measured ratio \(\rho=0.411\), would recommend \(\lambda = 1/(1-0.411) = 1.70\) — and values near \(1.70\) are among the worst in the table. The formula assumes a single error mode; this system has three real unknowns and therefore several error modes decaying at different rates, and a \(\lambda\) tuned to annihilate the slowest amplifies the rest. That is why the acceleration factor is always determined by trial on a representative case and never from a formula.

6 A reactive limit binds and the PV bus becomes a PQ bus

Problem. The machine at bus \(3\) has limits \(-0.20 \le Q_{G3} \le 1.20\) per unit. The unconstrained solution asks it for \(1.4618\). Re-run the load flow with the limit enforced and report the new voltages.

Solution. The reactive estimate at bus \(3\) is \(1.160\) after the first sweep, which is inside the limit, so nothing changes there. By the second sweep the estimate has climbed to \(1.388\) and the upper limit is violated. The AVR cannot supply the excitation required to hold \(1.04\) per unit, so the machine is pinned at its ceiling:

Reclassification
\[ Q_3 = Q_3^{max} = 1.20 \quad\Longrightarrow\quad \text{bus 3 becomes a PQ bus with } S_3 = 2.0 + j1.20 \]

From this point the magnitude correction is dropped and bus \(3\) is updated by the ordinary PQ formula, with \(|V_3|\) free. The iteration then converges to

Solution with the limit enforced
\[ V_2 = 0.96821\angle-2.6431^\circ, \qquad V_3 = 1.03479\angle-0.3865^\circ \]

Bus \(3\) settles at \(1.0348\) instead of the scheduled \(1.04\), and bus \(2\), starved of the reactive support it was counting on, falls from \(0.97168\) to \(0.96821\). Both movements are downward and both are physical: the study is reporting that the reactive capability at bus \(3\) is \(0.26\) per unit short of what the scheduled voltage profile requires. Compare this with Example 6 of Chapter 18, which identified the violation but stopped before solving the constrained case.

Review

Chapter Summary

Fixed point

Rearrange to \(x=g(x)\) and iterate; it converges when \(|g'|<1\), and the error falls geometrically.

Seidel refinement

Using the latest values within the sweep squares the convergence ratio — half the iterations for the same work.

The update

\(V_i = \dfrac{1}{Y_{ii}}\Big[\dfrac{P_i-jQ_i}{V_i^{*}} - \sum_{k\neq i}Y_{ik}V_k\Big]\), with injections net of load.

Why \(\mathbf{Y}_{bus}\)

It is diagonally dominant by construction, which is what makes the iteration converge at all.

PV buses

Estimate \(Q_i\) from the present iterate, update, then force \(|V_i|\) back to its scheduled value keeping the angle.

Q limits

Clamp \(Q\) at the violated bound, skip the magnitude correction, and let the bus behave as PQ.

Acceleration

\(V_{acc} = V_{old} + \lambda(V_{new}-V_{old})\) with \(1<\lambda<2\); the optimum is found by trial, not by formula.

Scaling

Iterations grow roughly as \(n\), so total work grows as \(n^2\) — the reason Chapter 20 exists.

Practice

Problems

Work in per unit on a \(100\) MVA base, take bus \(1\) as the slack, and start flat unless told otherwise. Carry five decimal places in intermediate results; rounding early destroys the later iterations.

  1. Solve \(10x_1 - 2x_2 = 6\) and \(-x_1 + 5x_2 = 7\) by Gauss and by Gauss-Seidel from \((0,0)\). Tabulate four passes of each, find the exact solution, and show that the Gauss-Seidel error ratio is the square of the Gauss ratio.
  2. A slack bus at \(1.02\angle0^\circ\) feeds a load of \(0.8+j0.6\) per unit through a line of impedance \(0.03+j0.09\) per unit. Perform three Gauss-Seidel iterations on the load bus voltage and state the mismatch after the third.
  3. For the three-bus system of Section 19-4, carry out the second complete sweep by hand, starting from \(V_2^{(1)} = 0.97462-j0.04231\) and \(V_3^{(1)} = 1.04\angle-0.28543^\circ\). Verify that \(V_2^{(2)}\) is close to \(0.97203\angle-2.5613^\circ\) and that \(Q_3^{(2)} = 1.3881\).
  4. Show algebraically that the branch-admittance form of the update in Section 19-3 is identical to the \(\mathbf{Y}_{bus}\) form, and state what the shunt term \(y_{i0}\) contributes to diagonal dominance.
  5. A three-bus system has \(z_{12}=0.05+j0.15\), \(z_{13}=0.10+j0.30\) and \(z_{23}=0.08+j0.24\) with charging neglected. Bus \(1\) is the slack at \(1.0\angle0^\circ\), bus \(2\) is a PQ bus with a load of \(0.6+j0.3\), and bus \(3\) is a PQ bus with a load of \(0.4+j0.2\). Form \(\mathbf{Y}_{bus}\), verify diagonal dominance, and perform two Gauss-Seidel sweeps.
  6. Repeat Problem 5 with \(\lambda = 1.5\) applied to both buses. Compare the voltages after two sweeps with the unaccelerated result and comment on whether the acceleration has helped at this stage of the iteration.
  7. In the system of Problem 5, replace bus \(3\) by a generator scheduled at \(P_3 = 0.5\) with \(|V_3| = 1.03\) and limits \(-0.1 \le Q_{G3} \le 0.4\). Perform one sweep, estimate \(Q_3\), and state whether the bus remains a PV bus.
  8. A load flow on a \(60\)-bus network takes \(58\) Gauss-Seidel iterations. Estimate the iteration count for a \(240\)-bus network of similar character, and state how many Newton-Raphson iterations Chapter 20 would predict for each. Which method does less total arithmetic on the smaller case?
Tip: before starting any hand iteration, write down the injections with their signs and check them once. Nearly every wrong answer in a Gauss-Seidel problem traces back to a load entered as \(+P+jQ\) instead of \(-P-jQ\), or to a bus with both generation and local load whose net injection was not formed. The iteration will converge perfectly well to the solution of the wrong problem, and nothing in the mismatch test will warn you.