%
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> 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 3                                                       <><>
%<><> Experimento: Continuacao de Solucoes                             <><>
%<><> Objetivos 1 e 2                                                  <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

%> Definicao do sistema
F = @(t,x) Airy(t,x);

%> Definindo domínio da solução
t_inicial = -15;
t_final = 3;

%> Condicoes Iniciais
x_inicial = zeros(1,2);
x_inicial(1) = 0;
x_inicial(2) = 1;

% Definindo dominio de resolucao
delta = 15;
M = delta^2;
epsilon = min(delta,delta/M);

t_segmentos = (t_inicial : epsilon : t_final)'; 

%> Parametros de resolucao
Tol = 1e-6;             % Tolerancio do metodo
ContadorMax = 500;      % Numero maximo de iteracoes permitidas em cada passo da extensao
L = 10;                 % Quantidade de pontos em cada seguimento

%>> Resolvendo Picard e extendendo Dominio

% Resolvendo primeiro segmento da solucao
t = linspace(t_segmentos(1),t_segmentos(2),L)';
xi = ones(size(t))*x_inicial;

xold = xi;
Erro = 1;
contador = 0;
while Erro > Tol

    x = Picard(t,xi,xold,F);

    dif = x - xold;
    Erro = max(sqrt(dif(:,1).^2 + dif(:,2).^2));

    xold = x;

    contador = contador + 1;
    if contador > ContadorMax
        break
    end
    Ct = contador;
end

% Extendendo dominio e resolvendo
for i = 3:length(t_segmentos)
    
    t_novo = linspace(t_segmentos(i-1),t_segmentos(i),L)';
    t = [t(1:end-1);t_novo];
    xi = [ones(size(t))*x_inicial];
    
    xold = [xold(1:end-1,:);ones(size(t_novo))*xold(end,:)];
   
    Erro = 1;
    contador = 0;
    while Erro > Tol

        x = Picard(t,xi,xold,F);

        dif = x - xold;
        Erro = max(sqrt(dif(:,1).^2 + dif(:,2).^2));

        xold = x;

        contador = contador + 1;
        if contador > ContadorMax
            break
        end
    
    end
    Ct = [Ct,contador];

end

figure; plot(t,x(:,1))
xlabel('t');
ylabel('x')