Domain: Physics — High-energy particle physics

Problem:
Consider a central heavy-ion collision modeled by 1+1D Bjorken expansion with temperature evolution \( T(\tau) = T_0 \left( \frac{\tau_0}{\tau} \right)^{1/3} \). Thermal photon emission rate (per unit 4-volume per GeV) is modeled as
\[
R(T,E) = A T^2 \left( \frac{E}{T} \right)^p \frac{e^{-E/T}}{1 + B \left( \frac{E}{T} \right)^2},
\]
with constants \( (A = 5.00 \times 10^{-3} \, \mathrm{fm^{-4} GeV^{-1}}, \, B = 0.75, \, p = 1.5) \). Use \( (T_0 = 0.500 \, \mathrm{GeV}) \) at \( (\tau_0 = 0.6 \, \mathrm{fm}/c) \); freezeout when \( (T(\tau_f) = T_c = 0.155 \, \mathrm{GeV}) \). The rapidity-density yield per unit rapidity is
\[
\frac{dN}{dy}(E) = \pi R_A^2 \int_{\tau_0}^{\tau_f} \tau R(T(\tau), E) \, d\tau,
\]
with nuclear radius \( (R_A = 6.5 \, \mathrm{fm}) \). Find the photon energy \( (E_{\max} \in [0.10, 10.0]) \) GeV that maximizes \( dN/dy(E) \). Report \( (E_{\max}) \) in GeV, rounded to three decimal places. Deterministic tolerance: final value must be within \( (\pm 0.001 \, \mathrm{GeV}) \).

Answer: 0.158

Solution code:
# Numerical solution for the thermal-photon maximization problem.
# The code computes dN/dy(E) for E in [0.1, 10] GeV and finds E_max (rounded to 3 decimals).
# Deterministic, vectorized integration (composite trapezoidal rule) and a golden-section refinement are used.
import numpy as np

# Constants (from problem statement)
A = 5.00e-3  # fm^-4 GeV^-1
B = 0.75
p = 1.5
T0 = 0.500  # GeV
tau0 = 0.6  # fm/c
Tc = 0.155  # GeV
RA = 6.5    # fm

# Derived freeze-out time
tau_f = tau0 * (T0 / Tc)**3

# Precompute tau grid for integration (dense and fixed to ensure determinism)
N_tau = 20001  # odd number for good resolution
tau = np.linspace(tau0, tau_f, N_tau)
T_tau = T0 * (tau0 / tau)**(1/3)  # T(τ) profile
tau_weights = tau  # integrand has factor tau * R(T,E)

# Vectorized integrator: takes E (scalar) and returns dN/dy(E)
pi_RA2 = np.pi * RA**2

def dNdy(E):
    x = E / T_tau  # dimensionless
    # R(T,E) = A T^2 (E/T)^p exp(-E/T) / (1 + B (E/T)^2)
    # Compute vectorized integrand = tau * R(T,E)
    # Guard against underflow in exp for large x (it's fine numerically with numpy)
    R = A * (T_tau**2) * (x**p) * np.exp(-x) / (1.0 + B * x**2)
    integrand = tau_weights * R
    integral = np.trapz(integrand, tau)
    return pi_RA2 * integral

# Coarse grid search to find initial bracket for maximum
E_grid = np.linspace(0.10, 10.0, 2001)
vals = np.array([dNdy(E) for E in E_grid])
imax = np.argmax(vals)
E_coarse = E_grid[imax]

# Define bracket around coarse maximum for refinement (ensure within domain)
delta = max(0.5, (E_grid[1]-E_grid[0])*5)
a = max(0.10, E_coarse - delta)
b = min(10.0, E_coarse + delta)

# Golden-section search for maximum (maximize f on [a,b])
phi = (1 + np.sqrt(5)) / 2
resphi = 2 - phi  # = 1/phi^2
tol = 1e-6  # tolerance in energy (GeV)
max_iters = 200
c = a + resphi * (b - a)
d = b - resphi * (b - a)
fc = dNdy(c)
fd = dNdy(d)

for _ in range(max_iters):
    if b - a < tol:
        break
    if fc > fd:
        b = d
        d = c
        fd = fc
        c = a + resphi * (b - a)
        fc = dNdy(c)
    else:
        a = c
        c = d
        fc = fd
        d = b - resphi * (b - a)
        fd = dNdy(d)

# Choose best of c,d (and endpoints to be safe)
candidates = [a, b, c, d, E_coarse]
vals_cand = [dNdy(E) for E in candidates]
imax2 = np.argmax(vals_cand)
E_max = candidates[imax2]

# Round to three decimals as requested
E_max_rounded = float(np.round(E_max, 3))

# Print the result
print(f"{E_max_rounded:.3f}")