%
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> 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 8                                                       <><>
%<><> Experimento: Maior Expente de Lyapunov                           <><>
%<><> Objetivo 1                                                       <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

% Definicao de parametro

delta= 0.25;
alpha = 1;
beta = -1;
gamma = 0.4;
omega = 1;


System = @(t,z) Duffing(t,z,delta, alpha, beta, gamma, omega);

ti = 0;
tf = 1000;
h = 0.01;
t = ti:h:tf;

% Condicao inicial e perturbacao
d0 = 1e-10;

W0 = [0.2; 0 ; 0];
DeltaW0 = d0.*W0;
W0per = W0 + DeltaW0;

% Ignoramos primeiros iterados para reduzir efeito transiente e acelerar convergencia
ignore = 100;

% Alocacao de memoria para resultados de cada iteracao
[~,N] = size(t);
Le = zeros(N,1);

% Calculando Lambda_1 iterativamente
lsum = 0;

for i = 1:N
    
    [~,W1] = ode45(System,[0,h],W0);
    W1 = W1(end,:);
    [~,W1per] = ode45(System,[0,h],W0per);
    W1per = W1per(end,:);
    
    DeltaW1 = W1per - W1;
    d1 = sqrt(DeltaW1*DeltaW1');
    
    DeltaW1 = (d0/d1).*DeltaW1;
    
    W0 = W1;
    DeltaW0 = DeltaW1;
    W0per = W0 + DeltaW0;
    
    if i > ignore
    lsum = lsum + log(d1/d0);
    Le(i) = lsum/(i-ignore + 1);
    Le(i) = Le(i)/h;
    
    fprintf('i = %g    lsum = %g    Le = %f   \n',i,lsum,Le(i))   
    
    end
    
end

save('LLE_Duffing.mat')
