Two AC voltages arrive at a junction in a circuit. They oscillate at the same frequency but at different phases — one peaks a little before the other. What is the combined voltage?
You could set up a trigonometric identity and expand. It works, but it is laborious. Or you could represent each voltage as a complex number, add them in two lines, and read off the result. That shortcut — replacing a trigonometric addition with a complex addition — is the phasor method, and it is how electrical engineers have analysed circuits since the 1890s.
27.1 What this chapter helps you do
Symbols to keep handy
These are the bits of notation you'll see a lot. If a line of symbols feels like a fence, read it out loud once, then keep going.
Z = R + jX: complex impedance: R is resistance, X is reactance
A: a phasor with amplitude A and phase angle phi
Definitions to keep handy
These are the words we keep coming back to. If one feels slippery, come back here and steady it before you push on.
phasor: A complex number representing a sinusoidal quantity by its amplitude and phase angle.
amplitude: The peak value of a sinusoidal wave — the distance from zero to the crest.
phase angle: The horizontal shift of a wave, measured in radians or degrees from a reference.
impedance: The complex-valued generalisation of resistance for AC circuits, written Z = R + jX.
Here is the main move this chapter is making, in plain terms. You do not need to be fast. You just need to keep the thread.
Coming in: You know that complex numbers live in a plane, and that multiplying by i rotates a number by 90 degrees. You also know that sine and cosine describe oscillation. These two ideas are the same idea.
Leaving with: A phasor is a complex number that rotates. As it spins, its real part traces a cosine wave and its imaginary part traces a sine wave. This means that adding sinusoidal signals — the core problem of AC circuit analysis — is equivalent to adding complex numbers, which is far simpler. Engineers use j (not i) for the imaginary unit; the notation is different, the mathematics is identical.
27.2 Rotation and oscillation are the same thing
Here is the connection at the heart of this chapter. Take Euler’s formula:
e^{j\theta} = \cos\theta + j\sin\theta
Read it as: the complex number e^{j\theta} — that is, e to the power of j times theta — sits on the unit circle at angle \theta from the positive real axis. Its real part is \cos\theta and its imaginary part is \sin\theta.
Now replace \theta with \omega t — that is, angle increasing at a constant rate \omega (called the angular frequency, read as omega) over time t:
e^{j\omega t} = \cos(\omega t) + j\sin(\omega t)
As t increases, the angle \omega t increases, and the point e^{j\omega t} rotates steadily around the unit circle. Its real part traces a cosine wave. Its imaginary part traces a sine wave. The rotation and the oscillation are the same object viewed two different ways.
This is not a trick or an approximation. It is an exact identity. A phasor is a complex number that rotates in exactly this way. The wave you observe — say, the voltage across a component in a circuit — is the real part of the phasor as it spins.
One more notation to be clear about: engineers write j where mathematicians write i for the imaginary unit (to avoid confusion with current, which is also called i). The mathematics is identical.
{const W =620, H =340;const cx =130, cy =170, r =100;const waveStartX =260, waveW =340, waveH =200;const waveCY = cy;const theta = (phasorAngleDeg *Math.PI) /180;const tipX = cx + r *Math.cos(theta);const tipY = cy - r *Math.sin(theta);// SVG y invertedconst cosVal =Math.cos(theta);const sinVal =Math.sin(theta);const svg = d3.create("svg").attr("viewBox",`0 0 ${W}${H}`).attr("width","100%").attr("style",`max-width:${W}px; font-family:inherit;`);// ── Unit circle ── svg.append("circle").attr("cx", cx).attr("cy", cy).attr("r", r).attr("fill","none").attr("stroke","#d1d5db").attr("stroke-width",1.5);// Axes through centre svg.append("line").attr("x1", cx - r -15).attr("y1", cy).attr("x2", cx + r +15).attr("y2", cy).attr("stroke","#9ca3af").attr("stroke-width",1); svg.append("line").attr("x1", cx).attr("y1", cy - r -15).attr("x2", cx).attr("y2", cy + r +15).attr("stroke","#9ca3af").attr("stroke-width",1); svg.append("text").attr("x", cx + r +18).attr("y", cy +4).attr("font-size","11px").attr("fill","#9ca3af").text("Re"); svg.append("text").attr("x", cx -6).attr("y", cy - r -18).attr("font-size","11px").attr("fill","#9ca3af").text("Im");// Phasor arrow svg.append("line").attr("x1", cx).attr("y1", cy).attr("x2", tipX).attr("y2", tipY).attr("stroke","#2563eb").attr("stroke-width",2.5).attr("stroke-linecap","round"); svg.append("circle").attr("cx", tipX).attr("cy", tipY).attr("r",5).attr("fill","#2563eb");// Angle arcconst arcPath = d3.arc()({innerRadius:28,outerRadius:28,startAngle:-theta,endAngle:0 }); svg.append("path").attr("d", arcPath).attr("transform",`translate(${cx},${cy})`).attr("fill","none").attr("stroke","#f59e0b").attr("stroke-width",1.5); svg.append("text").attr("x", cx +34).attr("y", cy -6).attr("font-size","11px").attr("fill","#f59e0b").text("θ");// ── Projection lines (dashed) ──const waveX0 = waveStartX;// Cosine projection: horizontal from tip to wave plotconst cosWaveX = waveX0 + (phasorAngleDeg /360) * waveW;const cosWaveY = waveCY - cosVal * (waveH /2-20); svg.append("line").attr("x1", tipX).attr("y1", tipY).attr("x2", cosWaveX).attr("y2", tipY).attr("stroke","#0d9488").attr("stroke-width",1).attr("stroke-dasharray","4,3");// Sine projection: vertical from tip downconst sineWaveY = waveCY + (waveH /2+30) + (cosVal * (waveH /2-20));// Actually draw sine below in a simpler way:// We'll just show the dot on each wave// ── Cosine wave ──const cosPoints = [];for (let deg =0; deg <=360; deg +=2) {const rad = (deg *Math.PI) /180; cosPoints.push([waveX0 + (deg /360) * waveW, waveCY -Math.cos(rad) *70]); } svg.append("path").attr("d",`M ${cosPoints.map(p => p.join(",")).join(" L ")}`).attr("stroke","#0d9488").attr("stroke-width",2).attr("fill","none"); svg.append("text").attr("x", waveX0).attr("y", waveCY -82).attr("font-size","11px").attr("fill","#0d9488").text("cos(θ) = Re part");// Dot on cosine wave at current angleconst cosDotX = waveX0 + (phasorAngleDeg /360) * waveW;const cosDotY = waveCY - cosVal *70; svg.append("circle").attr("cx", cosDotX).attr("cy", cosDotY).attr("r",5).attr("fill","#0d9488");// ── Sine wave (below) ──const sineBase = waveCY +140;const sinPoints = [];for (let deg =0; deg <=360; deg +=2) {const rad = (deg *Math.PI) /180; sinPoints.push([waveX0 + (deg /360) * waveW, sineBase -Math.sin(rad) *55]); } svg.append("path").attr("d",`M ${sinPoints.map(p => p.join(",")).join(" L ")}`).attr("stroke","#a855f7").attr("stroke-width",2).attr("fill","none"); svg.append("text").attr("x", waveX0).attr("y", sineBase -62).attr("font-size","11px").attr("fill","#a855f7").text("sin(θ) = Im part");const sinDotX = waveX0 + (phasorAngleDeg /360) * waveW;const sinDotY = sineBase - sinVal *55; svg.append("circle").attr("cx", sinDotX).attr("cy", sinDotY).attr("r",5).attr("fill","#a855f7");// Vertical dashed from phasor tip to x-axis (shows cos value) svg.append("line").attr("x1", tipX).attr("y1", tipY).attr("x2", tipX).attr("y2", cy).attr("stroke","#a855f7").attr("stroke-width",1).attr("stroke-dasharray","4,3");// Values readout svg.append("text").attr("x", waveX0).attr("y", H -10).attr("font-size","12px").attr("fill","#374151").attr("font-weight","600").text(`θ = ${phasorAngleDeg}° cos θ = ${cosVal.toFixed(3)} sin θ = ${sinVal.toFixed(3)}`);return svg.node();}
Drag the angle slider. Watch the dot on each wave move exactly as the phasor tip moves. They are describing the same thing.
27.3 What the notation is saying
A sinusoidal signal takes the form:
v(t) = A\sin(\omega t + \phi)
Read it as: “v of t equals A times sine of omega t plus phi.” Four pieces:
A — the amplitude (ay): the peak value, the distance from zero to the crest
\omega — the angular frequency (omega, in radians per second): how fast the phasor rotates; \omega = 2\pi f where f is frequency in hertz
t — time in seconds
\phi — the phase angle (phi, in radians or degrees): how much the wave is shifted from a reference wave
The period — the time for one complete cycle — is T = 2\pi/\omega.
Now, the phasor. When we write the full rotating complex number Ae^{j(\omega t + \phi)}, the e^{j\omega t} part is the same for every signal in a circuit operating at frequency \omega. It is just the shared rotation. The part that distinguishes one signal from another is Ae^{j\phi} — the amplitude and the phase shift.
So we define the phasor for the signal A\sin(\omega t + \phi) as:
\mathbf{V} = A\angle\phi
Read that as: “A at angle phi” — a complex number with magnitude A and argument \phi. The \angle symbol is shorthand for polar form: A\angle\phi = A(\cos\phi + j\sin\phi).
When we need to add sinusoidal signals, we convert each to a phasor, add the phasors (as complex numbers), and convert the result back to a sinusoid. The e^{j\omega t} rotation is implicit — it is the same for all signals and can be dropped during the calculation, then restored at the end.
Why we can drop e^{j\omega t}
Every signal in the circuit rotates at the same angular frequency \omega. The relative angles between phasors do not change during rotation — only the absolute positions change. So for addition and subtraction, the rotating part is irrelevant. We work with the amplitudes and phase angles alone, then restore the rotation at the end when we write the answer as a waveform.
27.4 Adding sinusoidal waveforms — the key technique
Both oscillate at the same frequency (\omega = 100\pi rad/s). The question is: what is v_1 + v_2?
The trigonometric route. You can expand \sin(100\pi t + 60°) using the angle-addition formula, collect terms, and simplify. It takes half a page and is error-prone.
The phasor route. Convert each signal to a phasor:
Adjust the amplitudes and phases. Notice that the resultant phasor (green arrow) is always the vector sum of the other two, and the green waveform always matches.
27.4.1 The a\sin\omega t + b\cos\omega t form
A common variation: you have one sine and one cosine at the same frequency, and you want to write their sum as a single sinusoid.
a\sin\omega t + b\cos\omega t = R\sin(\omega t + \phi)
Expand the right side using the angle-addition formula:
R\sin(\omega t + \phi) = R\cos\phi\sin\omega t + R\sin\phi\cos\omega t
Match coefficients:
R\cos\phi = a \qquad R\sin\phi = b
Square and add: R^2\cos^2\phi + R^2\sin^2\phi = a^2 + b^2, so:
R = \sqrt{a^2 + b^2}
Divide: \tan\phi = b/a, so \phi = \arctan(b/a).
This is exactly the polar-form conversion of the complex number a + jb. The phasor a + jb has magnitude \sqrt{a^2+b^2} and argument \arctan(b/a) — which confirms that the combination formula is just a restatement of complex arithmetic.
27.5 Worked examples
Example 1: phasor addition (engineering context)
Two AC currents enter a node: i_1 = 15\sin(\omega t) A and i_2 = 10\sin(\omega t + 45°) A. Find the total current.
So 3\sin\omega t + 4\cos\omega t = 5\sin(\omega t + 53.1°).
Check: at \omega t = 0: left side = 3(0) + 4(1) = 4. Right side = 5\sin(53.1°) = 5(0.8) = 4. Yes.
This is a 3-4-5 right triangle in the phasor plane — the amplitude 5 is the hypotenuse.
Example 3: all four methods for adding two phasors
Add \mathbf{V}_1 = 100\angle 0° and \mathbf{V}_2 = 60\angle 30°.
Method 1 — Graphical. Draw \mathbf{V}_1 as a horizontal arrow of length 100. Draw \mathbf{V}_2 from the tip of \mathbf{V}_1 at 30° above horizontal, length 60. Measure the resultant arrow from origin to the final tip. (Requires accurate drawing; gives approximate answer.)
Method 2 — Sine and cosine rules. The angle between the two phasors is 30°. The phasor triangle has sides 100, 60, and unknown, with included angle 180° - 30° = 150° (exterior). By the cosine rule:
Method 4 — Complex arithmetic directly. Same as Method 3, but written explicitly as complex number addition. This is the preferred method for more than two phasors.
All four methods give |\mathbf{V}| \approx 154.9 V at approximately 11.2°. Methods 3 and 4 are fastest when working with three or more phasors. Methods 1 and 2 help build geometric intuition.
27.6 Complex impedance
In a DC circuit, resistance R (in ohms) relates voltage and current by Ohm’s law: V = IR. Resistance is a single real number — it scales the current but does not shift the timing.
In an AC circuit, components affect both the amplitude and the phase of the current. The complex-valued generalisation of resistance is called impedance, written Z = R + jX — read as “Z equals R plus j times X.” The symbol j is the imaginary unit in engineering notation. R is the resistance (real part) and X is the reactance (ree-AK-tense, imaginary part).
Three types of component:
Resistor. Impedance Z_R = R. Purely real — no phase shift. A resistor opposes current equally at all frequencies.
Inductor. Impedance Z_L = j\omega L where L is inductance in henries. Voltage leads current by 90°. At higher frequencies, an inductor has higher impedance — it resists change in current.
Capacitor. Impedance Z_C = \dfrac{1}{j\omega C} = \dfrac{-j}{\omega C} where C is capacitance in farads. Current leads voltage by 90°. At higher frequencies, a capacitor has lower impedance — it passes high-frequency signals easily.
For series components, total impedance is:
Z = Z_R + Z_L + Z_C = R + j\!\left(\omega L - \frac{1}{\omega C}\right) = R + jX
The magnitude |Z| = \sqrt{R^2 + X^2} tells you the overall opposition to current. The argument \phi = \arctan(X/R) tells you the phase shift between voltage and current. The power factor — how efficiently the circuit uses electrical power — is \cos\phi.
Code
viewof rlc_R = Inputs.range([0,500], { label:"Resistance R (Ω)",step:1,value:100 })
Code
viewof rlc_L = Inputs.range([0,1], { label:"Inductance L (H)",step:0.01,value:0.1 })
Code
viewof rlc_C = Inputs.range([10,1000], { label:"Capacitance C (µF)",step:10,value:100 })
Code
viewof rlc_omega = Inputs.range([1,1000], { label:"Angular frequency ω (rad/s)",step:1,value:100 })
Code
{const R = rlc_R;const L = rlc_L;const C = rlc_C *1e-6;const omega = rlc_omega;const X = omega * L -1/ (omega * C);const absZ =Math.sqrt(R * R + X * X);const phi =Math.atan2(X, R);const phiDeg = phi *180/Math.PI;const pf =Math.cos(phi);const W =420, H =320;const cx =140, cy =160;const maxVal =Math.max(absZ,100,Math.abs(X) +10, R +10);const sc =Math.min(110,110) / maxVal;const arrowColor =Math.abs(X) <5?"#059669": X >0?"#2563eb":"#f59e0b";const label =Math.abs(X) <5?"Resonance (Z = R)": X >0?"Inductive (X > 0)":"Capacitive (X < 0)";const svg = d3.create("svg").attr("viewBox",`0 0 ${W}${H}`).attr("width","100%").attr("style",`max-width:${W}px; font-family:inherit;`);// Axes svg.append("line").attr("x1", cx -120).attr("y1", cy).attr("x2", cx +130).attr("y2", cy).attr("stroke","#d1d5db").attr("stroke-width",1.5); svg.append("line").attr("x1", cx).attr("y1", cy -120).attr("x2", cx).attr("y2", cy +120).attr("stroke","#d1d5db").attr("stroke-width",1.5); svg.append("text").attr("x", cx +134).attr("y", cy +4).attr("font-size","11px").attr("fill","#9ca3af").text("R (Ω)"); svg.append("text").attr("x", cx +3).attr("y", cy -124).attr("font-size","11px").attr("fill","#9ca3af").text("X (Ω)");// R component (horizontal) svg.append("line").attr("x1", cx).attr("y1", cy).attr("x2", cx + R * sc).attr("y2", cy).attr("stroke","#9ca3af").attr("stroke-width",1.5).attr("stroke-dasharray","4,3");// X component (vertical) svg.append("line").attr("x1", cx + R * sc).attr("y1", cy).attr("x2", cx + R * sc).attr("y2", cy - X * sc).attr("stroke","#9ca3af").attr("stroke-width",1.5).attr("stroke-dasharray","4,3");// Impedance arrowconst tipX = cx + R * sc;const tipY = cy - X * sc; svg.append("line").attr("x1", cx).attr("y1", cy).attr("x2", tipX).attr("y2", tipY).attr("stroke", arrowColor).attr("stroke-width",3).attr("stroke-linecap","round"); svg.append("circle").attr("cx", tipX).attr("cy", tipY).attr("r",5).attr("fill", arrowColor);// Z label svg.append("text").attr("x", tipX +6).attr("y", tipY -4).attr("font-size","12px").attr("fill", arrowColor).attr("font-weight","600").text("Z");// Angle arcif (R >0) {const arcR =30;const arcPath = d3.arc()({innerRadius: arcR,outerRadius: arcR,startAngle:-Math.max(Math.min(phi,Math.PI),-Math.PI),endAngle:0 }); svg.append("path").attr("d", arcPath).attr("transform",`translate(${cx},${cy})`).attr("fill","none").attr("stroke","#f59e0b").attr("stroke-width",1.5); svg.append("text").attr("x", cx +34).attr("y", cy - (X >0?6:-14)).attr("font-size","10px").attr("fill","#f59e0b").text("φ"); }// Readout panelconst px = W -195, py =20; svg.append("rect").attr("x", px).attr("y", py).attr("width",188).attr("height",130).attr("rx",6).attr("fill","#f9fafb").attr("stroke","#e5e7eb").attr("stroke-width",1);const rows = [ ["X = ωL − 1/ωC",`${X.toFixed(1)} Ω`], ["|Z| = √(R²+X²)",`${absZ.toFixed(1)} Ω`], ["φ = arctan(X/R)",`${phiDeg.toFixed(1)}°`], ["Power factor cos φ",`${pf.toFixed(3)}`], ["", label] ]; rows.forEach(([k, v], i) => { svg.append("text").attr("x", px +8).attr("y", py +20+ i *22).attr("font-size","10px").attr("fill","#6b7280").text(k); svg.append("text").attr("x", px +180).attr("y", py +20+ i *22).attr("text-anchor","end").attr("font-size","11px").attr("fill", i ===4? arrowColor :"#1f2937").attr("font-weight","600").text(v); });return svg.node();}
Worked example — RLC series circuit.
Given: R = 100\ \Omega, L = 0.1\ \text{H}, C = 100\ \mu\text{F}, \omega = 100\ \text{rad/s}.
Negative angle means capacitive dominates at this frequency — current leads voltage. Power factor:
\cos\phi = \cos(-42.0°) \approx 0.743
Try setting the sliders above to these values to confirm the readout.
27.7 Where this goes
This chapter is the gateway to the frequency-domain methods that run through most of Vol 7.
Fourier series (Vol 7, Fourier and PDEs section) extends what you have done here: instead of adding two or three phasors at one frequency, it decomposes an arbitrary periodic signal into a sum of phasors at many frequencies — the fundamental and its harmonics. The coefficient of each phasor tells you how much of that frequency is present. Every concept in Fourier analysis rests on the rotating-phasor picture you have just built.
Laplace transforms (Vol 7) take the phasor method further: instead of assuming sinusoidal steady-state signals (as phasors do), the Laplace transform handles any signal — including switch-on transients, impulses, and arbitrary time functions — by working with complex frequencies s = \sigma + j\omega. The phasor you know (j\omega) is a special case of s with \sigma = 0. Understanding phasors first makes the Laplace transform feel like a natural extension rather than an abstract tool.
Where this shows up
Electrical engineering: every AC circuit calculation — power factor correction, filter design, motor drives, transmission lines — uses phasors. This chapter is how ECE 202 begins.
Acoustics: sound waves from two speakers interfere constructively or destructively depending on the phase difference. The loudness at any point is the magnitude of the phasor sum.
Optics and physics: thin-film interference, diffraction, and quantum mechanical probability amplitudes all use phasor addition. The double-slit pattern is a phasor diagram.
Signal processing: digital filters are specified and analysed in the frequency domain using the complex frequency response H(j\omega) — the impedance concept applied to signals rather than circuits.
Structural engineering: vibrating structures have resonant frequencies where the impedance analogue (dynamic stiffness) passes through zero. The mathematics is identical to RLC resonance.
27.8 Exercises
These are puzzles. Each one has a clean numerical answer, but the interesting step is always the translation: turning the waveform description into a phasor, doing the arithmetic in the complex plane, and reading the answer back out.
3. Express 3\sin\omega t + 4\cos\omega t in the form R\sin(\omega t + \phi).
Code
makeStepperHTML(3, [ {op:"Identify a and b",eq:"a\\sin\\omega t + b\\cos\\omega t:\\quad a = 3,\\ b = 4",note:"The coefficient of sin ωt gives a; the coefficient of cos ωt gives b." }, {op:"Compute R",eq:"R = \\sqrt{a^2 + b^2} = \\sqrt{9 + 16} = \\sqrt{25} = 5" }, {op:"Compute phase angle",eq:"\\phi = \\arctan\\!\\left(\\frac{b}{a}\\right) = \\arctan\\!\\left(\\frac{4}{3}\\right) \\approx 53.1°" }, {op:"Write the answer",eq:"3\\sin\\omega t + 4\\cos\\omega t = 5\\sin(\\omega t + 53.1°)" }, {op:"Check",eq:"\\text{At }\\omega t = 0:\\quad 3(0)+4(1)=4;\\quad 5\\sin(53.1°)=5(0.8)=4 \\checkmark" }])
4. An RLC series circuit has R = 50\ \Omega, L = 0.2\ \text{H}, C = 200\ \mu\text{F} at \omega = 50\ \text{rad/s}. Find the total impedance Z, its magnitude, phase angle, and power factor. Is the circuit inductive or capacitive at this frequency?
Code
makeStepperHTML(4, [ {op:"Compute inductive reactance",eq:"X_L = \\omega L = 50 \\times 0.2 = 10\\\\Omega" }, {op:"Compute capacitive reactance",eq:"X_C = \\frac{1}{\\omega C} = \\frac{1}{50 \\times 200 \\times 10^{-6}} = \\frac{1}{0.01} = 100\\\\Omega" }, {op:"Total impedance",eq:"Z = R + j(X_L - X_C) = 50 + j(10 - 100) = 50 - 90j\\\\Omega",note:"Negative imaginary part means the circuit is capacitive at this frequency." }, {op:"Magnitude",eq:"|Z| = \\sqrt{50^2 + 90^2} = \\sqrt{2500 + 8100} = \\sqrt{10600} \\approx 102.9\\\\Omega" }, {op:"Phase angle",eq:"\\phi = \\arctan\\!\\left(\\frac{-90}{50}\\right) = \\arctan(-1.8) \\approx -60.9°" }, {op:"Power factor",eq:"\\cos\\phi = \\cos(-60.9°) \\approx 0.486",note:"A power factor below 1 means some of the supplied power is returned to the source each cycle — reactive power." }, {op:"Check",eq:"50 - 90j:\\; |\\cdot| = \\sqrt{50^2+90^2} \\approx 102.9\\\\checkmark" }])
5. Two parallel branches of an AC circuit carry currents \mathbf{I}_1 = 5\angle 0° A and \mathbf{I}_2 = 3\angle{-45°} A. Find the total supply current phasor and express it as a sinusoid (leave \omega symbolic).