%
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> 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 11                                                      <><>
%<><> Experimento: atrator de Lorenz                                   <><>
%<><> Objetivos 3                                                      <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

% Parametros do modelo
s = 10;
b = 8/3;
r_c = s*((s + b + 3)/(s - b - 1));
r = r_c + 5;
%r = 23;

% Pontos de equilibrio
Equilibrios = [0 , 0, 0; sqrt(b*(r-1)), sqrt(b*(r-1)), r-1; -sqrt(b*(r-1)), -sqrt(b*(r-1)), r-1];

% Definicao do sistema de Lorenz, dominio e condicao inicial
F = @(t,x) Lorenz(t,x,s,r,b);
t0 = 0;
tf = 200;

x0 = [16 ; 23 ; 31];

% Definicao do evento: passagem por uma bola
raio = 5;
centro = [0;0;20];
Bola = @(x,y,z) sqrt((x-centro(1))^2 + (y-centro(2))^2 + (z-centro(3))^2) - raio;
Evento = @(t,x) BolaEvento(t,x,raio,centro);

Options = odeset('events',Evento);

% Resolucao do modelo
[t,x,te,xe,ie] = ode45(F,[t0 tf],x0,Options);

% Representacao dos resultados
figure; hold on
plot3(x(:,1),x(:,2),x(:,3))
fimplicit3(Bola,'EdgeColor','none','FaceAlpha',.75)
axis square
title(sprintf('r = %g',r))
xlabel('x'); ylabel('y'); zlabel('z')

% Identificando entrada e saida da bola
Saida = ie == 2;
Entrada = ie == 1;

%TEntrada = te(Entrada);
TEntrada = te(1:2:end);
TSaida = te(2:2:end);
%TSaida = te(Saida);

% Computando tempo de permanencia na bola
M = min(length(TSaida),length(TEntrada));
TDentro = TSaida(1:M) - TEntrada(1:M);

% Computando tempo relatico de permanencia na bola
figure;
plot(TSaida,TDentro./tf)
ylim([0 0.02])

