%
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> 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 2                                                      <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

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

% 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);

dt = 0.01;
t0 = 0;
tf = 50;
x0 = [0;1;1];
 
% Definicao do evento: passagem pela secao |z| = r-1
Secao = @(t,x) SecaoTransversal1(t,x,r);
Options = odeset('events',Secao);
 
% Resolucao do modelo
[t,x,te,xe,ie] = ode45(F,[t0 tf],x0,Options);

% Intersecao de |z| = r-1 com |x|,|y| < sqrt(b(r-1))
NaSecao = max(abs(xe(:,1:2)),[],2) < sqrt(b*(r-1));
xS = xe(NaSecao,:);

% Representacao dos resultados
figure; hold on
plot3(x(:,1),x(:,2),x(:,3))
plot3(xS(:,1),xS(:,2),xS(:,3),'o r')
plot3(Equilibrios(:,1),Equilibrios(:,2),Equilibrios(:,3), 'g *')
title(sprintf('r = %g',r))
legend({'Orbita','Intersecao entre Orbita e S','Equilibrios'},'location','best')

figure; hold on
plot3(te(NaSecao),xS(:,1),xS(:,2),'*')
plot3(Equilibrios(:,1),Equilibrios(:,2),Equilibrios(:,3), 'g *')
xlabel('t'); ylabel('x'); zlabel('y')

