Reconstructing a Spectrum from a Single Periodic Orbit#

This tutorial reconstructs the quantum energy spectrum of a bound 1D system purely from the classical action and period of its one family of periodic orbits – the Gutzwiller trace formula – and then looks at a genuinely 2D chaotic system, the stadium billiard, where individual eigenstates can still show a visible imprint of one particular unstable orbit.

The exact 1D trace formula#

For a one-dimensional bound potential, Einstein-Brillouin-Keller (EBK) quantization places energy levels exactly where the classical action \(S(E)\) (physicskit.semiclassical.core.wkb.wkb_action()) satisfies \(S(E_n)/\hbar=(n+\tfrac12)\pi\). Poisson-summing that discrete spectrum over the quantum number converts it into a sum over classical orbit repetitions – the one-dimensional Gutzwiller trace formula, and (unlike the general multi-dimensional formula) exact:

import numpy as np
from scipy.signal import find_peaks
from physicskit.semiclassical.core.gutzwiller import gutzwiller_density_of_states
from physicskit.semiclassical.core.wkb import bohr_sommerfeld_energies

V = lambda x: 0.5 * x ** 2
E_grid = np.linspace(0.2, 4.5, 600)
dos = gutzwiller_density_of_states(E_grid, V, m=1.0, x_min=-20, x_max=20)

peak_idx, _ = find_peaks(dos, height=0.3 * dos.max())
print(E_grid[peak_idx])  # [0.5, 1.5, 2.5, 3.5]
print(bohr_sommerfeld_energies(V, m=1.0, x_min=-20, x_max=20, n_max=4))  # matches exactly

physicskit.semiclassical.visualizers.gutzwiller.plot_density_of_states() plots dos against E_grid with the exact levels marked, showing each oscillating term of the sum sharpening the reconstructed peaks as more orbit repetitions (r_max) are included.

Quantum scars in the stadium billiard#

In a genuinely chaotic system, periodic orbits are isolated and unstable rather than forming a continuous family, and the general (multi-dimensional) Gutzwiller formula applies instead – physicskit.semiclassical.core.gutzwiller.gutzwiller_amplitude_from_monodromy() gives the corresponding stability-weighted amplitude, \(1/\sqrt{|2-\operatorname{tr}M|}\), for any such orbit’s monodromy matrix. The Bunimovich stadium billiard (physicskit.quantum.chapters.potentials.StadiumBilliard2D) is the classic testbed: almost every trajectory disperses chaotically off its curved end-caps, but the family of “bouncing ball” orbits – bouncing straight up and down between the flat top and bottom walls – is only marginally unstable, and Heller (1984) found that several low-lying eigenstates concentrate their density visibly along exactly this family:

from physicskit.quantum.chapters.potentials import StadiumBilliard2D
from physicskit.semiclassical.systems.scarring import (
    bouncing_ball_energies, bouncing_ball_orbit_points, scar_enhancement,
)

sb = StadiumBilliard2D(L=1.0, R=0.5)
energies, wavefunctions, X, Y, mask = sb.solve(n_points=90, n_states=6)

print(bouncing_ball_energies(R=0.5, n_max=3))  # leading-order prediction

x0 = 0.0
for psi in wavefunctions:
    eta = scar_enhancement(psi ** 2, X, Y, mask, x0=x0, half_width=0.05)
    print(eta)  # > 1 for a state scarred on the x0 bouncing-ball orbit

physicskit.semiclassical.visualizers.scarring.plot_scar_map() heatmaps any eigenstate’s density with bouncing_ball_orbit_points() drawn on top, making the enhancement directly visible; the interactive plot_scar_map_interactive() is useful for zooming into the fine structure of a strongly scarred state.