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

\[ds^2 = -\alpha(r)^2 dt^2 + a(r)^2 dr^2 + r^2 d\Omega^2,\]

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.