Boson Stars
David Kaup asked, in 1968, what happens when a complex scalar field is left alone with its own gravity, and found the answer is a star: a localized, stationary, horizonless solution of the Einstein-Klein-Gordon system. Remo Ruffini and Silvano Bonazzola reached the same configurations a year later from the quantum side, as the ground state of a cold cloud of gravitating bosons. Unlike a fermion star, nothing here is held up by degeneracy pressure — the star is supported by the uncertainty principle wearing a classical disguise, the field’s intrinsic gradient energy resisting collapse. Whether dark matter builds such objects remains an open question, which is precisely what keeps them interesting.
The model
The field carries a conserved charge, so a stationary star is not a static field but a rotating phase: the harmonic ansatz \(\phi(r,t) = \phi(r)e^{-i\omega t}\) puts all the time dependence in a phase the stress-energy never sees. In the polar-areal metric
the Einstein and Klein-Gordon equations reduce to a first-order ODE system
for \((a, \alpha, \phi, \Phi \equiv \phi')\), with the potential
\(V = |\phi|^2 + \tfrac{\lambda}{2}|\phi|^4\), and the frequency
\(\omega\) is an eigenvalue: only discrete central-lapse values give a
profile that decays into flat space, and the nodeless one is the ground
state. The pyCE.bosonstars.BosonStar class finds it by bisection
shooting on the central lapse, exactly as pyCE.instantons shoots on
the core field value — the same numerical instinct, pointed at a different
equation.
Solving a star
Everything happens at instantiation:
import matplotlib.pyplot as plt
from pyCE.bosonstars import BosonStar
star = BosonStar(0.1) # core field value phi0 = 0.1
plt.plot(star.r, star.phi)
plt.xlabel('$r$')
plt.ylabel(r'$\phi(r)$')
plt.show()
print(star.M, star.R, star.omega)
For \(\phi_0 = 0.1\) you should find M = 0.533 (in units of
\(M_{\rm Pl}^2/m\)), R = 6.0, and \(\omega = 0.937\) — a bound
state, since \(\omega < 1\) means the star sits below the free-particle
mass threshold. The metric functions (star.a, star.alpha), the
energy density (star.rho), the Misner-Sharp mass function
(star.mass), and the configurational entropy machinery (star.mf,
star.k, star.Sc) all hang off the object. Pass lamb to switch
on the quartic self-interaction — Monica Colpi, Stuart Shapiro, and Ira
Wasserman showed in 1986 that it inflates these stars from curiosities to
astrophysical contenders. Pass plot_progress = True to watch the
shooting method work; the failed shots tell you as much about the
eigenvalue problem as the successful one does.
The mass curve
The defining plot of the subject is the mass against the core value:
import numpy as np
phi0s = np.linspace(0.05, 0.45, 9)
stars = [BosonStar(p) for p in phi0s]
plt.plot(phi0s, [s.M for s in stars], 'o-')
plt.xlabel(r'$\phi_0$')
plt.ylabel('$M$')
plt.show()
The curve rises, peaks at the Kaup limit — M = 0.633 near
\(\phi_0 = 0.27\) — and turns over; configurations past the peak are
unstable to collapse, in close analogy with the white-dwarf story. Now make
the information-theoretic version of the plot: [s.Sc for s in stars]
against \(\phi_0\). How does the configurational entropy behave as the
family approaches the stability boundary? That question is exactly the kind
this library was built to ask — see Gleiser & Sowinski, Phys. Lett. B
727, 272 (2013) before peeking at the answer.