NY Vir Newtonian N-Body Modeling

Demonstrates Newtonian N-body modeling using Rebound.

%load_ext autoreload
%autoreload 2
import os
The autoreload extension is already loaded. To reload it, use:
  %reload_ext autoreload
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.newtonian import NewtonianModel
from ocpy.oc import Parameter

nbody = NewtonianModel(
    central_mass=Parameter(value=0.611, fixed=True),
    T0_ref=t0,
    P_ref=period,
    bodies = [
        {
            "m":     Parameter(value=0.0021, fixed=False, std=1,  min=0),
            "P":     Parameter(value=3170.0, fixed=False, std=1000, min=0), 
            "e":     Parameter(value=0.05,   fixed=False, std=1,  min=0, max=.8),
            "omega": Parameter(value=269.0,  fixed=False, std=200, min=0, max=360),
            "T":     Parameter(value=2443302.0, fixed=False, std=3170.0), 
        },
        {
            "m":     Parameter(value=0.0038, fixed=False, std=1,  min=0),
            "P":     Parameter(value=8260.0, fixed=False, std=1000, min=0), 
            "e":     Parameter(value=0.02,   fixed=False, std=1,  min=0, max=.8),
            "omega": Parameter(value=140.0,  fixed=False, std=200, min=0, max=360),
            "T":     Parameter(value=2421163.0, fixed=False, std=8260.0), 
        }
    ],
    name="nbody"
)
models = [nbody]
from pymc import DEMetropolisZ
res = oc.fit(models, tune=2000, draws=2000, chains=4)
oc.plot(res)
oc.corner(res)
res
[autoreload of cutils_ext failed: Traceback (most recent call last):
  File "c:\Users\bar1s\miniconda3\envs\ocpy\Lib\site-packages\IPython\extensions\autoreload.py", line 325, in check
    superreload(m, reload, self.old_objects)
  File "c:\Users\bar1s\miniconda3\envs\ocpy\Lib\site-packages\IPython\extensions\autoreload.py", line 580, in superreload
    module = reload(module)
             ^^^^^^^^^^^^^^
  File "c:\Users\bar1s\miniconda3\envs\ocpy\Lib\importlib\__init__.py", line 168, in reload
    raise ModuleNotFoundError(f"spec not found for the module {name!r}", name=name)
ModuleNotFoundError: spec not found for the module 'cutils_ext'
]
arviz.InferenceData
    • <xarray.Dataset> Size: 63MB
      Dimensions:             (chain: 4, draw: 2000, y_model_dim_0: 976)
      Coordinates:
        * chain               (chain) int64 32B 0 1 2 3
        * draw                (draw) int64 16kB 0 1 2 3 4 ... 1995 1996 1997 1998 1999
        * y_model_dim_0       (y_model_dim_0) int64 8kB 0 1 2 3 4 ... 972 973 974 975
      Data variables:
          nbody_b1_T          (chain, draw) float64 64kB 2.443e+06 ... 2.443e+06
          nbody_b2_T          (chain, draw) float64 64kB 2.421e+06 ... 2.421e+06
          nbody_b1_m          (chain, draw) float64 64kB 0.002182 ... 0.002129
          nbody_b1_P          (chain, draw) float64 64kB 3.178e+03 ... 3.164e+03
          nbody_b1_e          (chain, draw) float64 64kB 0.04784 0.04784 ... 0.06181
          nbody_b1_omega      (chain, draw) float64 64kB 270.6 270.6 ... 264.1 264.1
          nbody_b2_m          (chain, draw) float64 64kB 0.00385 0.00385 ... 0.003835
          nbody_b2_P          (chain, draw) float64 64kB 8.27e+03 ... 8.248e+03
          nbody_b2_e          (chain, draw) float64 64kB 0.0188 0.0188 ... 0.01818
          nbody_b2_omega      (chain, draw) float64 64kB 140.7 140.7 ... 137.3 137.3
          nbody_central_mass  (chain, draw) float64 64kB 0.611 0.611 ... 0.611 0.611
          y_model             (chain, draw, y_model_dim_0) float64 62MB -0.0001653 ...
      Attributes:
          created_at:                 2026-03-12T09:21:18.869280+00:00
          arviz_version:              0.22.0
          inference_library:          pymc
          inference_library_version:  5.26.1
          sampling_time:              711.984785079956
          tuning_steps:               2000

    • <xarray.Dataset> Size: 216kB
      Dimensions:   (chain: 4, draw: 2000)
      Coordinates:
        * chain     (chain) int64 32B 0 1 2 3
        * draw      (draw) int64 16kB 0 1 2 3 4 5 6 ... 1994 1995 1996 1997 1998 1999
      Data variables:
          scaling   (chain, draw) float64 64kB 0.0006561 0.0006561 ... 0.0005314
          accept    (chain, draw) float64 64kB 0.001155 0.001107 ... 0.2729 0.2044
          accepted  (chain, draw) bool 8kB False False False ... True False False
          lambda    (chain, draw) float64 64kB 0.5322 0.5322 0.5322 ... 0.5322 0.5322
      Attributes:
          created_at:                 2026-03-12T09:21:18.954668+00:00
          arviz_version:              0.22.0
          inference_library:          pymc
          inference_library_version:  5.26.1
          sampling_time:              711.984785079956
          tuning_steps:               2000

    • <xarray.Dataset> Size: 16kB
      Dimensions:      (y_obs_dim_0: 976)
      Coordinates:
        * y_obs_dim_0  (y_obs_dim_0) int64 8kB 0 1 2 3 4 5 ... 970 971 972 973 974 975
      Data variables:
          y_obs        (y_obs_dim_0) float64 8kB -0.0002226 -0.0001086 ... 6.869e-05
      Attributes:
          created_at:                 2026-03-12T09:21:18.967686+00:00
          arviz_version:              0.22.0
          inference_library:          pymc
          inference_library_version:  5.26.1

../../../_images/48393982abf5ffb3b75d040e2586d87f5f78ccd380cb06978d836fb0170731fb.png
cleaned_res = oc.clean(res)
oc.corner(cleaned_res)
oc.plot(cleaned_res, extension_factor=0.05, model_components=models)
res
arviz.InferenceData
    • <xarray.Dataset> Size: 63MB
      Dimensions:             (chain: 4, draw: 2000, y_model_dim_0: 976)
      Coordinates:
        * chain               (chain) int64 32B 0 1 2 3
        * draw                (draw) int64 16kB 0 1 2 3 4 ... 1995 1996 1997 1998 1999
        * y_model_dim_0       (y_model_dim_0) int64 8kB 0 1 2 3 4 ... 972 973 974 975
      Data variables:
          nbody_b1_T          (chain, draw) float64 64kB 2.443e+06 ... 2.443e+06
          nbody_b2_T          (chain, draw) float64 64kB 2.421e+06 ... 2.421e+06
          nbody_b1_m          (chain, draw) float64 64kB 0.002182 ... 0.002129
          nbody_b1_P          (chain, draw) float64 64kB 3.178e+03 ... 3.164e+03
          nbody_b1_e          (chain, draw) float64 64kB 0.04784 0.04784 ... 0.06181
          nbody_b1_omega      (chain, draw) float64 64kB 270.6 270.6 ... 264.1 264.1
          nbody_b2_m          (chain, draw) float64 64kB 0.00385 0.00385 ... 0.003835
          nbody_b2_P          (chain, draw) float64 64kB 8.27e+03 ... 8.248e+03
          nbody_b2_e          (chain, draw) float64 64kB 0.0188 0.0188 ... 0.01818
          nbody_b2_omega      (chain, draw) float64 64kB 140.7 140.7 ... 137.3 137.3
          nbody_central_mass  (chain, draw) float64 64kB 0.611 0.611 ... 0.611 0.611
          y_model             (chain, draw, y_model_dim_0) float64 62MB -0.0001653 ...
      Attributes:
          created_at:                 2026-03-12T09:21:18.869280+00:00
          arviz_version:              0.22.0
          inference_library:          pymc
          inference_library_version:  5.26.1
          sampling_time:              711.984785079956
          tuning_steps:               2000

    • <xarray.Dataset> Size: 216kB
      Dimensions:   (chain: 4, draw: 2000)
      Coordinates:
        * chain     (chain) int64 32B 0 1 2 3
        * draw      (draw) int64 16kB 0 1 2 3 4 5 6 ... 1994 1995 1996 1997 1998 1999
      Data variables:
          scaling   (chain, draw) float64 64kB 0.0006561 0.0006561 ... 0.0005314
          accept    (chain, draw) float64 64kB 0.001155 0.001107 ... 0.2729 0.2044
          accepted  (chain, draw) bool 8kB False False False ... True False False
          lambda    (chain, draw) float64 64kB 0.5322 0.5322 0.5322 ... 0.5322 0.5322
      Attributes:
          created_at:                 2026-03-12T09:21:18.954668+00:00
          arviz_version:              0.22.0
          inference_library:          pymc
          inference_library_version:  5.26.1
          sampling_time:              711.984785079956
          tuning_steps:               2000

    • <xarray.Dataset> Size: 16kB
      Dimensions:      (y_obs_dim_0: 976)
      Coordinates:
        * y_obs_dim_0  (y_obs_dim_0) int64 8kB 0 1 2 3 4 5 ... 970 971 972 973 974 975
      Data variables:
          y_obs        (y_obs_dim_0) float64 8kB -0.0002226 -0.0001086 ... 6.869e-05
      Attributes:
          created_at:                 2026-03-12T09:21:18.967686+00:00
          arviz_version:              0.22.0
          inference_library:          pymc
          inference_library_version:  5.26.1

../../../_images/abba3d39a8e9e998cab5fc017925acf7731d25e08e33140d6578215d0d52b651.png ../../../_images/bfe10a831aa6ca9b590cdf92163fe2fd06c48d965c39515a407862f448be754c.png