Monocurl Essays
Series Download

Waves and interference: how two ripples can cancel

What a wave is, why its speed is frequency times wavelength, and how adding waves gives the quiet lines of an interference pattern and the notes of a string.

21 min·High school·

AssumesSimple harmonic motion: springs and pendulumsSine waves: amplitude, frequency and phase

Two dippers 6 cm apart tap the surface of a ripple tank in step, making ripples 2 cm long. Blue is raised water and orange is lowered. Along the white lines the water stays level although ripples from both dippers pass through. Slowed 15 times.
Monocurl source
let A1 = [-HALF * SC, -1.65, 0]
let A2 = [HALF * SC, -1.65, 0]
let Tank = |ph| [
    ColorGrid(
        |p, idx| wavecol((sin(TAU * norm(p - A1) / (SC * LAM) - ph) + sin(TAU * norm(p - A2) / (SC * LAM) - ph)) / 2),
        [-4.0, 4.0, 160], [-2.26, 2.26, 90], 1
    ),
    Pt(A1, INK, 0.07),
    Pt(A2, INK, 0.07)
]
mesh tank = Tank(ph: 0)

slide "ripples"
    tank.ph = 4 * TAU
    play Lerp(6, [&tank], linear)
    play Wait(0.8)

Uses the shared definitions for this lesson's figures.

Tap the surface of a pond with a stick, steadily, and rings of ripples spread out. Now tap with a second stick a hand’s width away, in step with the first. Each stick alone would set every point of the surface bobbing. With both going, there are lines running outward from between the sticks along which the water hardly moves at all.

That is strange if you think of a ripple as stuff. Two heaps of sand make a bigger heap. But here a disturbance added to a disturbance gives, in places, no disturbance, and in other places twice as much. The same thing happens with sound from two loudspeakers and with light through two slits. To understand it we need to say what a wave is and how two of them combine.

The pattern moves and the medium stays

Start with one dimension: a long rope under tension, lying along the $x$ axis. Flick one end and a hump travels down the rope. Describe the rope at any moment by the sideways displacement $y$ of each point from its resting position.

A pulse traveling along a rope at 4 m/s, at half speed, with the rope drawn as beads. The gray curve is where the pulse started. The pulse moves 5.6 m to the right, while the orange bead only moves up and back down.
Monocurl source
let fp = Frame(0, 8, -10, 30, [0.1, 0.5, 0], 6.4, 2.3)
let shape = |u| 20 * exp(-(u / 0.45) * (u / 0.45))
let START = 1.2
mesh plot = Panel(fp, [1, 2, 3, 4, 5, 6, 7, 8], [-10, 10, 20, 30], [0, 1, 2, 3, 4, 5, 6, 7, 8], [-10, 0, 10, 20, 30], "position along the rope (m)", "sideways displacement (cm)")
mesh ghost = stroke{MIST, 3} Polyline(map(sample(0, 8, 120), |x| at(fp, x, shape(x - START))))
mesh names = [
    center{[-2.3, -1.9, 0]} Note("time (s)", 0.74),
    center{[1.1, -1.9, 0]} Note("crest is at (m)", 0.74)
]
let Rope = |t| block {
    . Dash(at(fp, 5, 0), at(fp, 5, 22), EMBER, 2)
    for (i in range(0, 41)) {
        if (i != 25) {
            . Pt(at(fp, 0.2 * i, shape(0.2 * i - START - V * t)), AZURE, 0.055)
        }
    }
    . Pt(at(fp, 5, shape(5 - START - V * t)), EMBER, 0.1)
    . center{[-1.4, -1.9, 0]} scale{1.15} color{INK} Number(t, 2)
    . center{[2.4, -1.9, 0]} scale{1.15} color{INK} Number(START + V * t, 1)
}
mesh rope = Rope(t: 0)

slide "pulse"
    play Wait(0.6)
    rope.t = 1.4
    play Lerp(2.8, [&rope], linear)
    play Wait(1.4)

Uses the shared definitions for this lesson's figures.

Two things are moving in that animation, and they are different things. The hump travels along the rope at 4 m/s. Each bead of the rope moves only sideways, rising as the hump arrives and settling back where it started. Nothing material travels from one end to the other. What travels is a shape, and with it energy.

The shape gives us a formula. Suppose at $t = 0$ the rope’s displacement at position $x$ is $y = f(x)$, some hump-shaped function. After a time $t$, the same hump sits a distance $vt$ farther along, where $v$ is the wave speed. The displacement at $x$ now is what it was, at time zero, at the point $vt$ to the left:

$$ y(x, t) = f(x - vt). $$

Any function of the combination $x - vt$ describes a shape moving in the $+x$ direction at speed $v$ without changing form.

Pause and try

What describes the same hump moving in the $-x$ direction at speed $v$? Check your answer by asking where the crest is at $t = 1$ s, if the crest of $f$ is at $x = 0$ and $v = 4$ m/s.

Show answerHide answer

$y = f(x + vt)$. The crest is where the argument of $f$ is zero: $x + 4(1) = 0$, so $x = -4$ m. It has moved 4 m in the negative direction, as required. With $x - vt$ the crest would be at $x = +4$ m.

Sine waves: wavelength, frequency and speed

Now shake the end of the rope up and down steadily, in simple harmonic motion. Each shake sends a hump or a dip down the rope, and the rope takes the form of a traveling sine wave.

Four quantities describe it. The amplitude $A$ is the largest displacement. The wavelength $\lambda$ is the distance from one crest to the next, in meters. The period $T$ is the time for one bead to complete one cycle, and the frequency $f = 1/T$ is the number of cycles per second, in hertz. All beads share the period of the hand that drives them.

A sine wave of wavelength 2 m and period 0.5 s on the rope, slowed six times. Each time the orange bead completes one cycle, the green crest advances by exactly one wavelength.
Monocurl source
let fw = Frame(0, 8, -15, 20, [0.1, 0.5, 0], 6.4, 2.4)
let LAMR = 2
let PER = 0.5
let wave = |x, t| 10 * sin(TAU * (x / LAMR - t / PER))
mesh plot = Panel(fw, [1, 2, 3, 4, 5, 6, 7, 8], [-10, 10], [0, 1, 2, 3, 4, 5, 6, 7, 8], [-10, 0, 10], "position along the rope (m)", "sideways displacement (cm)")
mesh names = [
    center{[-2.55, -1.9, 0]} Cap("cycles of the bead", 0.74, EMBER),
    center{[1.05, -1.9, 0]} Cap("wavelengths the crest moved", 0.74, LEAF)
]
let Run = |t| {
    let xc = LAMR / 4 + V * t
    return [
        Dash(at(fw, 1, -10), at(fw, 1, 10), EMBER, 2),
        stroke{AZURE, 4} Polyline(map(sample(0, 8, 160), |x| at(fw, x, wave(x, t)))),
        Pt(at(fw, 1, wave(1, t)), EMBER, 0.1),
        Tip(at(fw, xc + 0.1, 12.5), at(fw, xc + LAMR, 12.5), LEAF, 3, 0.15),
        Tip(at(fw, xc + LAMR - 0.1, 12.5), at(fw, xc, 12.5), LEAF, 3, 0.15),
        Pt(at(fw, xc, 10), LEAF, 0.1),
        center{at(fw, xc + LAMR / 2, 16.5)} Math("\lambda = 2\text{ m}", 0.78, LEAF),
        center{[-1.05, -1.9, 0]} scale{1.15} color{EMBER} Number(t / PER, 2),
        center{[3.1, -1.9, 0]} scale{1.15} color{LEAF} Number(V * t / LAMR, 2)
    ]
}
mesh run = Run(t: 0)

slide "sine"
    play Wait(0.6)
    run.t = 2 * PER
    play Lerp(12 * PER, [&run], linear)
    play Wait(1.4)

Uses the shared definitions for this lesson's figures.

The two readouts in the animation stay equal, and that equality is the relation between the three quantities. During one period the hand makes one complete shake, which lays down one complete wavelength of new wave behind the old, so the old wave has been pushed along by exactly $\lambda$. The wave covers a distance $\lambda$ in a time $T$, which fixes its speed.

It is tidier to absorb the factors of $2\pi$. Define the wave number $k = 2\pi/\lambda$, in radians per meter, and the angular frequency $\omega = 2\pi/T = 2\pi f$, in radians per second. Then the traveling sine wave is

$$ y(x, t) = A\sin(kx - \omega t), \qquad v = \frac{\omega}{k}. $$

For the rope in the animation, $\lambda = 2$ m and $T = 0.5$ s, so $f = 2$ Hz and $v = 2 \times 2 = 4$ m/s. Units: $\text{Hz} \times \text{m} = \text{m/s}$.

Be careful about cause and effect here. The speed of a wave is set by the medium: for a rope, by its tension and its mass per meter; for sound in air at $20\,°$C, 343 m/s. The frequency is set by the source. The wavelength is then forced to be $\lambda = v/f$. Shaking the rope faster shortens the wavelength and leaves the speed as it was.

Adding waves

What happens when two waves are in the same place at the same time? Send a pulse from each end of the rope and watch them meet.

Pause and try

Two identical humps travel toward each other on a rope. Sketch what you expect at the instant their centers coincide. Then do the same for a hump meeting an equal dip. In the second case, what do you expect a moment later?

Show answerHide answer

The two humps make a single hump twice as tall. The hump and the dip cancel, and for an instant the rope is straight. A moment later both pulses have reappeared and continue as if nothing had happened.

Two pulses on a rope passing through each other, at one third speed. The thin curves are the pulses on their own and the thick curve is the rope. Top: two humps add to a double hump. Bottom: a hump and a dip cancel for an instant, then both emerge unchanged.
Monocurl source
let ft = Frame(0, 8, -25, 45, [0.1, 1.0, 0], 6.4, 1.35)
let fb = Frame(0, 8, -25, 45, [0.1, -0.95, 0], 6.4, 1.35)
let shape = |u| 20 * exp(-(u / 0.45) * (u / 0.45))
mesh plots = [
    Panel(ft, [1, 2, 3, 4, 5, 6, 7, 8], [-20, 20, 40], [], [-20, 0, 20, 40], "", "two humps: displacement (cm)"),
    Panel(fb, [1, 2, 3, 4, 5, 6, 7, 8], [-20, 20, 40], [0, 1, 2, 3, 4, 5, 6, 7, 8], [-20, 0, 20, 40], "", "hump and dip: displacement (cm), against position (m)")
]
let Lane = |f, t, s| {
    let a = |x| shape(x - 1.5 - V * t)
    let b = |x| s * shape(x - 6.5 + V * t)
    return [
        stroke{AZURE, 2} Polyline(map(sample(0, 8, 120), |x| at(f, x, a(x)))),
        stroke{EMBER, 2} Polyline(map(sample(0, 8, 120), |x| at(f, x, b(x)))),
        stroke{INK, 4.5} Polyline(map(sample(0, 8, 160), |x| at(f, x, a(x) + b(x))))
    ]
}
let Meet = |t| [Lane(ft, t, 1), Lane(fb, t, -1)]
mesh meet = Meet(t: 0)

slide "meet"
    play Wait(0.6)
    meet.t = 1.25
    play Lerp(3.75, [&meet], linear)
    play Wait(1.2)

Uses the shared definitions for this lesson's figures.

This is an experimental fact about media, with a domain of validity: it holds when displacements are small enough that the medium responds in proportion, which covers ripples, ordinary sound and light. It fails for a breaking ocean wave or a shock wave. Where it holds, waves pass through one another unchanged, which is why you can pick out one voice in a room full of sound.

The hump meeting the dip should bother you. At the instant of cancellation the rope is straight, and the energy of both pulses seems to have vanished. It has not, and to find it we have to look at the beads’ velocities as well as their positions. Ahead of a hump’s crest the beads are rising, and behind it they are falling. For the two opposite pulses, these velocities add where the displacements cancel. At the instant the rope is straight, it is moving fastest: all the energy is kinetic.

Two sources: where the ripples cancel

Return to the pond, in the controlled form of a ripple tank. Two dippers, $S_1$ and $S_2$, are 6 cm apart and tap the water in step, each sending out circular ripples of wavelength $\lambda = 2$ cm. Pick a point $P$ on the surface, at distance $r_1$ from $S_1$ and $r_2$ from $S_2$.

The ripple from each dipper is a traveling sine wave in the distance from that dipper. At $P$ the two displacements are $A\sin(kr_1 - \omega t)$ and $A\sin(kr_2 - \omega t)$. We are making two modeling assumptions here: the dippers are exactly in step, and the two ripples have the same amplitude $A$ at $P$. (Real ripples weaken as they spread, so the second is only approximately true, best far from the dippers.)

Consider three positions for $P$ before doing any algebra.

  1. P is the same distance from both dippers. The two ripples arrive in step, crest with crest, and the water moves with twice the amplitude.
  2. Move P so that it is 1 cm, half a wavelength, farther from one dipper. Each crest now arrives with a trough from the other, and the water stays still.
  3. Move P until the difference is 2 cm, one whole wavelength. One ripple is a full cycle behind, which puts crest on crest again.
Ripples from two dippers arriving at a point P. Left: the distances from each dipper, with arcs marking whole wavelengths. Right: the displacement at P due to each ripple (thin) and their sum (thick), against time.
Monocurl source
let O = [-1.95, -1.5, 0]
let S = |x, y| [O[0] + SC * x, O[1] + SC * y, 0]
let S1 = S(-HALF, 0)
let S2 = S(HALF, 0)
let fg = Frame(0, 0.2, -2.4, 2.4, [2.2, 0.8, 0], 2.6, 1.7)
let Ring2 = |c, n, col| stroke{col, 1.5} Polyline(filter(
    map(sample(0, PI, 80), |a| [c[0] + SC * LAM * n * cos(a), c[1] + SC * LAM * n * sin(a), 0]),
    |p| p[0] > -3.9 and p[0] < 0.2
))
mesh rings = block {
    for (n in range(1, 6)) {
        . Ring2(S1, n, tint(AZURE, 0.45))
        . Ring2(S2, n, tint(EMBER, 0.45))
    }
}
mesh plot = Panel(fg, [0.05, 0.1, 0.15, 0.2], [-2, -1, 1, 2], [0, 0.1, 0.2], [-2, -1, 0, 1, 2], "time (s)", "displacement at P, in units of A")
mesh dippers = [
    Pt(S1, AZURE, 0.09), Pt(S2, EMBER, 0.09),
    center{S1 + [0, -0.3, 0]} Math("S_1", 0.8, AZURE),
    center{S2 + [0, -0.3, 0]} Math("S_2", 0.8, EMBER)
]
let At = |d| {
    let px = hyp(d, 8)
    let p = S(px, 8)
    let r1 = sqrt((px + HALF) * (px + HALF) + 64)
    let r2 = sqrt((px - HALF) * (px - HALF) + 64)
    let y1 = |t| sin(TAU * (r1 / LAM - t / 0.1))
    let y2 = |t| sin(TAU * (r2 / LAM - t / 0.1))
    return [
        Seg(S1, p, AZURE, 3), Seg(S2, p, EMBER, 3), Pt(p, INK, 0.09),
        Plate(p + [0, 0.33, 0], [0.34, 0.32]),
        center{p + [0, 0.33, 0]} Math("P", 0.8),
        Graph(fg, y1, 0, 0.2, AZURE, 2.5, 80),
        Graph(fg, y2, 0, 0.2, EMBER, 2.5, 80),
        Graph(fg, |t| y1(t) + y2(t), 0, 0.2, INK, 4.5, 80),
        center{[1.3, -1.2, 0]} Math(str_join(["r_1 = ", to_string(r1, 2), "\text{ cm}"]), 0.8, AZURE),
        center{[3.0, -1.2, 0]} Math(str_join(["r_2 = ", to_string(r2, 2), "\text{ cm}"]), 0.8, EMBER),
        center{[2.15, -1.75, 0]} Math(str_join(["r_1 - r_2 = ", to_string((r1 - r2) / LAM, 2), "\,\lambda"]), 0.88)
    ]
}
mesh pt = []

slide "P is the same distance from both dippers. The two ripples arrive in step, crest with crest, and the water moves with twice the amplitude."
    pt = At(0)
    play Fade(0.8)

slide "Move P so that it is 1 cm, half a wavelength, farther from one dipper. Each crest now arrives with a trough from the other, and the water stays still."
    pt = []
    play Fade(0.3, [&pt])
    pt = At(1)
    play Fade(0.6, [&pt])

slide "Move P until the difference is 2 cm, one whole wavelength. One ripple is a full cycle behind, which puts crest on crest again."
    pt = []
    play Fade(0.3, [&pt])
    pt = At(2)
    play Fade(0.6, [&pt])

Uses the shared definitions for this lesson's figures.

The outcome depends only on the difference of the two distances, the path difference $r_1 - r_2$, and on its size compared with a wavelength. To get the rule for every point at once, add the two sine functions. The tool is the identity

$$ \sin a + \sin b = 2\,\sin\!\frac{a + b}{2}\,\cos\!\frac{a - b}{2}, $$

which follows from the angle-sum formulas: write $a = p + q$ and $b = p - q$; then $\sin(p + q) + \sin(p - q) = 2\sin p\cos q$ because the $\cos p \sin q$ terms cancel.

The points with a given path difference form a curve (a hyperbola with the two sources as its foci), so the calm points line up along curves fanning out from between the dippers. Those are the white lines in the opening animation.

The amplitude of the water's motion around the two dippers: dark where it is large, white where the surface stays still. Each line that reaches the top edge is labeled with its path difference in wavelengths: whole numbers are lines of reinforcement and half numbers are lines of cancellation. The two outermost white lines, which leave through the sides, have path difference 2.5 wavelengths.
The amplitude of the water’s motion around the two dippers: dark where it is large, white where the surface stays still. Each line that reaches the top edge is labeled with its path difference in wavelengths: whole numbers are lines of reinforcement and half numbers are lines of cancellation. The two outermost white lines, which leave through the sides, have path difference 2.5 wavelengths.
Monocurl source
let BOT = -1.65
let TOP = 1.4
let A1 = [-HALF * SC, BOT, 0]
let A2 = [HALF * SC, BOT, 0]
let amp = |p| abs(cos(PI * (norm(p - A1) - norm(p - A2)) / (SC * LAM)))
mesh field = [
    ColorGrid(|p, idx| tint(AZURE, 0.85 * amp(p) * amp(p)), [-3.7, 3.7, 220], [-2.1, TOP, 100], 1),
    Outline([[-3.7, -2.1, 0], [3.7, -2.1, 0], [3.7, TOP, 0], [-3.7, TOP, 0]], SLATE, 2),
    Pt(A1, INK, 0.08), Pt(A2, INK, 0.08)
]
mesh labels = block {
    . center{[0, 2.05, 0]} Note("path difference, in wavelengths", 0.74)
    for (j in range(-4, 5)) {
        let x = SC * hyp(j * LAM / 2, (TOP - BOT) / SC)
        var col = LEAF
        if (mod(j, 2) != 0) { col = ROSE }
        . Seg([x, TOP, 0], [x, TOP + 0.1, 0], col, 3)
        . center{[x, TOP + 0.32, 0]} Math(to_string(abs(j) / 2, mod(abs(j), 2)), 0.76, col)
    }
}

Uses the shared definitions for this lesson's figures.

Standing waves on a string

One more arrangement of two waves explains how a stringed instrument gets its notes. A string of length $L$ is tied down at both ends, $x = 0$ and $x = L$. A wave sent along it reflects at the far end and comes back, so the string carries two waves of the same frequency and amplitude traveling in opposite directions, and by superposition its shape is their sum.

Take the wave moving left to be $A\sin(kx + \omega t)$. The end at $x = 0$ cannot move, so the reflected wave moving right must cancel it there at all times. The wave $A\sin(kx - \omega t)$ does this, since at $x = 0$ the sum is $A\sin(\omega t) + A\sin(-\omega t) = 0$. Add the two with the same identity, taking $a = kx + \omega t$ and $b = kx - \omega t$:

$$ y(x, t) = 2A\,\sin(kx)\,\cos(\omega t). $$

The $x$ and the $t$ have separated. This is no longer a function of $x - vt$, and nothing travels. Every point of the string oscillates in place with the same frequency, and with an amplitude $2A|\sin kx|$ that depends on where it is. Points where $\sin kx = 0$ never move; they are called nodes, and they sit half a wavelength apart. Halfway between them are the antinodes, where the motion is largest. The pattern is a standing wave.

Two waves of wavelength 2 m traveling in opposite directions along a 3 m rope (thin curves), and their sum (thick), with displacement in units of one wave’s amplitude. The sum does not travel: it swells and shrinks in place, and the green points never move. Slowed six times.
Monocurl source
let fs = Frame(0, 3, -2.4, 2.4, [0.1, 0.25, 0], 6.2, 2.7)
let KR = PI
let WR = 4 * PI
mesh plot = Panel(fs, [0.5, 1, 1.5, 2, 2.5, 3], [-2, -1, 1, 2], [0, 0.5, 1, 1.5, 2, 2.5, 3], [-2, -1, 0, 1, 2], "position (m)", "")
mesh legend = [
    center{[-2.2, 1.95, 0]} Cap("moving right", 0.74, AZURE),
    center{[0.1, 1.95, 0]} Cap("moving left", 0.74, EMBER),
    center{[2.2, 1.95, 0]} Cap("their sum", 0.74, INK)
]
let Stand = |t| [
    stroke{AZURE, 2} Polyline(map(sample(0, 3, 120), |x| at(fs, x, sin(KR * x - WR * t)))),
    stroke{EMBER, 2} Polyline(map(sample(0, 3, 120), |x| at(fs, x, sin(KR * x + WR * t)))),
    stroke{INK, 4.5} Polyline(map(sample(0, 3, 120), |x| at(fs, x, 2 * sin(KR * x) * cos(WR * t)))),
    map([0, 1, 2, 3], |x| Pt(at(fs, x, 0), LEAF, 0.1))
]
mesh stand = Stand(t: 0)

slide "stand"
    play Wait(0.5)
    stand.t = 1
    play Lerp(6, [&stand], linear)
    play Wait(1)

Uses the shared definitions for this lesson's figures.

So far only the end at $x = 0$ has been respected. The other end is tied down too, and that is a real restriction.

Pause and try

The string must also be at rest at $x = L$ at all times. What does that require of $\sin(kL)$, and so of the wavelength? List the three longest wavelengths that fit on a string of length $L$.

Show answerHide answer

We need $2A\sin(kL)\cos(\omega t) = 0$ for all $t$, so $\sin(kL) = 0$, which means $kL = n\pi$ for a positive whole number $n$. With $k = 2\pi/\lambda$ this is $\lambda = 2L/n$. The three longest are $2L$, $L$ and $2L/3$: the string holds one, two or three half-wavelengths.

A string cannot vibrate in this way at just any frequency. The allowed ones are whole-number multiples of the lowest, $f_1 = v/2L$, called the fundamental; the pattern with frequency $f_n = nf_1$ is the $n$th harmonic. The condition is easy to remember from the picture: a whole number of half-wavelengths must fit between the ends.

  1. The fundamental: half a wavelength fits on the string, so the wavelength is 130 cm and the frequency is 143/1.30 = 110 Hz.
  2. Second harmonic: two half-wavelengths, with a node in the middle. The wavelength is 65 cm and the frequency 220 Hz.
  3. Third harmonic: three half-wavelengths. The wavelength is 43.3 cm and the frequency 330 Hz.
  4. Fourth harmonic: four half-wavelengths and 440 Hz. A plucked string vibrates in a mixture of all of these at once.
The first four standing waves of a 65 cm guitar string on which waves travel at 143 m/s, slowed 165 times. Each has one more half-wavelength than the last, and its frequency is the next multiple of 110 Hz.
Monocurl source
let LEN = 65
let SPEED = 143
let fh = Frame(0, LEN, -1.4, 1.4, [-0.75, 0.15, 0], 5.0, 2.7)
mesh plot = [
    Panel(fh, [10, 20, 30, 40, 50, 60], [], [0, 10, 20, 30, 40, 50, 60], [], "position along the string (cm)", ""),
    Seg(at(fh, 0, -0.25), at(fh, 0, 0.25), SLATE, 6),
    Seg(at(fh, LEN, -0.25), at(fh, LEN, 0.25), SLATE, 6)
]
mesh names = [
    center{[2.95, 1.55, 0]} Note("harmonic", 0.74),
    center{[2.95, 0.3, 0]} Note("wavelength (cm)", 0.74),
    center{[2.95, -0.95, 0]} Note("frequency (Hz)", 0.74)
]
let Mode = |n, ph| {
    let env = |x| sin(n * PI * x / LEN)
    var nodes = []
    for (j in range(0, n + 1)) {
        nodes .= Pt(at(fh, j * LEN / n, 0), LEAF, 0.09)
    }
    return [
        stroke{MIST, 2.5} Polyline(map(sample(0, LEN, 120), |x| at(fh, x, env(x)))),
        stroke{MIST, 2.5} Polyline(map(sample(0, LEN, 120), |x| at(fh, x, -env(x)))),
        stroke{INK, 4.5} Polyline(map(sample(0, LEN, 120), |x| at(fh, x, env(x) * cos(ph)))),
        nodes
    ]
}
let Facts = |n| [
    center{[2.95, 1.05, 0]} Math(to_string(n), 0.95),
    center{[2.95, -0.2, 0]} Math(to_string(2 * LEN / n, 1), 0.95, AZURE),
    center{[2.95, -1.45, 0]} Math(to_string(n * SPEED / (2 * LEN / 100), 0), 0.95, EMBER)
]
mesh mode = []
mesh facts = []

slide "The fundamental: half a wavelength fits on the string, so the wavelength is 130 cm and the frequency is 143/1.30 = 110 Hz."
    mode = Mode(1, ph: 0)
    facts = Facts(1)
    play Fade(0.6)
    mode.ph = 2 * TAU
    play Lerp(3, [&mode], linear)

slide "Second harmonic: two half-wavelengths, with a node in the middle. The wavelength is 65 cm and the frequency 220 Hz."
    mode = []
    facts = []
    play Fade(0.3)
    mode = Mode(2, ph: 0)
    facts = Facts(2)
    play Fade(0.5)
    mode.ph = 4 * TAU
    play Lerp(3, [&mode], linear)

slide "Third harmonic: three half-wavelengths. The wavelength is 43.3 cm and the frequency 330 Hz."
    mode = []
    facts = []
    play Fade(0.3)
    mode = Mode(3, ph: 0)
    facts = Facts(3)
    play Fade(0.5)
    mode.ph = 6 * TAU
    play Lerp(3, [&mode], linear)

slide "Fourth harmonic: four half-wavelengths and 440 Hz. A plucked string vibrates in a mixture of all of these at once."
    mode = []
    facts = []
    play Fade(0.3)
    mode = Mode(4, ph: 0)
    facts = Facts(4)
    play Fade(0.5)
    mode.ph = 8 * TAU
    play Lerp(3, [&mode], linear)

Uses the shared definitions for this lesson's figures.

Worked examples

Limits and common mistakes

The interference theorem assumed sources that stay exactly in step. Two separate musicians, or two light bulbs, drift in and out of step far too quickly for a steady pattern to form; such sources are called incoherent, and their loudness or brightness simply adds. Steady interference needs sources driven by the same oscillator, or one wave split in two.

Interference does not destroy energy. Along a line of cancellation there is none, and along the lines of reinforcement the amplitude is doubled, which is four times the energy of one wave. Averaged over the pattern the energy is what the two sources supply, moved from the calm places to the lively ones.

Check yourself

Two loudspeakers in step emit sound of wavelength 0.80 m. At a point 3.0 m from one speaker and 4.2 m from the other, what does a listener hear?

The next lesson leaves oscillations for motion in a circle, and uses it to explain why the Moon stays up.

Problems

Take the speed of sound in air as 343 m/s.

Problem 1

Ocean waves pass a buoy. The crests are 3.0 m apart, and the buoy rises to a crest once every 2.0 s. Find the frequency and the speed of the waves. Does the buoy travel with them?

Show solutionHide solution

$\lambda = 3.0$ m and $T = 2.0$ s, so $f = 1/T = 0.50$ Hz and $v = f\lambda = 0.50 \times 3.0 = 1.5$ m/s. The buoy does not travel: it is part of the medium’s surface, and bobs about a fixed position as the pattern passes.

Problem 2

A wave is described by $y = 0.02\sin(5x + 40t)$ in SI units. Find its direction of travel, wavelength, frequency and speed.

Show solutionHide solution

The combination is $kx + \omega t$, so it moves in the $-x$ direction. $k = 5$ rad/m gives $\lambda = 2\pi/5 = 1.26$ m. $\omega = 40$ rad/s gives $f = 40/2\pi = 6.37$ Hz. $v = \omega/k = 40/5 = 8$ m/s; check: $6.37 \times 1.26 = 8.0$ m/s.

Problem 3

Human hearing covers roughly 20 Hz to 20 000 Hz. Find the wavelengths in air at the two ends of that range. Then find the wavelength of an FM radio wave of frequency 100 MHz, which travels at $3.00 \times 10^8$ m/s.

Show solutionHide solution

$\lambda = v/f$. At 20 Hz: $343/20 = 17$ m. At 20 000 Hz: $343/20\,000 = 0.017$ m, or 1.7 cm. Radio: $3.00 \times 10^8 / 1.00 \times 10^8 = 3.0$ m. The frequencies differ by a factor of a thousand across hearing, so the wavelengths do too, from the size of a house to the width of a finger.

Problem 4

In the lesson’s ripple tank (dippers 6 cm apart, in step, $\lambda = 2$ cm): (a) Is the point 9 cm from one dipper and 12 cm from the other on a line of reinforcement or cancellation? (b) The path difference at any point is at most the distance between the dippers. Use this to count the lines of cancellation in the whole pattern.

Show solutionHide solution

(a) The path difference is $3$ cm $= 1.5\lambda$, a whole number plus a half: cancellation. (b) By the triangle inequality $|r_1 - r_2| \le 6$ cm, with equality only on the line through the dippers, outside them. Cancellation needs $|r_1 - r_2| = 1, 3, 5, \dots$ cm. The values not exceeding 6 are 1, 3 and 5 cm, each occurring on both sides of the center line: 6 lines of cancellation. (Reinforcement: differences 0, $\pm2$ and $\pm4$ cm give 5 curves, plus the two rays along the line of the dippers where the difference is exactly $\pm6$ cm.) The figures show the six white lines.

Problem 5

Two loudspeakers 3.0 m apart are driven in step by the same signal. A listener stands directly in front of one speaker, 4.0 m from it. Which frequencies between 100 Hz and 1000 Hz are canceled at the listener’s position, and which are reinforced?

Show solutionHide solution

The other speaker is $\sqrt{3.0^2 + 4.0^2} = 5.0$ m away, so the path difference is 1.0 m. Canceled: $1.0 = (n + \tfrac12)\lambda$, so $\lambda = 1/(n + \tfrac12)$ m and $f = 343(n + \tfrac12)$ Hz: 171.5, 514.5 and 857.5 Hz in the range. Reinforced: $1.0 = n\lambda$, so $f = 343n$: 343 and 686 Hz. A single listening position favors some frequencies and suppresses others, which is one reason speaker placement matters.

Problem 6

At the instant two equal and opposite pulses on a rope overlap completely, the rope is straight. A student concludes that the energy of the pulses has been destroyed, and that the pulses cannot reappear. Explain what is wrong, and say what a photograph of the rope at that instant would fail to show.

Show solutionHide solution

The energy of a wave on a rope has two parts: potential energy from the rope’s displacement and stretch, and kinetic energy from the sideways motion of its parts. Superposition applies to velocities as well as displacements. For a hump and a dip approaching each other, the displacements at the overlap are opposite and cancel, and the sideways velocities there have the same sign and add. When the rope is straight its potential energy is zero and its parts are moving fastest, so all the energy is kinetic. That motion carries the rope past the straight position, and the two pulses re-form. A photograph records positions and not velocities, so it would show a rope that looks at rest when it is not.

Problem 7

A string 0.80 m long is fixed at both ends, and waves travel on it at 240 m/s. (a) Find the frequencies of its first three harmonics. (b) Touching the string lightly at a point forces a node there without stopping the rest of the string. Where could you touch it to silence the fundamental and the second harmonic while leaving the third?

Show solutionHide solution

(a) $f_n = nv/2L = n \times 240/1.60 = 150n$ Hz: 150, 300 and 450 Hz. (b) The third harmonic has $\lambda_3 = 2L/3 = 0.533$ m and nodes every $\lambda_3/2 = 0.267$ m: at 0, 0.267, 0.533 and 0.80 m. Touch the string at 0.267 m or 0.533 m from an end, one third of the way along. The fundamental has no node between the ends, and the second harmonic’s only interior node is at 0.40 m, so both need the string to move at the touched point and are damped.

Problem 8

A string of length $L$ is fixed at $x = 0$, and its other end at $x = L$ is attached to a light ring that slides freely on a rod, so that end is an antinode of any standing wave. (a) Starting from $y = 2A\sin(kx)\cos(\omega t)$, find the allowed wavelengths and frequencies. (b) Compare the lowest frequency with that of the same string fixed at both ends, and say which multiples of the lowest are present.

Show solutionHide solution

(a) The form already has a node at $x = 0$. An antinode at $x = L$ means $|\sin(kL)| = 1$, so $kL = \tfrac{\pi}{2}, \tfrac{3\pi}{2}, \tfrac{5\pi}{2}, \dots = (2n - 1)\tfrac{\pi}{2}$ for $n = 1, 2, 3, \dots$ Then $\lambda_n = 2\pi/k = \dfrac{4L}{2n - 1}$ and $f_n = \dfrac{v}{\lambda_n} = (2n - 1)\dfrac{v}{4L}$. The string holds an odd number of quarter-wavelengths. (b) The lowest is $v/4L$, half of the $v/2L$ for two fixed ends, an octave lower. The others are 3, 5, 7, ... times the lowest: only odd multiples occur. The same mathematics describes the air in a pipe closed at one end, such as a clarinet.

Problem 9

For two in-step sources of equal amplitude $A$, find the smallest positive path difference at which the combined amplitude equals $A$, the amplitude of one source alone. What is the combined amplitude at a path difference of $\lambda/4$?

Show solutionHide solution

The amplitude is $2A|\cos(\pi\Delta/\lambda)|$, with $\Delta$ the path difference. Setting it equal to $A$ gives $|\cos(\pi\Delta/\lambda)| = \tfrac12$, whose smallest positive solution is $\pi\Delta/\lambda = \pi/3$, so $\Delta = \lambda/3$. At $\Delta = \lambda/4$ the amplitude is $2A\cos(\pi/4) = \sqrt2\,A = 1.41A$. So the amplitude falls smoothly from $2A$ at $\Delta = 0$ through $1.41A$ and $A$ to zero at $\Delta = \lambda/2$.

Shared definitions used by this lesson's figures
# house kit: prepended to every essay figure after the std imports

# palette. AZURE and EMBER are the two actors, LEAF marks an answer, ROSE a problem
let PAPER = [1, 1, 1, 1]
let INK = [0.08, 0.09, 0.11, 1]
let SLATE = [0.40, 0.44, 0.50, 1]
let MIST = [0.85, 0.86, 0.88, 1]
let AZURE = [0.13, 0.42, 0.68, 1]
let EMBER = [0.89, 0.42, 0.12, 1]
let LEAF = [0.13, 0.55, 0.36, 1]
let ROSE = [0.78, 0.22, 0.24, 1]
let PLUM = [0.47, 0.30, 0.66, 1]
let GOLD = [0.85, 0.62, 0.08, 1]

background = PAPER

# an opaque pastel of col; use for fills so overlaps do not darken
let tint = |col, amount = 0.18| [
    1 - (1 - col[0]) * amount,
    1 - (1 - col[1]) * amount,
    1 - (1 - col[2]) * amount,
    1
]

# text: Cap for labels, Note for quiet labels, Math for typeset maths
let Cap = |txt, size = 0.75, col = INK| color{col} Text(txt, size, "Charter")
let Note = |txt, size = 0.65| color{SLATE} Text(txt, size, "Charter")
let Math = |tex, size = 0.9, col = INK| color{col} Tex(tex, size)

# a paper rectangle to sit behind text that crosses lines
let Plate = |pos, size| center{pos} fill{PAPER} stroke{alpha{0} PAPER, 0} Rect(size)

# shapes with fill and stroke both set, so no stray black appears
let Pt = |pos, col = INK, r = 0.075| center{pos} fill{col} stroke{col, 1} Circle(r, 48)
let Ring = |pos, col = INK, r = 0.1, w = 3| center{pos} fill{PAPER} stroke{col, w} Circle(r, 48)
let Seg = |a, b, col = INK, w = 3| stroke{col, w} Line(a, b)
let Path = |pts, col = INK, w = 3| stroke{col, w} Polyline(pts)
let Region = |pts, col| fill{col} stroke{alpha{0} col, 0} Polygon(pts)
let Outline = |pts, col = INK, w = 3| fill{alpha{0} PAPER} stroke{col, w} Polygon(pts)
let Shape = |pts, col, amount = 0.18, w = 3| fill{tint(col, amount)} stroke{col, w} Polygon(pts)
let Disc = |pos, r, col, amount = 0.18, w = 3| center{pos} fill{tint(col, amount)} stroke{col, w} Circle(r, 96)
let Box = |pos, size, col, amount = 0.18, w = 3| center{pos} fill{tint(col, amount)} stroke{col, w} Rect(size)
# a line from a to b ending in a small solid arrowhead
let Tip = |a, b, col = INK, w = 3, head = 0.17| {
    let d = normalize([b[0] - a[0], b[1] - a[1], 0])
    let n = [-d[1], d[0], 0]
    let base = [b[0] - d[0] * head, b[1] - d[1] * head, 0]
    return [
        stroke{col, w} Line(a, base),
        fill{col} stroke{col, 1} Polygon([
            b,
            [base[0] + n[0] * head * 0.42, base[1] + n[1] * head * 0.42, 0],
            [base[0] - n[0] * head * 0.42, base[1] - n[1] * head * 0.42, 0]
        ])
    ]
}

# plots. a frame is [x0, x1, y0, y1, centre, width, height]: a data window and the scene box it fills
let Frame = |x0, x1, y0, y1, c = [0, 0, 0], w = 6.4, h = 3.6| [x0, x1, y0, y1, c, w, h]
let fx = |fr, x| fr[4][0] + (x - (fr[0] + fr[1]) / 2) * fr[5] / (fr[1] - fr[0])
let fy = |fr, y| fr[4][1] + (y - (fr[2] + fr[3]) / 2) * fr[6] / (fr[3] - fr[2])
let at = |fr, x, y| [fx(fr, x), fy(fr, y), 0]

# axes through the data origin (or the nearest edge of the window), with optional names
let Axes = |fr, x_name = "", y_name = "", col = SLATE| {
    let ox = clamp(fr[0], 0, fr[1])
    let oy = clamp(fr[2], 0, fr[3])
    var parts = [
        Tip(at(fr, fr[0], oy), [fx(fr, fr[1]) + 0.25, fy(fr, oy), 0], col, 2.5, 0.15),
        Tip(at(fr, ox, fr[2]), [fx(fr, ox), fy(fr, fr[3]) + 0.25, 0], col, 2.5, 0.15)
    ]
    if (x_name != "") {
        parts .= center{[fx(fr, fr[1]) + 0.5, fy(fr, oy), 0]} Math(x_name, 0.8, col)
    }
    if (y_name != "") {
        parts .= center{[fx(fr, ox), fy(fr, fr[3]) + 0.5, 0]} Math(y_name, 0.8, col)
    }
    return parts
}

# tick marks with numbers at the listed data values
let XTicks = |fr, xs, col = SLATE, places = 0| block {
    let oy = fy(fr, clamp(fr[2], 0, fr[3]))
    for (x in xs) {
        . Seg([fx(fr, x), oy - 0.07, 0], [fx(fr, x), oy + 0.07, 0], col, 2)
        . center{[fx(fr, x), oy - 0.33, 0]} Math(to_string(x, places), 0.72, col)
    }
}
let YTicks = |fr, ys, col = SLATE, places = 0| block {
    let ox = fx(fr, clamp(fr[0], 0, fr[1]))
    for (y in ys) {
        . Seg([ox - 0.07, fy(fr, y), 0], [ox + 0.07, fy(fr, y), 0], col, 2)
        . center{[ox - 0.36, fy(fr, y), 0]} Math(to_string(y, places), 0.72, col)
    }
}

# faint grid lines at the listed data values
let GridLines = |fr, xs, ys, col = MIST| block {
    for (x in xs) {
        . Seg(at(fr, x, fr[2]), at(fr, x, fr[3]), col, 1.5)
    }
    for (y in ys) {
        . Seg(at(fr, fr[0], y), at(fr, fr[1], y), col, 1.5)
    }
}

# the graph of f over [a, b], drawn in the frame. values are clamped to the window
let Graph = |fr, f, a, b, col = AZURE, w = 4, n = 160|
    stroke{col, w} Polyline(map(sample(a, b, n), |x| at(fr, x, clamp(fr[2], f(x), fr[3]))))

# the region between the graph of f and the x axis over [a, b]
let AreaUnder = |fr, f, a, b, col = AZURE, amount = 0.2, n = 80| {
    var pts = [at(fr, a, 0)]
    for (x in sample(a, b, n)) {
        pts .= at(fr, x, clamp(fr[2], f(x), fr[3]))
    }
    pts .= at(fr, b, 0)
    return fill{tint(col, amount)} stroke{alpha{0} col, 0} Polygon(pts)
}

# plot furniture: grid, left and bottom edges, a zero line, numbers along the edges, names
let Panel = |f, gx, gy, lx, ly, xname, title, col = SLATE| block {
    . GridLines(f, gx, gy)
    if (f[2] < 0) {
        . Seg(at(f, f[0], 0), at(f, f[1], 0), SLATE, 2)
    }
    . Path([at(f, f[0], f[3]), at(f, f[0], f[2]), at(f, f[1], f[2])], SLATE, 2.5)
    for (x in lx) {
        . center{[fx(f, x), fy(f, f[2]) - 0.3, 0]} Math(to_string(x), 0.72, SLATE)
    }
    for (y in ly) {
        . center{[fx(f, f[0]) - 0.36, fy(f, y), 0]} Math(to_string(y), 0.72, SLATE)
    }
    if (xname != "") {
        . center{[(fx(f, f[0]) + fx(f, f[1])) / 2, fy(f, f[2]) - 0.64, 0]} Note(xname, 0.72)
    }
    if (title != "") {
        . center{[(fx(f, f[0]) + fx(f, f[1])) / 2, fy(f, f[3]) + 0.3, 0]} Cap(title, 0.74, col)
    }
}
let Arrow2 = |tail, vec, col, w = 4| Tip(tail, [tail[0] + vec[0], tail[1] + vec[1], 0], col, w, 0.18)
let Dash = |a, b, col = SLATE, w = 2.5| dashed{[0.12, 0.08]} stroke{col, w} Line(a, b)
let tidy = |v, eps = 0.05| {
    if (abs(v) < eps) { return 0 }
    return v
}
# a rope: waves travel at 4 m/s
let V = 4
# the ripple tank: two dippers 6 cm apart making ripples of wavelength 2 cm. SC scene units per cm
let SC = 0.33
let LAM = 2
let HALF = 3
# color for a displacement u between -1 and 1: blue crests, orange troughs, white at rest
let wavecol = |u| {
    if (u > 0) { return tint(AZURE, 0.9 * min(1, u)) }
    return tint(EMBER, 0.9 * min(1, -u))
}
# x (cm) at height y (cm) above the dippers where the path difference is d (cm)
let hyp = |d, y| (d / 2) * sqrt(1 + y * y / (HALF * HALF - d * d / 4))