Bessel Functions

Bessel functions are the natural 'sines and cosines' of problems with circular or cylindrical geometry. Learn Bessel's equation, the series for Jₙ(x), the second-kind Yₙ and modified Iₙ, Kₙ functions, zeros and orthogonality, and apply them to drum vibration, heat flow in cylinders and fins, and FM spectra.

When you separate variables for the wave or heat equation in polar/cylindrical coordinates, the radial equation is Bessel's equation: x²y″ + xy′ + (x² − n²)y = 0. Its solutions oscillate like cosines but decay like 1/√x, exactly like ripples on a pond.

Where a string's modes are sin(nπx/L), a circular drum's modes are Jₙ(k r) with k chosen so the drum edge is at a zero of Jₙ. Bessel functions also describe FM radio sidebands, skin effect in wires, and flow in pipes.

An analogy

A Bessel function is a ripple in a pond: it oscillates like a sine wave but spreads its energy over a growing circle, so its amplitude shrinks as it travels outward.

Where Bessel's equation comes from

Write the 2-D wave equation in polar coordinates, assume u = R(r)Θ(θ)T(t). The angular part gives cos nθ, the time part cos ωt, and the radial part becomes r²R″ + rR′ + (k²r² − n²)R = 0 — Bessel's equation in x = kr.

Because the geometry is round, the 'natural shapes' are Bessel functions instead of sines.

First and second kinds

Jₙ is finite at x = 0; Yₙ → −∞ there. For a solid disc or cylinder that includes the centre, physics demands a finite solution, so B = 0 and only Jₙ survives. For an annulus (pipe wall, washer) both are needed.

The modified functions Iₙ (grows) and Kₙ (decays) arise when the sign flips — e.g. steady heat in a circular fin or skin effect in a round conductor.

Zeros set the eigenvalues

Boundary conditions pick discrete values of k: a clamped drum edge requires Jₙ(ka) = 0, so ka = j_{n,m}. Tabulated zeros: j₀,₁ = 2.4048, j₀,₂ = 5.5201, j₁,₁ = 3.8317. Spacing approaches π for large m.

Fourier–Bessel series and FM

Just as any function on [0, L] can be expanded in sines, any radial profile on [0, a] can be expanded in Jₙ(j_{n,m} r/a) using the orthogonality weight r. This solves cooling of a long cylinder or the start-up flow in a pipe.

In FM, cos(ωct + β sin ωmt) = Σ Jₙ(β) cos((ωc + nωm)t): sideband amplitudes are Bessel values, and the carrier vanishes when β = 2.405 — a practical way to calibrate deviation.

Formulas

Worked example: Series evaluation

Given: J₀(1) using three terms

Find: J₀(1).

Answer: J₀(1) ≈ 0.7652

Worked example: Fundamental of a drum

Given: Radius a = 0.2 m; Wave speed c = 100 m/s

Find: Lowest frequency.

Answer: f ≈ 191.4 Hz

Worked example: FM carrier null

Given: FM modulation index β

Find: β that removes the carrier.

Answer: β = 2.405

Bessel series, zeros and drum modes

import math

def J(n, x, terms=40):
    """Bessel function of the first kind from its power series."""
    return sum((-1)**k / (math.factorial(k) * math.factorial(k + n)) * (x / 2)**(2*k + n)
               for k in range(terms))

def zero(n, a, b):
    """Bisection for a root of J_n between a and b."""
    for _ in range(60):
        m = (a + b) / 2
        a, b = (a, m) if J(n, a) * J(n, m) <= 0 else (m, b)
    return (a + b) / 2

print(f"J0(1) = {J(0, 1):.4f}   J1(1) = {J(1, 1):.4f}")
zs = [zero(0, a, a + 1) for a in (2, 5, 8)]
print("first zeros of J0:", [round(z, 4) for z in zs])
c, a = 100.0, 0.2          # membrane wave speed (m/s), drum radius (m)
for k, z in enumerate(zs, 1):
    print(f"mode (0,{k}): f = {z * c / (2 * math.pi * a):.1f} Hz")
# J0(1) = 0.7652   J1(1) = 0.4401
# first zeros of J0: [2.4048, 5.5201, 8.6537]
# mode (0,1): f = 191.4 Hz
# mode (0,2): f = 439.3 Hz
# mode (0,3): f = 688.6 Hz

Unlike a string (f, 2f, 3f …), a drum's overtones are not integer multiples of the fundamental — 439/191 = 2.30 — which is why drums sound 'unpitched'. In practice use scipy.special.jv and jn_zeros.

Common mistakes

Applications

Key takeaways

Going further