%
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> Codigo complementar do livro "Equacoes Diferenciais Ordinarias"  <><>
%<><> dos professores Marcelo Viana e Jose Espinar                     <><>
%<><>                                                                  <><>
%<><> Codigo escrito por Guilherme Tegoni Goedert                      <><>
%<><> https://git.impa.br/ggoedert/EDO/tree/master                     <><>
%<><> v 1.0 - 25/09/2016                                               <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> Capitulo 9                                                       <><>
%<><> Experimento: Problema de N-Corpos                                <><>
%<><> Objetivo 6                                                       <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

% Numero de Corpos
N = 3;
% Legendas de cores para os corpos; para mais de 9 corpos, favor completar este mapa de cores
Cor = [0 0 0;...    % Corpo 1 = preto
       1 0 0;...    % Corpo 2 = vermelho
       0 0 1;...    % Corpo 3 = azul
       0 1 0;...    % Corpo 4 = verde limao
       1 0.62 0;... % Corpo 5 = dourado
       0 1 1;...    % Corpo 6 = cyan
       1 0 1;...    % Corpo 7 = magenta
     0.5 0 0;...    % Corpo 8 = marrom
     0.5 0 0.5];    % Corpo 9 = roxo
        
% Intervalo de Integração
ti = 0;
tf = 1e7;

h = 2000;
hmin = 1000;
hmax = 5000;

% Massas dos Corpos
Massas = zeros(N,1);
Massas(1) = 1.988e30;   % Sol
Massas(2) = 5.973e24;   % Terra
Massas(3) = 7.347e22;   % Lua

% Condições iniciais na forma [x y z,  x' y' z']
Inicial = zeros(6,N);
Inicial(:,1) = [0 0 0,     0 0 0];
Inicial(:,2) = [1.496e11 0 0,    0  30200 0];
Inicial(:,3) = [1.496e11 + 3.781e8 0 0,      0  31276  0];

%Centro de Massa
CentroMassa = (Inicial*Massas)./sum(Massas);
Inicial = Inicial - [CentroMassa,CentroMassa,CentroMassa];

% Lei da Gravitação
G = 6.674408e-11;                       % Constante universal da gravitacao no sistema de unidades usado
F = @(t,x) Gravitacao(t,x,Massas,N,G);  % Parametrizacao da lei da gravitacao

Tol = 1e-6;
[t,Orbitas] = RKF45(ti,tf,Inicial,F,Tol,h,hmin,hmax);

% Resolucao e apresentacao de Resultados
Figura = figure('Position',[100 100 1200 500]);
subplot(1,2,1);
Eixo1 = gca;
subplot(1,2,2);
Eixo2 = gca;
for i = 1:20:length(t)
    % Apresentacao animada das Orbitas Sol-Terra-Lua
    hold(Eixo1,'off')
    for j = 1:N
        plot3(Eixo1,Orbitas(i,1,j),Orbitas(i,2,j),Orbitas(i,3,j),'o','Color',Cor(j,:))
        hold(Eixo1,'on')
        plot3(Eixo1,Orbitas(1:i,1,j),Orbitas(1:i,2,j),Orbitas(1:i,3,j),'--','Color',Cor(j,:))
    end
    xlabel(Eixo1,'x'); ylabel(Eixo1,'y'); zlabel(Eixo1,'z');
    title(Eixo1,sprintf('t = %g dias',t(i)/86400));
    grid(Eixo1,'on');
    legend(Eixo1,{'Sol atual','Sol passado','Terra atual','Terra passado','Lua atual','Lua passado'},'Location','southeast')
    
    % Apresentacao animada das Orbitas Terra-Lua
    hold(Eixo2,'off')
    plot3(Eixo2,Orbitas(i,1,2)-Orbitas(i,1,2),Orbitas(i,2,2)-Orbitas(i,2,2),Orbitas(i,3,2)-Orbitas(i,3,2),'o','Color',Cor(2,:))
    hold(Eixo2,'on')
    plot3(Eixo2,Orbitas(i,1,3)-Orbitas(i,1,2),Orbitas(i,2,3)-Orbitas(i,2,2),Orbitas(i,3,3)-Orbitas(i,3,2),'o','Color',Cor(3,:))
    plot3(Eixo2,Orbitas(1:i,1,2)-Orbitas(1:i,1,2),Orbitas(1:i,2,2)-Orbitas(1:i,2,2),Orbitas(1:i,3,2)-Orbitas(1:i,3,2),'--','Color',Cor(2,:))
    plot3(Eixo2,Orbitas(1:i,1,3)-Orbitas(1:i,1,2),Orbitas(1:i,2,3)-Orbitas(1:i,2,2),Orbitas(1:i,3,3)-Orbitas(1:i,3,2),'--','Color',Cor(3,:))
    
    xlabel(Eixo2,'x'); ylabel(Eixo2,'y'); zlabel(Eixo2,'z');
    title(Eixo2,sprintf('t = %g dias',t(i)/86400));
    grid(Eixo2,'on');
    
    % pausa para visualizar animacao
    pause(0.0001)
end
