The problem: a network that speaks ten dialects
Imagine you are handed the wiring diagram of a regional grid. A generator pumps out power at 22 kV. A step-up transformer lifts it to 345 kV for long-distance three-phase transmission. Another transformer drops it to 69 kV at a substation, then a third drops it to 13.8 kV for the distribution feeder, and finally a pole-top unit delivers 240 V to a house. That is five voltage levels in one path — and a real grid has hundreds of paths and thousands of buses.
If you try to solve this directly with volts, amps, and ohms, you drown in transformer ratios. Every time you cross a transformer you must rescale: a 10 Ω impedance on the 69 kV side *looks like* a completely different number of ohms when reflected to the 13.8 kV side — multiplied by the square of the turns ratio. Track that across hundreds of transformers and you will make an arithmetic mistake on the first afternoon.
Per-unit: pick a base, divide by it, breathe
The per-unit system is disarmingly simple. You choose a base value for each quantity, then express every real number as a fraction of its base: quantity in per-unit = actual value ÷ base value. A voltage of 13.8 kV on a system whose base is 13.8 kV becomes 1.0 per-unit (often written 1.0 p.u.). The same idea you already use when you say a stock is "up 3%" instead of quoting the dollar figure — you have normalised to a base.
The magic is in *how you choose the bases*. You pick two independent bases freely — almost always base power (S_base, in MVA, the same number for the entire network) and base voltage (V_base, which you let change at each transformer in exact proportion to the turns ratio). The other two bases — current and impedance — are then *forced* by physics:
Choose: S_base = 100 MVA (one value, whole system)
V_base = 13.8 kV (changes per voltage zone)
Derived: I_base = S_base / (sqrt(3) * V_base) [three-phase]
Z_base = V_base^2 / S_base
= (13.8 kV)^2 / 100 MVA = 1.904 ohms
Per-unit: V_pu = V_actual / V_base
I_pu = I_actual / I_base
Z_pu = Z_actual / Z_base
S_pu = S_actual / S_baseThere is a second, quieter gift. Equipment nameplates already quote impedances in per-unit (or percent) on their *own* ratings — a transformer might read "8% impedance". Per-unit is the lingua franca manufacturers already speak, so you rarely have to convert raw ohms at all. And it sanity-checks your work: a healthy bus voltage is around 1.0 p.u., so if your solver spits out 1.7 p.u. or 0.4 p.u., you instantly know something is wrong.
A worked normalisation: one transformer, two zones
Let's make it concrete with the smallest interesting case: a single transmission line feeding a load through one transformer. We will normalise everything to a common base and watch the transformer disappear. Suppose a 138/13.8 kV transformer (ratio 10:1) rated 50 MVA has 8% leakage impedance, and the 13.8 kV feeder has a real series impedance of 0.4 Ω.
- Pick a system base. Choose S_base = 100 MVA for the whole network. Choose V_base = 138 kV on the high side; because the transformer is 10:1, V_base automatically becomes 13.8 kV on the low side.
- Convert the transformer impedance to the system base. Its 8% is quoted on its *own* 50 MVA rating, so rescale by the power ratio: Z_pu(new) = 0.08 × (100 MVA / 50 MVA) = 0.16 p.u. (The voltage base already matches, so no voltage correction is needed here.)
- Find Z_base on the 13.8 kV side. Z_base = V_base² / S_base = (13.8 kV)² / 100 MVA = 1.904 Ω.
- Convert the feeder impedance. Z_pu(feeder) = 0.4 Ω / 1.904 Ω = 0.21 p.u.
- Add them in series — across the transformer, with no ratio gymnastics. Total path impedance = 0.16 + 0.21 = 0.37 p.u. The transformer is now just another series element; the two zones have merged into one circuit.
Z_xfmr = 0.16 pu Z_feeder = 0.21 pu
Source 1.0pu ---/\/\/\/\---o---/\/\/\/\--- Load
(138 kV) | (13.8 kV)
[in per-unit, the 10:1
transformer is just 1:1]
Total series Z = 0.16 + 0.21 = 0.37 pu
Across two voltage levels, added like ordinary resistors.Load flow: what voltage shows up where?
Now that the whole grid is one clean per-unit circuit, we can ask the operator's central question. Generators inject power at certain buses; loads draw power at others; lines and transformers connect them with known impedances. Given all that, what voltage magnitude and angle appear at every bus, and how much power flows down every line? That steady-state question is load flow — also called power-flow analysis. It is the single most-run calculation in the entire power industry.
Each bus has four quantities of interest: voltage magnitude |V|, voltage angle θ, real power P, and reactive power Q. At any bus you typically *know* two and must *solve for* the other two. That gives three bus types, and naming them is half the battle:
- Slack (swing) bus — one chosen reference generator. You fix its |V| = 1.0 p.u. and its angle θ = 0°, and let it supply *whatever* P and Q the rest of the network turns out to need. It is the bookkeeper that closes the energy balance, including all the line losses you cannot know until you have solved.
- PV (generator) bus — at each other generator you know the real power P it is dispatched to produce and the voltage magnitude |V| its excitation holds. You solve for its angle θ and the reactive power Q it must inject.
- PQ (load) bus — at a load you know how much real and reactive power it draws (P and Q are given, set by the consumers). You solve for the resulting voltage magnitude |V| and angle θ — which is exactly what you worry about: will the voltage at the far end of the feeder sag too low?
Why it's nonlinear — and how the solver wins anyway
Here is the twist that makes load flow genuinely hard. In a plain DC resistor circuit, the unknowns are voltages and the equations are *linear*: I = V/R, and KCL gives you a tidy matrix you invert once. But in the grid, what the operator specifies at a bus is power, not current — and power is voltage times current. Since current itself depends on voltage, the power balance at each bus contains terms like |V_i|·|V_j| and cos(θ_i − θ_j). Products of unknowns, and trig functions of unknowns. That is the definition of a nonlinear system.
Power-balance equation at bus i (the source of nonlinearity):
P_i = |V_i| * SUM_j |V_j| * ( G_ij*cos(th_i - th_j)
+ B_ij*sin(th_i - th_j) )
Q_i = |V_i| * SUM_j |V_j| * ( G_ij*sin(th_i - th_j)
- B_ij*cos(th_i - th_j) )
Unknowns appear as PRODUCTS |V_i||V_j| and inside cos/sin.
--> no single matrix inverse solves it; you must iterate.Because you cannot solve it in one shot, you iterate: guess a solution (the universal first guess is a "flat start" — every bus at 1.0 p.u. and 0°), compute how badly the power balance is violated, nudge the voltages to reduce the error, and repeat until the mismatch is negligibly small. The workhorse algorithm is Newton–Raphson, the same root-finding method from calculus, generalised to many variables. It linearises the equations around the current guess using a matrix of partial derivatives called the Jacobian, solves that linear system for a correction, and applies it.
What load flow is actually for
Load flow is not an academic exercise; it is the daily bread of grid planning and operation. Run it and the network confesses everything you need to know to keep the lights on:
- Voltage compliance. Every bus voltage must stay within a band (typically 0.95–1.05 p.u.). Load flow flags the feeder ends sagging below 0.95 or the lightly loaded nodes ballooning above 1.05, so you know where to add a capacitor bank or adjust a transformer tap.
- Thermal loading. It reports the power and current on every line. Anything above its rating will overheat and sag; planners use this to size new lines and to decide which existing circuits are the bottlenecks.
- Loss accounting. The difference between power generated and power consumed is the network's I²R losses — often a few percent. Load flow quantifies it, which feeds directly into how generation is dispatched economically.
- Reactive power and [[ee-power-factor|power factor]]. Because the equations carry Q explicitly, load flow shows where reactive power is short — the usual culprit behind low voltage — guiding where to place reactive support and improve the power factor seen at key buses.
- Contingency "what-ifs." Operators run load flow with one line or generator removed ("N−1" analysis) to confirm the grid survives any single failure without cascading. This is run continuously in control centres, often every few minutes.
Put together, per-unit and load flow are the lens through which the whole grid becomes a single, analysable machine. Per-unit dissolves the voltage levels and transformers into one clean circuit; load flow then solves that circuit's nonlinear power balance to reveal the voltage and flow at every point. Every grid expansion plan, every interconnection study, every operator's contingency screen rests on these two ideas working in concert.