Lessons · waves

Standing waves on a string: why only the harmonics fit

Regime 3 — an algebra-only topic.

Regime 3 · algebra-only Math machine-derived & checked by SymPy 2 modeling assumptions (author-asserted)

A string of length L=1L = 1 m, fixed at both ends, carries transverse waves at speed v=120v = 120 m/s. It cannot vibrate at just any frequency — only at a discrete ladder of standing waves, the harmonics fn=nv/2Lf_n = nv/2L. The nn-th harmonic has nn half-wavelengths between the walls and n1n-1 interior nodes that never move. Drag the mode number: the shape changes, the nodes stay pinned, and the frequency climbs in exact integer steps. Why only integers? Because the ends are pinned — and that boundary condition is what quantizes the modes.

Fundamental frequency f1=v/2Lf_1 = v/2L
60 Hz
Fundamental wavelength λ1=2L\lambda_1 = 2L
2 m
Frequency of harmonic n=3n=3: fn=nv/2Lf_n = nv/2L
180 Hz
Wavelength of harmonic n=3n=3: λn=2L/n\lambda_n = 2L/n
0.6667 m
The string obeys the wave equation; its standing solutions separate
tty=v2xxy  y(x,t)=Asin(kx)cos(ωt),ω=vk\partial_{tt} y = v^2\,\partial_{xx} y \ \Longrightarrow\ y(x,t) = A\sin(kx)\cos(\omega t),\quad \omega = vk

Every small piece of the string obeys the wave equation. Looking for solutions that oscillate in place — a fixed shape times a time wobble — gives y=Asin(kx)cos(ωt)y = A\sin(kx)\cos(\omega t), which solves it whenever ω=vk\omega = vk. So far kk could be anything.

check tty=v2xxy\partial_{tt}y = v^2\partial_{xx}y; fixed ends sin(kL)=0\sin(kL)=0; standing = two travelling waves; fn=nv/2Lf_n = nv/2L; λn=2L/n\lambda_n = 2L/n

  • The mode solves the wave equation tty=v2xxy\partial_{tt} y = v^2\,\partial_{xx} y — back-substituting y=Asin(kx)cos(ωt)y = A\sin(kx)\cos(\omega t) leaves zero, with ω=vk\omega = vk. [structural]
  • The string is pinned at both ends: y(0)=0y(0)=0 automatically, and y(L)=0y(L)=0 forces sin(kL)=sin(nπ)=0\sin(kL)=\sin(n\pi)=0 — the boundary condition that quantizes the modes to integer nn. [structural]
  • A standing wave is two counter-propagating travelling waves superposed: 12A[sin(kxωt)+sin(kx+ωt)]=Asin(kx)cos(ωt)\tfrac12 A[\sin(kx-\omega t)+\sin(kx+\omega t)] = A\sin(kx)\cos(\omega t). [simplify]
  • The harmonic frequencies fall out: fn=ωn/2π=nv/(2L)f_n = \omega_n/2\pi = nv/(2L). [structural]
  • The wavelengths are λn=2π/kn=2L/n\lambda_n = 2\pi/k_n = 2L/n — an integer number of half-wavelengths fits the length. [structural]

Dimensional homogeneity: checked by SymPy (holds).

Common misconception: “A string can be made to vibrate as a standing wave at any frequency you choose.

It cannot. The fixed ends force a node at each end, so only shapes with a whole number of half-wavelengths between them survive — the harmonics fn=nv/2Lf_n = nv/2L. Drive the string at some other frequency and the reflections off the ends no longer line up: the wave interferes with itself and dies out instead of building a steady standing pattern. This is the same quantization that, one domain over, restricts an electron in a box to discrete energies — boundary conditions select a discrete ladder.

Modeling assumptions — author-asserted, disclosed not discharged
  • An ideal string fixed rigidly at both ends, so there is a displacement node at each end at all times.
  • The wave speed vv is constant (a uniform string under constant tension); damping is neglected, so the modes are sharp.

The stacked graph, fully annotated

A static rendering (Matplotlib) at the default parameters — the interactive version is in the Graph tab above.

2026-06-27T08:27:33.308213 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/