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


%>>> Parametros de resolucao
ContadorMax = 25;

%>>> Definicao do sistema
F = @(t,x) x.^2; 

solucao = @(t) 1./(1-t);
erro = zeros(ContadorMax,1);

%>>> Condicoes iniciais
t0 = 0;                     
x0 = 1;                     

%>>> 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(abs(F(t0-delta:largura_malha:t0+delta,x0-delta:largura_malha:x0+delta)));


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

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

exata = solucao(t);

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

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

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

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


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

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