# three_body_ode

three_body_ode, a MATLAB code which sets up and solves a set of ordinary differential equations (ODE) which simulates the behavior of three planets, constrained to lie in a plane, and moving under the influence of gravity, by Walter Gander and Jiri Hrebicek.

Three bodies, regarded as point masses, are constrained to lie in a plane. The masses of each body are given, as are the positions and velocities at a starting time T = 0. The bodies move in accordance with the gravitational force between them.

The force exerted on the 0-th body by the 1st body can be written:

```        F = - m0 m1 ( p0 - p1 ) / |p0 - p1|^3
```
assuming that units have been normalized to that the gravitational coefficient is 1. Newton's laws of motion can be written:
```
m0 p0'' = - m0 m1 ( p0 - p1 ) / |p0 - p1|^3
- m0 m2 ( p0 - p2 ) / |p0 - p2|^3

m1 p1'' = - m1 m0 ( p1 - p0 ) / |p1 - p0|^3
- m1 m2 ( p1 - p2 ) / |p1 - p2|^3

m2 p2'' = - m2 m0 ( p2 - p0 ) / |p2 - p0|^3
- m2 m1 ( p2 - p1 ) / |p2 - p1|^3
```

Letting

```        y1 = p0(x)
y2 = p0(y)
y3 = p0'(x)
y4 = p0'(y)
```
and using similar definitions for p1 and p2, the 3 second order vector equations can be rewritten as 12 first order equations. In particular, the first four are:
```        y1' = y3
y2' = y4
y3' = - m1 ( y1 - y5  ) / |(y1,y2) - (y5,y6) |^3
- m2 ( y1 - y9  ) / |(y1,y2) - (y9,y10)|^3
y4' = - m1 ( y2 - y6  ) / |(y1,y2) - (y5,y6) |^3
- m2 ( y2 - y10 ) / |(y1,y2) - (y9,y10)|^3
```
and so on. This first order system can be integrated by a standard ODE solver.

Note that when any two bodies come close together, the solution changes very rapidly, and very small steps must be taken by the ODE solver. For this system, the first near collision occurs around T=15.8299, and the results will not be very accurate after that point.

### Languages:

three_body_ode is available in a C version and a C++ version and a FORTRAN90 version and a MATLAB version and an Octave version and a Python version.

### Related Data and codes:

arenstorf_ode, a MATLAB code which sets up and solves an ordinary differential equation (ODE) which defines a stable periodic orbit of a spacecraft around the Earth and the Moon.

axon_ode, a MATLAB code which sets up and solves the ordinary differential equations (ODE) for the Hodgkin-Huxley model of an axon.

biochemical_linear_ode, a MATLAB code which sets up and solves a linear biochemical ordinary differential equation (ODE).

biochemical_nonlinear_ode, a MATLAB code which sets up and solves a nonlinear biochemical ordinary differential equation (ODE).

blowup_ode, a MATLAB code which sets up and solves an ordinary differential equation (ODE) y'=y^2. whose solution "blows up" in finite time.

brusselator_ode, a MATLAB code which sets up and solves the Brusselator ordinary differential equation (ODE) system.

conservation_ode, a MATLAB code which monitors the conservation of a quantity that should be constant, during the solution of an ordinary differential equation (ODE).

dosage_ode, a MATLAB code which sets up and solves a system of ordinary differential equations (ODE) to simulate the blood levels of a medicinal drug that should stay between medicinal and toxic limits.

duffing_ode, a MATLAB code which sets up and solves a second-order ordinary differential equation (ODE) whose solution can exhibit chaotic behavior.

exp_ode, a MATLAB code which sets up and solves an ordinary differential equation (ODE) whose solution is an exponential function.

fitzhugh_nagumo_ode, a MATLAB code which sets up and solves the Fitzhugh-Nagumo system of ordinary differential equations (ODE).

flame_ode, a MATLAB code which sets up and solves an ordinary differential equation (ODE) which models the growth of a ball of flame in a combustion process.

grazing_ode, a MATLAB code which sets up and solves a pair of ordinary differential equations (ODE) that model the populations of an edible plant, and the herbivore that grazes on it.

henon_heiles_ode, a MATLAB code which sets up and solves the Henon-Heiles system of ordinary differential equations (ODE) which model the motion of a star around the galactic center.

humps_ode, a MATLAB code which sets up and solves an ordinary differential equation (ODE) whose solution is a double hump curve.

kepler_ode, a MATLAB code which sets up and solves the ordinary differential equations (ODE) for a Kepler two body gravitational problem.

kepler_perturbed_ode, a MATLAB code which sets up and solves the ordinary differential equations (ODE) for a perturbed Kepler two body gravitational problem.

lorenz_ode, a MATLAB code which sets up and solves solutions to the Lorenz system of ordinary differential equations (ODE), which exhibit sensitive dependence on the initial conditions.

normal_ode, a MATLAB code which sets up and solves an ordinary differential equation (ODE) for the normal probability density function (PDF).

oregonator_ode, a MATLAB code which sets up and solves the ordinary differential equations (ODE) that define the Oregonator, a model of the Belousov-Zhabotinsky chemical reaction.

oscillator_ode, a MATLAB code which sets up and solves the highly oscillatory ordinary differential equation (ODE).

ozone_ode, a MATLAB code which sets up and solves a stiff system of four ordinary differential equations (ODE) that simulate the daily variation in atmospheric ozone concentration.

ozone2_ode, a MATLAB code which sets up and solves a stiff system of four ordinary differential equations (ODE) that simulate the daily variation in atmospheric ozone concentration. This version of the ozone ODE includes a nitrogen oxide source term.

pendulum_double_ode, a MATLAB code which sets up and solves the double pendulum ordinary differential equation (ODE).

pendulum_elastic_ode a MATLAB code which sets up and solves the ordinary differential equations (ODE) that represent the behavior of a nonlinear elastic pendulum, with gravitational force G, spring constant K, unstretched length L, and mass M.

pendulum_nonlinear_ode, a MATLAB code which sets up and solves the ordinary differential equations (ODE) that represent a nonlinear model ofthe behavior of a pendulum of length L under a gravitational force of strength G.

pendulum_ode, a MATLAB code which sets up and solves the ordinary differential equations (ODE) that represent a linear model ofthe behavior of a pendulum of length L under a gravitational force of strength G.

polar_ode, a MATLAB code which sets up and solves an ordinary differential equation (ODE) whose variable is complex, and whose solution should be viewed in a polar coordinate plot.

predator_prey_ode, a MATLAB code which sets up and solves a pair of predator prey ordinary differential equations (ODE).

quadex_ode, a MATLAB code which sets up and solves a stiff ordinary differential equation (ODE), whose exact solution is a parabola, but for which errors grow exponentially.

quasiperiodic_ode, a MATLAB code which sets up and solves a system of ordinary differential equations (ODE) for a problem with a quasiperiodic solution.

reaction_ode, a MATLAB code which sets up and solves the ordinary differential equations (ODE) which model a simple chemical reaction A+B --k--> C.

reaction_twoway_ode, a MATLAB code which sets up and solves the ordinary differential equations (ODE) which model a two-way chemical reaction between species W1 and W2.

rigid_body_ode, a MATLAB code which sets up and solves the ordinary differential equations (ODE) representing the Euler equations for a rigid body with three unequal moments of inertia, originally proposed by Fred Krogh.

ripple_ode a MATLAB code which sets up and solves an ordinary differential equation (ODE) whose family of solutions start as ripples and end as hyperbolas.

robertson_ode, a MATLAB code which sets up and solves a system of three nonlinear stiff ordinary differential equations (ODE) characterizing an autocatalytic chemical reaction.

roessler_ode, a MATLAB code which sets up and solves the Roessler ordinary differential equations (ODE) which exhibit chaotic behavior.

rubber_band_ode, a MATLAB code which sets up and solves a set of ordinary differential equations (ODE) describing a mass suspended by a spring and rubber band, which can exhibit chaotic behavior.

sawtooth_ode, a MATLAB code which sets up and solves an ordinary differential equation (ODE) driven by a right hand side which is a sawtooth function (periodic, discontinuous, piecewise linear).

sir_ode, a MATLAB code which sets up and solves the ordinary differential equations (ODE) which simulate the spread of a disease using the Susceptible/Infected/Recovered (SIR) model.

sling_ode, a MATLAB code which sets up and solves a system of ordinary differential equations (ODE) for which the exact circular solution can only be approximated for a short interval before it decays to zero.

spring_ode, a MATLAB code which sets up and solves a system of ordinary differential equations (ODE) for the motion of a spring with mass m, damping b, and stiffness k.

spring_double_ode, a MATLAB code which sets up and solves a system of ordinary differential equations (ODE) for a system in which a mass is connected by a spring to a mass connected by a spring to a fixed support.

spring_sweep_ode, a MATLAB code which computes a grid of solutions to a parameterized system of ordinary differential equations (ODE) that represent the motion of a spring with mass m, damping b, and stiffness k.

squircle_ode, a MATLAB code which sets up and solves a system of ordinary differential equations (ODE) for a pair of functions that generalize the sine and cosine, and whose phase portrait is a squircle (a sort of squared circle).

stetter_ode, a MATLAB code which sets up and solves an ordinary differential equation (ODE) for which a specific time step sequence causes the implicit trapezoid rule to be unstable, while the implicit midpoint rule will be stable. Note that the right hand side function f(t,y) is periodic, discontinuous, and piecewise linear.

stiff_ode, a MATLAB code which sets up and solves an ordinary differential equation (ODE) which is an example of a stiff ODE.

three_body_ode, a MATLAB code which sets up and solves a set of ordinary differential equations (ODE) which simulates the behavior of three planets, constrained to lie in a plane, and moving under the influence of gravity, by Walter Gander and Jiri Hrebicek.

tough_ode, a MATLAB code which sets up and solves a system of four ordinary differential equations (ODE) which is extremely difficult to solve accurately.

two_body_ode, a MATLAB code which sets up and solves ordinary differential equations (ODE) which simulate the behavior of two bodies, constrained to lie in a plane, moving under the influence of gravity, with one body much more massive than the other.

vanderpol_ode, a MATLAB code which sets up and solves the right hand side of the van der Pol oscillator ordinary differential equation (ODE).

zombie_ode, a MATLAB code which sets up and solves a system of ordinary differential equations (ODE) for a generalized SIR infection model to simulate a zombie attack, developed by Philip Munz.

### Author:

Original MATLAB version by Dominik Gruntz, Joerg Waldvogel.

### Reference:

1. Dominik Gruntz, Joerg Waldvogel,
Orbits in the Planar Three-Body Problem,
Walter Gander, Jiri Hrebicek, editors,
Solving Problems in Scientific Computing using Maple and Matlab,
Springer, 1997,
ISBN: 3-540-61793-0,
LC: Q183.9.G36.