The vibrating drum: Fourier–Bessel series on a circular membrane
A drum that rings in exactly the modes the reader keeps, released from the shapes of the exercises. Its Bessel functions and their zeros are computed in the page with no library, and agree with SciPy’s to within a trillionth.
| Order | First | Second | Third |
|---|---|---|---|
| J0 | 2.4048 | 5.5201 | 8.6537 |
| J1 | 3.8317 | 7.0156 | 10.1735 |
| J2 | 5.1356 | 8.4172 | 11.6198 |
What it shows
A drum is a membrane stretched over a circle and fixed at its rim. Struck, or released from a shape, it vibrates as a sum of modes: patterns that each keep their shape and only grow and shrink in time, each at its own frequency. The figure is that sum, kept to as many modes as the reader chooses, for the initial shapes of the directed study’s exercises. The exercises worked each expansion to two terms by hand; the figure keeps up to twenty, so the effect of every further term can be seen.
The drum’s modes do not ring in tune with one another, as a string’s do. A string’s frequencies are whole multiples of its lowest; a drum’s are set by the zeros of Bessel functions, and the second axisymmetric one is 2.295 times the first, not twice it. That is why a drum sounds as a drum.
The mathematics
The membrane’s height u(r, θ, t) satisfies the wave equation in polar coordinates, with u = 0 on the rim. Separating variables, writing u as a product of a function of r, one of θ and one of t, gives a sine or cosine of nθ round the drum, a sine or cosine of λt in time, and Bessel’s equation of order n across it, whose solutions bounded at the centre are Jn(λr). The rim being fixed asks Jn(λ) = 0: the allowed λ are the zeros of Jn, and they are the drum’s frequencies.
An initial displacement f and velocity g expand in these modes. Across the drum the modes are orthogonal with weight r, so each coefficient is found on its own: the integral of the shape’s radial profile against Jn(λr), with weight r, divided by the same integral of the mode’s square, which is half of Jn+1(λ)2. The displacement’s coefficients ring as cos λt; the velocity’s, divided by λ, as sin λt.
The exercises
Four drums from the course’s section on the circular membrane: released from 2 sin 2θ, set moving with velocity −cos θ, released from r sin θ, and set moving with velocity (r − 1) cos 2θ. Each has a single angular order, so only the Bessel function of that order appears. The four radial profiles of the section on Bessel series, f(r) = 1, 2r + 1, 1 − 3r and a step from 3 to 1 at half the radius (the section writes x for r), were expansions on a line; Fig. 2 shows them as the exercises do, in J0 and J1, and the drum also strikes them as initial shapes.
How it is computed and tested
Everything is computed in the page, in TypeScript with no library. Jn comes from Miller’s backward recurrence, normalised by the sum identity; the zeros by a scan for each change of sign, closed by bisection; the coefficients by Gauss–Legendre quadrature, split where a profile jumps. The tests hold the Bessel functions and their zeros to SciPy’s values within 10−12, check the modes’ orthogonality, check that a pure mode expands to itself, that the error never grows as modes are added, that the drum’s energy is the same at every moment, and that the exercises’ two-term coefficients come out to four places.
The drum is drawn with WebGL2: its heights are summed on the processor every frame from a table of Jn(λr) made once per shape, and lit as the implied-volatility surface on this site is. Where the drum does not run live, its still frame is the same solution, drawn, and every control still redraws it.
- MATH 4992, directed study, Northeastern University, Spring 2026