Interactive tutorial · Transmission lines

Where Wires Stop Being Wires

LIVE SIMULATOR Tune it right here — no install TransmissionLineLab

A wire is a wire, until it isn’t.

In lumped circuit theory a wire is an equipotential: the same voltage at both ends, at the same instant, always. That model dies quietly the moment the wire gets long compared to a wavelength. At 400 MHz, the wavelength inside ordinary coax is about half a metre. So a one-metre patch cable is two wavelengths long — and the voltage at one end has essentially nothing to do with the voltage at the other. It isn’t a node anymore. It’s a medium.

Everything above is that moment, made draggable. Below is what to look for.

Two ways to look at one line

The header toggles between Pulse and Wave. Same line, same load, same Γ — different question.

Pulse is the time domain. Launch a single bump, watch it travel, hit the load, and come back. Reflection here is a thing that happens at a time. You can count transit times.

Wave is the steady state at one frequency, where forward and backward waves have been interfering since forever. Reflection here is a fixed pattern in space. Nothing travels; it just breathes.

Most confusion about transmission lines comes from silently mixing these two pictures. Keeping them on separate tabs is the whole pedagogical point.

The one equation

Γ = (Z_L − Z₀) / (Z_L + Z₀)

Three anchors are worth memorising, and the buttons under the load slider jump straight to them:

LoadZ_LΓWhat comes back
Short0−1everything, inverted
MatchedZ₀0nothing
Open+1everything, in phase

Everything else lives in between.

A slider that behaves

Z_L runs from 0 to ∞, which is a hostile range for a slider. The mapping used here is:

Z_L = Z₀ · s/(1 − s),   s ∈ [0, 1]

which makes

Γ = 2s − 1

exactly linear in the slider position. Short sits at the far left, matched dead centre, open at the far right, and equal drags produce equal changes in reflection. The impedance axis is deliberately nonlinear so that the reflection axis can be linear — because reflection is the thing you’re trying to develop a feel for, not ohms.

τ = 2 is not free energy

The transmission coefficient is τ = 1 + Γ. At an open circuit, τ = 2: the voltage at the load end doubles. Every student asks the same reasonable question — where does the extra energy come from?

Nowhere. τ is a voltage ratio, not a power ratio. Power splits as:

reflected = |Γ|²        delivered = 1 − |Γ|²

At an open, |Γ| = 1: 100% reflected, 0% delivered. The voltage doubles, the current is forced to zero, and their product — the power — is zero. The readout says so, and the Power view makes it blunt: at an open, the trace sits flat on the axis. Nothing is delivered to an open circuit no matter how impressive the voltage looks.

τ² would be 4. The number 4 appears nowhere in physics here. Squaring a voltage ratio is not a power ratio when the impedance changes across the boundary — that’s the trap.

Current is the mirror image

Voltage reflects with Γ. Current reflects with −Γ:

V     = V⁺ + V⁻
I·Z₀  = V⁺ − V⁻

One sign flip, and everything follows from it. At an open, the current is forced to zero while the voltage doubles. At a short, the voltage is forced to zero while the current doubles. Perfect mirrors — flip between Voltage and Current at each extreme and watch them trade places.

This is also why power vanishes at both ends: p·Z₀ = (V⁺)² − (V⁻)². One factor always dies. An open can’t dissipate because no current flows; a short can’t dissipate because no voltage develops. Different mechanisms, same zero.

V and I together, and the scale problem

The V + I view puts both on one plot, and immediately runs into something honest: at 50 Ω, a 1 V wave carries only 20 mA. Voltage and current genuinely differ by a factor of Z₀. Plot them on one axis truthfully and the current is an invisible ripple on the baseline.

The fix is the one an oscilloscope uses: separate gain per channel, separate axis per channel. Voltage reads on the left axis in volts. Current reads on the right axis in real milliamps, and is drawn ×10 so it’s visible. The magnification changes the size and never the number — the right axis always reports true current.

The relationship survives intact: at the load, V = Z_L · I. Set Z_L = 150 Ω and read it off — V = 1.5 V, I = 10 mA, V/I = 150 Ω. Drop Z₀ to 25 Ω and the current visibly doubles. That ratio is the impedance, drawn.

The standing wave

Switch to Wave with a mismatched load and the envelope appears: maxima and minima locked in place, spaced λ/2 apart. The ratio of the extremes is the VSWR:

VSWR = |V|max / |V|min = (1 + |Γ|) / (1 − |Γ|)

1 means matched; ∞ means total reflection. This is the number your SWR meter reads, and now you can see where it comes from.

Then flip to V + I in this mode for the picture worth the price of admission: the voltage and current envelopes sit λ/4 apart. Every voltage node is a current antinode. The line has nulls of voltage at points where the current is maximal — which is exactly why “measuring the voltage” on a mismatched line is a meaningless act until you say where.

The Smith chart

The Smith chart panel is the reflection-coefficient plane with impedance drawn on it as circles. It is not a separate topic; it’s the same Γ you’ve been dragging, plotted as a complex number.

Two things it makes obvious:

You can click the chart to set the load directly.

The quarter-wave transformer

Toggle it on and a λ/4 section of

Z_t = √(Z₀ · Z_L)

is inserted before the load. It transforms Z_L into Z_t²/Z_L = Z₀, so the source sees a perfect match through a mismatched load. The reported VSWR drops to 1 and the reflection reads ~0.

The mismatch hasn’t disappeared — there’s still a standing wave inside the transformer section. It has been hidden from the source. That distinction matters: it’s an impedance match, not a cure.

What lives past the load

The last third of the plot is the load medium, and it deserves a caveat, because it’s the one place the tool models rather than computes.

A lumped load has no spatial extent — you cannot draw a “transmitted wave” into a resistor. So the region past the boundary is drawn as an equivalent semi-infinite line whose characteristic impedance equals Z_L. It presents the same Z_L, so everything on the line side — Γ, VSWR, delivered power — is exact and untouched.

For a real Z_L this is a familiar picture: a different cable, lossless, carrying power away forever. Flat envelope.

For a complex Z_L, something surprising falls out. A line whose characteristic impedance is complex cannot be lossless. Passivity requires that both the per-length series impedance γZ₂ and shunt admittance γ/Z₂ have non-negative real parts, and that forces

α ≥ β · |X| / R      →      54.6 · |X|/R  dB per wavelength

Take the equality (the least-lossy passive medium) and the wave visibly fades. That coefficient is brutal: even X/R = 0.02 costs ~1.1 dB per wavelength. The loss depends only on the ratio X/R — not on frequency, not on length.

The honest caveat: that fade belongs to the equivalent line, not to your lumped R + jX, which simply dissipates in R. It means “if you replaced this load with an equivalent cable, that cable would have to be slightly lossy.” The toggle turns the region off if it distracts.

The power factor hiding in the power trace

Put a complex load on and switch to Power, and the envelope is conspicuously lopsided — the upper bound towers over the lower one. This looks like a bug. It isn’t.

Voltage and current swing symmetrically about zero. Power does not. Instantaneous power swings about its mean with amplitude ½|V||I|, and the mean is P_avg = ½|V||I|·cos φ. So the bounds are:

½|V||I| · (cos φ ± 1),    φ = arg(Z)

For Z_L = 50 + j50, φ = 45°: the bounds are +0.966 and −0.166. The top is 5.8× the bottom. Both then decay at the same rate — but starting 5.8× apart, so the fade looks lopsided.

And the payoff:

cos φ = (hi + lo) / (hi − lo)

The asymmetry is the power factor. A purely resistive load gives lo = 0 — power never flows backward. A purely reactive load gives symmetric bounds about zero — pure sloshing, nothing delivered, ever. Everything real sits between. The dashed green line is that mean: flat along the lossless line (net power is the same at every point), then decaying through the absorbing medium as the energy is eaten.

Why a complex load forces Wave mode

Set a reactance and the tool jumps to Wave. This is deliberate, and the reason is more interesting than it looks.

Reactance is a single-frequency quantity: X = ωL, or −1/(ωC). “+j50 Ω” only means something at one ω. A pulse is broadband, so every spectral component sees a different X. There is no single number to put on the slider.

Worse, the reflection stops being a scaling. With Z_L(ω) complex, Γ(ω) is frequency-dependent, and the reflected pulse becomes the inverse transform of Γ(ω)·G(ω) — a distorted, smeared waveform, not a scaled copy. An inductive load reflects something closer to a differentiated pulse with a decaying tail. The shape changes, not just the height.

That breaks the engine’s core assumption. The pulse view is closed-form superposition of scaled, delayed copies:

V(z,t) = Σₙ (Γ_L Γ_s)ⁿ [ g(t − 2nT − z/v_p) + Γ_L · g(t − 2nT − (2L−z)/v_p) ]

which is only valid when Γ_L is a real, frequency-independent scalar. Complex loads in the time domain need convolution, not a multiply. Rather than produce plausible-looking wrong physics, the reactance is forced to zero in Pulse mode.

So: the pulse view is where Γ is a number. The wave view is where Γ is a phasor. Asking for a phasor sends you to the phasor tab.

Small things that matter

Try this first

  1. Pulse, Open. Watch τ = 2 at the load end. Then switch to Power and see zero delivered. Sit with that contradiction until it isn’t one.
  2. Pulse, Short. Same thing, inverted. Compare Voltage and Current.
  3. Bounces preset. Z_s ≠ Z₀ and watch the pulse ring down, each round trip scaled by Γ_L·Γ_s.
  4. Wave, drag the load slider from left to right and watch the envelope collapse to flat at dead centre, then re-open.
  5. λ/4 transformer on a 150 Ω load. VSWR drops to 1. Then look at the standing wave still living inside the transformer section.

The tool is a single self-contained React component — no backend, no dependencies beyond React. Everything you see is computed in your browser from the equations above.