Skip to main content

A JAX simulator for N body problems.

Project description

NBODYX: Simulating N-Body Systems with Jax

This repository derives ODEs for N-Body systems and simulates them using Jax. The main goal is to provide a simple and efficient way to simulate N-Body systems using Jax. It is heavily inspired by the amazing ThreeBodyBot and specifically the NumericsTutorial.

3-body problem

Installation

You can install the package using pip:

pip install nbodyx

or locally in editable mode:

pip install -e .

For animations, we require ffmpeg to be installed. On Ubuntu, you can install it using:

sudo apt-get install ffmpeg

or using conda:

conda install -c conda-forge ffmpeg

Usage

The following example simulates a 3-body system:

from diffrax import diffeqsolve, Dopri5, ODETerm, SaveAt
import jax.numpy as jnp
from nbodyx.constants import G
from nbodyx.ode import make_n_body_ode
from nbodyx.rendering.opencv import animate_n_body, render_n_body

if __name__ == "__main__":
    body_masses = jnp.array([1.0, 1.0, 1.0]) / G
    ode_fn = make_n_body_ode(body_masses)

    # initial positions
    x0 = jnp.array(
        [
            [-0.97000436, 0.24208753],
            [0.0, 0.0],
            [0.97000436, -0.24208753],
        ]
    )
    # initial velocities
    v0 = jnp.array(
        [
            [0.4662036850, 0.4323657300],
            [-0.93240737, -0.86473146],
            [0.4662036850, 0.4323657300],
        ]
    )

    # initial state
    y0 = jnp.stack([x0, v0], axis=0).reshape(-1)
    # external torques
    tau = jnp.zeros((6,))

    # state bounds
    x_min, x_max = -1.5 * jnp.ones((1,)), 1.5 * jnp.ones((1,))

    # simulation settings
    duration = 6.3259  # duration of the simulation [s]
    ts = jnp.linspace(0.0, duration, 1001)
    dt = 2e-4  # time step [s]

    # solve the ODE
    ode_term = ODETerm(ode_fn)
    sol = diffeqsolve(ode_term, Dopri5(), ts[0], ts[-1], dt, y0, tau, saveat=SaveAt(ts=ts), max_steps=None)
    # extract the solution
    y_bds_ts = sol.ys.reshape((len(ts), 2, 3, 2))  # shape: (timesteps, 2, num_bodies, num_dims)

    # animate the solution
    animate_n_body(
        ts,
        x_bds_ts=y_bds_ts[:, 0, ...],
        width=500,
        height=500,
        video_path="examples/outputs/three_body.mp4",
        speed_up=ts[-1] / 10,
        x_min=x_min,
        x_max=x_max,
        timestamp_unit="s",
    )

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nbodyx-0.0.1rc56.post1.tar.gz (1.2 MB view details)

Uploaded Source

Built Distribution

nbodyx-0.0.1rc56.post1-py3-none-any.whl (6.0 kB view details)

Uploaded Python 3

File details

Details for the file nbodyx-0.0.1rc56.post1.tar.gz.

File metadata

  • Download URL: nbodyx-0.0.1rc56.post1.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.31.0

File hashes

Hashes for nbodyx-0.0.1rc56.post1.tar.gz
Algorithm Hash digest
SHA256 204c4b2a08b9e3057544680c5ce6e94033fa61af84e7515af37fb7549fb7c3e3
MD5 88b27c81963718ff41e5261e22869dcb
BLAKE2b-256 e6294ba49c4f04e27c390b2590dea0fb109f5ab394c80839d366faba500e02f5

See more details on using hashes here.

File details

Details for the file nbodyx-0.0.1rc56.post1-py3-none-any.whl.

File metadata

File hashes

Hashes for nbodyx-0.0.1rc56.post1-py3-none-any.whl
Algorithm Hash digest
SHA256 18757c61c33c1bcc7eafe7e559473762d170ba8d54b5c86056242581c3888617
MD5 441b797a151577fa86d4f37bc61a8549
BLAKE2b-256 a5a999bb2472678b480c35d6036259da030a27a6b40c2c2565643235fb0c581e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page