gwEccEvolve_NoSpinq4 : SVD surrogate model for eccentricity evolution in non-spinning binaries

Presented by Islam et al. (https://arxiv.org/abs/2604.17868)

[1]:
import sys
# install gwModels in editable mode from the parent directory
!{sys.executable} -m pip install -e ../ --no-deps --quiet

import matplotlib.pyplot as plt
import numpy as np
import warnings
warnings.filterwarnings("ignore", "Wswiglal-redir-stdio")

import gwModels
gwModels.utils.set_rcparams()
lal.MSUN_SI != Msun

Load the model

[2]:
model = gwModels.dynamics.gwEccEvolve_NoSpinq4('../gwModels/data/gwEccEvolve_NoSpinq4.npy')
model.info()
gwEccEvolve_NoSpinq4 — SVD surrogate for eccentricity evolution
  Time domain : [-6300, -1] M
  q range     : [1.000, 4.000]
  e0 range    : [0.003, 0.443]
  SVD basis   : 2 components

Single evaluation

[3]:
t = np.linspace(-6300, -1, 63000)
q, e0 = 1.5, 0.2

ecc = model(t, q=q, e0=e0)

plt.figure(figsize=(8, 4))
plt.plot(t, ecc, lw=2)
plt.xlabel('$t/M$')
plt.ylabel('$e(t)$')
plt.title(f'gwEccEvolve_NoSpinq4: q={q}, $e_0$={e0}')
plt.tight_layout()
plt.show()
../_images/notebooks_4_3_dynamics_gwEccEvolve_NoSpinq4_5_0.png

Evaluation with uncertainty

[4]:
ecc, ecc_std = model(t, q=q, e0=e0, return_std=True)

plt.figure(figsize=(8, 4))
plt.plot(t, ecc, lw=2, label='Model')
plt.fill_between(t, ecc - 2*ecc_std, ecc + 2*ecc_std, alpha=0.3, label='$\\pm 2\\sigma$')
plt.xlabel('$t/M$')
plt.ylabel('$e(t)$')
plt.title(f'gwEccEvolve_NoSpinq4 with uncertainty: q={q}, $e_0$={e0}')
plt.legend(frameon=False)
plt.tight_layout()
plt.show()
../_images/notebooks_4_3_dynamics_gwEccEvolve_NoSpinq4_7_0.png

Parameter-space sweep

[5]:
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# Vary q at fixed e0
e0_fixed = 0.2
for q_test in [1.0, 1.5, 2.0, 3.0, 4.0]:
    ecc_pred = model(t, q=q_test, e0=e0_fixed)
    axes[0].plot(t, ecc_pred, lw=2, label=f'q={q_test}')
axes[0].set_xlabel('$t/M$')
axes[0].set_ylabel('$e(t)$')
axes[0].set_title(f'Varying q at $e_0$={e0_fixed}')
axes[0].legend(frameon=False)

# Vary e0 at fixed q
q_fixed = 2.0
for e0_test in [0.05, 0.1, 0.2, 0.3, 0.4]:
    ecc_pred = model(t, q=q_fixed, e0=e0_test)
    axes[1].plot(t, ecc_pred, lw=2, label=f'$e_0$={e0_test}')
axes[1].set_xlabel('$t/M$')
axes[1].set_ylabel('$e(t)$')
axes[1].set_title(f'Varying $e_0$ at q={q_fixed}')
axes[1].legend(frameon=False)

plt.tight_layout()
plt.show()
../_images/notebooks_4_3_dynamics_gwEccEvolve_NoSpinq4_9_0.png
[ ]: