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
- Bessel's equation:
x² y″ + x y′ + (x² − n²) y = 0 - Series solution:
Jₙ(x) = Σₖ (−1)ᵏ / [k!(k + n)!] · (x/2)^(2k+n) - General solution:
y = A Jₙ(x) + B Yₙ(x) - Modified equation:
x² y″ + x y′ − (x² + n²) y = 0 → y = A Iₙ(x) + B Kₙ(x) - Derivative identity:
J₀′(x) = −J₁(x); d/dx[xⁿJₙ] = xⁿJₙ₋₁ - Large-x behaviour:
Jₙ(x) ≈ √(2/(πx)) cos(x − nπ/2 − π/4) - Drum frequencies:
f_{n,m} = j_{n,m} · c / (2πa) - Orthogonality:
∫₀¹ x Jₙ(j_{n,p} x) Jₙ(j_{n,q} x) dx = 0, p ≠ q
Worked example: Series evaluation
Given: J₀(1) using three terms
Find: J₀(1).
- J₀(x) = 1 − (x/2)² + (x/2)⁴/4 − …
- = 1 − 0.25 + 0.015625 − 0.000434
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.
- f₀₁ = j₀,₁ c/(2πa)
- = 2.4048 × 100 / (2π × 0.2)
Answer: f ≈ 191.4 Hz
Worked example: FM carrier null
Given: FM modulation index β
Find: β that removes the carrier.
- Carrier amplitude ∝ J₀(β)
- First zero of J₀
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 HzUnlike 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
- Wrong: Keeping Yₙ in a solid-disc problem. — Right: Yₙ is infinite at r = 0; drop it unless the centre is excluded.
- Wrong: Assuming overtones are integer multiples. — Right: Ratios follow Bessel zeros: 1, 2.30, 3.60 …
- Wrong: Forgetting the weight r in orthogonality. — Right: ∫ r Jₙ(αr)Jₙ(βr) dr = 0.
Applications
- Acoustics: Drum and loudspeaker-cone modes, circular duct acoustics.
- Heat transfer: Cooling of cylinders, annular fins (I₀, K₀).
- Electromagnetics: Skin effect in round wires, circular waveguides, optical fibres.
- Communications: FM and PM sideband amplitudes Jₙ(β).
Key takeaways
- Bessel functions = sines of circular geometry.
- Use Jₙ for solid discs; add Yₙ for annuli.
- Boundary zeros fix the eigen-frequencies.
- Overtones are not harmonic.
Going further
- Spherical Bessel functions: jₙ(x) = √(π/2x) J_{n+½}(x) for spherical waves and quantum wells.
- Hankel functions: H = J ± iY represent outgoing/incoming cylindrical waves.
- Hankel transform: The radial Fourier transform for axisymmetric problems.