In: Physics
Write a Matlab code that simulates three-
body problem with any given masses, initial positions and
velocities. Also give a set of data that
generates an interesting orbit.
%% SIMPLE_ODE113 solves the three body problem using MATLAB's ODE113.
%
% Discussion:
%
% 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 produced by MATLAB's ode113 will not be very accurate after
% that point.
%
% Modified:
%
% 03 April 2011
%
% Author:
%
% Dominik Gruntz, Joerg Waldvogel
%
% Reference:
%
% Dominik Gruntz, Joerg Waldvogel,
% "Orbits in the Planar Three-Body Problem",
% Walter Gander, Jiri Hrebicek,
% Solving Problems in Scientific Computing using Maple and Matlab,
% Springer, 1997,
% ISBN: 3-540-61793-0,
% LC: Q183.9.G36.
%
global m0 m1 m2
timestamp ( );
fprintf ( 1, '\n' );
fprintf ( 1, 'SIMPLE_ODE113:\n' );
fprintf ( 1, ' A simple formulation of the planar three-body problem.\n' );
fprintf ( 1, ' This program uses ODE113 for the ODE solver.\n' );
%
% Set the masses.
%
m0 = 5.0;
m1 = 3.0;
m2 = 4.0;
%
% Set the time range.
%
t_initial = 0.0;
t_final = 63.0;
t_range = [ t_initial, t_final ];
%
% For bodies 1, 2, and 3, give initial values for:
% (X,Y) position,
% (X,Y) velocity.
%
x_initial = [ 1.0; -1.0; 0.0; 0.0;
1.0; 3.0; 0.0; 0.0;
-2.0; -1.0; 0.0; 0.0 ];
%
% Set error tolerances.
%
options = odeset ( 'RelTol', 1.0e-10, 'AbsTol', 1.0E-10 );
%
% Integrate the ODE.
%
[ T1, Y1 ] = ode113 ( 'simple_f', t_range, x_initial, options );
%
% Display the results.
%
figure ( 1 )
[ ~, i10 ] = min ( abs ( T1 - 10.0 ) );
R1 = 1 : i10;
plot ( Y1(R1,1), Y1(R1,2), 'b.', ...
Y1(R1,5), Y1(R1,6), 'r.', ...
Y1(R1,9), Y1(R1,10), 'g.' )
title ( '0 <= T <= 10' )
figure ( 2 )
[ ~, i20 ] = min ( abs ( T1 - 20.0 ) );
R2 = i10 : i20;
plot ( Y1(R2,1), Y1(R2,2), 'b.', ...
Y1(R2,5), Y1(R2,6), 'r.', ...
Y1(R2,9), Y1(R2,10), 'g.' )
title ( '10 <= T <= 20' )
figure ( 3 )
[ ~, i50 ] = min ( abs ( T1 - 50.0 ) );
i63 = length ( T1 );
R3 = i50 : i63;
plot ( Y1(R3,1), Y1(R3,2), 'b.', ...
Y1(R3,5), Y1(R3,6), 'r.', ...
Y1(R3,9), Y1(R3,10), 'g.' )
title ( '50 <= T <= 63' )
figure ( 4 )
R4 = 1 : i63;
plot ( Y1(R4,1), Y1(R4,2), 'b.', ...
Y1(R4,5), Y1(R4,6), 'r.', ...
Y1(R4,9), Y1(R4,10), 'g.' )
title ( '0 <= T <= 63' )
fprintf ( 1, '\n' );
fprintf ( 1, 'SIMPLE_ODE113:\n' );
fprintf ( 1, ' Normal end of execution.\n' );
fprintf ( 1, '\n' );
timestamp ( );
please rate it up thanks ;)