NY Vir Keplerian Modeling

Demonstrates fitting two Keplerian orbits.

%load_ext autoreload
%autoreload 2
import os
os.environ['PYTENSOR_FLAGS'] = 'mode=NUMBA'
from ocpy.data import Data

data = Data.from_file("../ny_vir_minima.xlsx")
data = data.fill_errors(0.0001).calculate_weights()

t0 = 2453174.442769
period = 0.1010159690

oc = data.calculate_oc(
    reference_minimum=t0,
    reference_period=period,
    model_type="pymc"
)
from ocpy.oc import Linear, Quadratic, Keplerian, Parameter

# 1) Linear (y = a*x + b)
lin = Linear(
    a=Parameter(value=0.0,   std=2e-5,  min=-1e-3,  max=1e-3,  fixed=False),
    b=Parameter(value=0.0,   std=2e-3,  min=-0.1,   max=0.1,   fixed=False),
)

# 2) Quadratic (q * x^2)
quad = Quadratic(
    q=Parameter(value=0.0,   std=5e-10, min=-1e-8,  max=1e-8,  fixed=False),
)

# 3) Keplerian component #1 (approx 80k epoch)
lite1 = Keplerian(
    P     = Parameter(value=80000,  std=8_000,  min=30_000,  max=150_000, fixed=False),
    T0    = Parameter(value=60000,  std=5_000,                          fixed=False),
    amp   = Parameter(value=2.0e-4, std=1.0e-4, min=0.0,    max=1.0e-3,  fixed=False),
    e     = Parameter(value=0.0,    fixed=True),
    omega = Parameter(value=0.0,    fixed=True),
)

# 4) Keplerian component #2 (approx 40k epoch)
lite2 = Keplerian(
    P     = Parameter(value=40000,  std=6_000,  min=10_000,  max=100_000, fixed=False),
    T0    = Parameter(value=30000,  std=5_000,                          fixed=False),
    amp   = Parameter(value=5.0e-5, std=2.5e-5, min=0.0,    max=5.0e-4,  fixed=False),
    e     = Parameter(value=0.0,    fixed=True),
    omega = Parameter(value=0.0,    fixed=True),
)

models = [lin, quad, lite1, lite2]

oc.plot(model=models)
<Axes: ylabel='O−C'>
../../../_images/d863d3a60c57573d399afb256fa4e6c3bd7ed42db5b9d153a33039f4b32f28f3.png
res = oc.fit(models, tune=1000, draws=1000, chains=2)
oc.plot(res)
Initializing NUTS using jitter+adapt_diag...
Multiprocess sampling (2 chains in 2 jobs)
NUTS: [linear_a, linear_b, quadratic_q, keplerian1_amp, keplerian1_P, keplerian1_T0, keplerian2_amp, keplerian2_P, keplerian2_T0]

Sampling 2 chains for 1_000 tune and 1_000 draw iterations (2_000 + 2_000 draws total) took 316 seconds.
We recommend running at least 4 chains for robust computation of convergence diagnostics
The rhat statistic is larger than 1.01 for some parameters. This indicates problems during sampling. See https://arxiv.org/abs/1903.08008 for details
<Axes: ylabel='O−C'>
../../../_images/e1a4aab9c361f132167238ce0167957579b51d9969cab50c4dc17c455d08ea5e.png
oc.plot(res)
oc.corner(res)
../../../_images/31e04009034a95973b740b71fe10095455afd8adf73a313bd85654713b8649f9.png ../../../_images/3d9a002807ea2d9b4fe6e1d5fa1110debc982783be0ebfabad28987ef5840e39.png ../../../_images/31e04009034a95973b740b71fe10095455afd8adf73a313bd85654713b8649f9.png