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.
- 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.
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
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
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.
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.
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:
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:
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
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:
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
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.
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 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\):
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 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}\),
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.
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
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.
Its admittance matrix was formed in Chapter 18 and is repeated here because every worked example needs it:
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.
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:
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:
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:
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.
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\):
\(\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,
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.
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.
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.
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:
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:
\(\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 size | Typical Gauss-Seidel iterations | Work per iteration | Total work |
|---|---|---|---|
| \(3\) buses (this chapter) | \(12\) at \(\varepsilon=10^{-5}\) | \(\propto\) number of branches | small |
| \(30\) buses | \(30\)–\(60\) | \(\propto n\) with sparse storage | \(\propto n^2\) |
| \(300\) buses | \(150\)–\(400\) | \(\propto n\) | \(\propto n^2\) |
| \(3000\) buses | often 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.
| Symptom | Likely cause | What to do |
|---|---|---|
| Mismatch falls but far too slowly | Convergence ratio close to one: long radial feeders, very high or very low \(R/X\), a heavily loaded system | Apply 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 dominance | Reduce \(\lambda\) below \(1\); check the branch data |
| Voltages run away immediately | Data 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 steadily | Case is beyond the loadability limit of Section 18-2 — no solution exists | Scale the load down and re-run; if it converges at \(80\%\), the original case is genuinely infeasible |
| Converges, then loses convergence | A PV bus repeatedly switching between PV and PQ type as its \(Q\) crosses a limit | Add a small dead-band to the limit test, or fix the bus at the limit |
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.
| Step | Action | Reference |
|---|---|---|
| 1 | Convert all line, transformer and load data to per unit on a common base and form \(\mathbf{Y}_{bus}\) | Chapters 4 and 16 |
| 2 | Classify every bus; fix the slack voltage \(|V_1|\angle0^\circ\) | Section 18-4 |
| 3 | Set the flat start: \(|V_i|=1.0\), \(\delta_i=0\) at PQ buses; \(|V_i|=|V_i|_{sched}\), \(\delta_i=0\) at PV buses | Section 18-8 |
| 4 | Sweep \(i=2,\dots,n\). At a PV bus first estimate \(Q_i\) and test it against its limits | Section 19-5 |
| 5 | Apply the voltage update; accelerate at PQ buses if \(\lambda \ne 1\) | Sections 19-3, 19-6 |
| 6 | At a PV bus still within its limits, force the magnitude back to the scheduled value | Section 19-5 |
| 7 | After the sweep, evaluate all mismatches \(\Delta P_i\), \(\Delta Q_i\) | Section 19-7 |
| 8 | If any mismatch exceeds \(\varepsilon\), return to step 4; otherwise stop | Section 19-7 |
| 9 | Compute slack output, PV bus reactive output, line flows and losses | Section 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.
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.
| Property | Gauss-Seidel | Newton-Raphson (Chapter 20) |
|---|---|---|
| Iterations to converge | Grows roughly as \(n\) | \(3\)–\(5\), nearly independent of \(n\) |
| Work per iteration | Very small, \(\propto\) branch count | Large: build and factorise the Jacobian |
| Memory | \(\mathbf{Y}_{bus}\) only | \(\mathbf{Y}_{bus}\) plus Jacobian and its factors |
| Programming effort | An afternoon | Substantial |
| Sensitivity to the starting point | Low — a flat start almost always works | Higher — can diverge from a poor start |
| Behaviour near the loadability limit | Slows down gracefully | Jacobian becomes ill-conditioned |
| Convergence type | Linear | Quadratic |
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.
Worked Examples
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:
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.
| Pass | Gauss \(x_1\) | Gauss \(x_2\) | error | Gauss-Seidel \(x_1\) | Gauss-Seidel \(x_2\) | error |
|---|---|---|---|---|---|---|
| 1 | 1.25000 | 1.33333 | 0.75000 | 1.25000 | 1.75000 | 0.75000 |
| 2 | 1.75000 | 1.75000 | 0.25000 | 1.90625 | 1.96875 | 0.09375 |
| 3 | 1.90625 | 1.91667 | 0.09375 | 1.98828 | 1.99609 | 0.01172 |
| 4 | 1.96875 | 1.96875 | 0.03125 | 1.99854 | 1.99951 | 0.001465 |
| 5 | 1.98828 | 1.98958 | 0.01172 | 1.99982 | 1.99994 | 0.000183 |
| 6 | 1.99609 | 1.99609 | 0.003906 | 1.99998 | 1.99999 | 0.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.
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
so \(V_2^{(1)} = 0.98213\angle-0.9335^\circ\). For the second iteration the conjugate in the numerator now carries this value:
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.
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:
The load term is \(\big(-4.0+j2.5\big)/1.0 = -4.0+j2.5\). Subtracting the neighbour sum:
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.
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:
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\):
The magnitude has come out as \(1.03784\) rather than the scheduled \(1.04\). Keep the angle and impose the schedule:
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\).
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:
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\) | Iterations | Mismatch after 4 sweeps | Comment |
|---|---|---|---|
| 1.0 | 12 | \(1.18\times10^{-2}\) | Plain Gauss-Seidel; error ratio \(0.411\) per sweep |
| 1.2 | 7 | \(1.10\times10^{-3}\) | Best on this system |
| 1.6 | 18 | \(2.99\times10^{-2}\) | Worse than no acceleration |
| 1.9 | 65 | \(2.06\times10^{-1}\) | Erratic; the mismatch barely falls at first |
| 2.1 | diverges | \(5.31\times10^{-1}\) and rising | Past 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.
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:
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
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.
Chapter Summary
Rearrange to \(x=g(x)\) and iterate; it converges when \(|g'|<1\), and the error falls geometrically.
Using the latest values within the sweep squares the convergence ratio — half the iterations for the same work.
\(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.
It is diagonally dominant by construction, which is what makes the iteration converge at all.
Estimate \(Q_i\) from the present iterate, update, then force \(|V_i|\) back to its scheduled value keeping the angle.
Clamp \(Q\) at the violated bound, skip the magnitude correction, and let the bus behave as PQ.
\(V_{acc} = V_{old} + \lambda(V_{new}-V_{old})\) with \(1<\lambda<2\); the optimum is found by trial, not by formula.
Iterations grow roughly as \(n\), so total work grows as \(n^2\) — the reason Chapter 20 exists.
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.
- 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.
- 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.
- 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\).
- 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.
- 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.
- 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.
- 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.
- 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?