function threePlanets()

When three or more bodies interact gravitationally according to Newton's laws, the resulting orbits can be wonderfully complicated. This example explores a special case in which the initial configuration has the three planets stationary at the positions of a 3-4-5 right triangle and the planets attract each other with pairwise $1/r^2$ forces.

To solve the problem, we use Chebfun's backslash command in the standard manner (which invokes the MATLAB ode113 command to do the time-stepping). Complex arithmetic is used for brevity. We solve the problem over a time interval of length 100, and the solution reveals a beautiful property: the orbit is chaotic for $t < t_c \approx 86$, but then at time $t = t_c$ the system "self-ionizes". After this point one planet goes off in one direction and the other two go off as a pair in the opposite direction. Such a thing could never happen with just two planets, but with three it is possible: energy and momentum are conserved. Thus this dynamical system illustrates the phenomenon of transient chaos.

This Example is modeled after the code planets.m in [1]. The second author first heard of the example from Oxford's astrophysicist James Binney.

To have some fun with this problem, it's nice to plot the configurations on a black background with a collection of "stars" at random locations. The code plotframe does this. Here is our initial condition:

x0 = 0; y0 = 3; z0 = 4i;
MS = 'markersize'; FS = 'fontsize';
title('t = 0',FS,18)

Now we solve the problem to time $t=100$:

tmax = 100; dom = [0 tmax];
N = chebop(@planetfun, dom);
N.lbc = @(x,y,z) [x-x0; y-y0; z-z0; diff(x); diff(y); diff(z)];
[x,y,z] = N\0;
Warning: Function not resolved using 65537 pts. Have you tried 'splitting on'? 

Here is a typical configuration for $t < t_c$:

t = 50;
title(['t = ' num2str(t) ],FS,18)

Here is how it looks at the critical moment:

t = 86;
title(['t = ' num2str(t) ],FS,18)

Of course, this problem really looks best in the form of movie! To see the movie, you can execute this M-file. The final frame shows the system after it has split into two subsystems, drifting apart forever.

dt = .4; tmax = 100;
for t = 0:dt:tmax
    title(sprintf('t = %3.0f',t),FS,18),
    drawnow, pause(0.1)


  1. L.N. Trefethen, Ten digit algorithms, unpublished essay,, 2005.
function plotframe(x,y,z)
MS = 'markersize';
% Set the mood by plotting some "stars":
fill(20*[-1 1 1 -1 -1],20*[-1 -1 1 1 -1],'k')
hold on, grid on, axis([1.27*[-6.3 4.7] -3.5 7.5])
xStars = 15*rand(250,1)-8; yStars = 11*rand(250,1)-3.5;
% Locate the three planets.
xh = plot(real(x),imag(x),'.r',MS,35);
yh = plot(real(y),imag(y),'.y',MS,35);
zh = plot(real(z),imag(z),'.g',MS,35);
axis off, hold off

function out = planetfun(t, x, y, z)
forceYX = (y - x)./abs(y - x).^3;
forceZX = (z - x)./abs(z - x).^3;
forceZY = (z - y)./abs(z - y).^3;
out = [diff(x, 2) - forceYX - forceZX;
    diff(y, 2) + forceYX - forceZY;
    diff(z, 2) + forceZX + forceZY];