%
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> 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 2                                                       <><>
%<><> Experimento: Metodo de Picard                                    <><>
%<><> Objetivo 3 - resolvendo problema anterior                        <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>


%>>> Parametros de resolucao
ContadorMax = 5;

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

solucao = @(t) (1-t).*cos(t) + sin(t);
erro = zeros(ContadorMax,1);

%>>> Condicoes iniciais
t0 = 0;                     
x0 = [1,0];                     

%>>> Intervalo de definicao
% Raio da "caixa inicial" para definicao do intervalo de definicao
delta = 1;
% Largura da malha 
largura_malha = 0.01;

% Norma maxida da velocidade na caixa inicial
M = max(max(abs(F(t0-delta:largura_malha:t0+delta,meshgrid(x0(1)-delta:largura_malha:x0(1)+delta,x0(2)-delta:largura_malha:x0(2)+delta)))));


% Raio do intervalo de definicao
epsilon = min(delta, delta/M);

% Intervalo de definicao da solucao
N = 100;
t = linspace(t0 - epsilon, t0 + epsilon, N)';

exata = solucao(t);

%>>> Iteracao de Picard
% Curva inicial para iteracao
xi = repmat(x0,size(t));          

x = zeros([length(xi),2,ContadorMax]);
x(:,:,1) = xi;

erro(1) = max(abs(x(:,1,1) - exata));

% Definicao do metodo de integracao
%integrador = @(t,y) Retangulo2D(t,y,F);
integrador = @(t,y) Trapezio2D(t,y,F);


% Identificamos intervalos [t0 - epsilon, 0) e (0, t0 + epsilon]
Pos = t - t0 >= 0;
Neg = t - t0 < 0;

% Iterando Metodo de Picard
figure;
plot(t,x(:,1,1),'.-r',t,solucao(t))
for i = 2:ContadorMax
    
   % x(Neg,:,i) = flipud(flipud(xi(Neg,:)) + integrador(flipud(t(Neg)),flipud(x(Neg,:,i-1))));
    x(Pos,:,i) = xi(Pos,:) + integrador(t(Pos),x(Pos,:,i-1));
    
    erro(i) = max(abs(x(:,1,i) - exata));
    
    plot(t,x(:,1,i),'.-r',t,solucao(t))
    title(sprintf('n = %f',i))
    pause(0.5)
end

figure; plot(erro)
title('Erro')