three_body_ode, a FORTRAN90 code which simulates the solution of the planar three body problem.
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|^3assuming 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)|^3and 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 produced by the ODE solver will not be very accurate after that point.
The computer code and data files described and made available on this web page are distributed under the MIT license
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.
rkf45, a FORTRAN90 code which implements the Runge-Kutta-Fehlberg ODE solver.
two_body_ode, a FORTRAN90 code which simulates 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, creating graphics files for processing by gnuplot.
Original MATLAB version by Dominik Gruntz, Joerg Waldvogel; FORTRAN90 version by John Burkardt.