%
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> 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 4                                                       <><>
%<><> Experimento: Curvas de Nivel                                     <><>
%<><> Objetivo 3                                                       <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

t0 = 0;             % Tempo inicial
tf = 10;            % Tempo final
h = 0.01;           % Passo de tempo;

% Condicoes iniciais
x0 = 1;             % Populacao inicial da presa
y0 = 0.5;           % Populacao inicial do predador
z0 = [x0,y0];

% Parametros do modelo
A = -1;
B = -1;
C = 1;
D = 1;

% Primeira integral de Lotka-Volterra
Sol = @(x,y) Sol_LoktaVolterra(x,y,A,B,C,D);
const = Sol(z0(1),z0(2));

% Definindo eq. diferencial
F = @(t,z) GradPerp_LotkaVolterra(t,z,A,B,C,D);

% Resolvendo usando os diferentes metodos
% Metodo de Euler
tic
z1 = Euler(t0,tf,h,z0,F);
t1 = toc;
Erro1 = max(abs(Sol(z1(:,1),z1(:,2)) - const));

% Metodo de Taylor Ordem 2
F1 = @(t,z) LotkaVolterra_F1(t,z,A,B,C,D);
tic
z2 = Taylor2(t0,tf,h,z0,F,F1);
t2 = toc;
Erro2 = max(abs(Sol(z2(:,1),z2(:,2)) - const));

% Metodo de Taylor Ordem 3
F2 = @(t,z) LotkaVolterra_F2(t,z,A,B,C,D);
tic
z3 = Taylor3(t0,tf,h,z0,F,F1,F2);
t3 = toc;
Erro3 = max(abs(Sol(z3(:,1),z3(:,2)) - const));

% Metodo de Heun
tic
z4 = Heun(t0,tf,h,z0,F);
t4 = toc;
Erro4 = max(abs(Sol(z4(:,1),z4(:,2)) - const));

% Metodo de RK3
tic
z5 = RK3(t0,tf,h,z0,F);
t5 = toc;
Erro5 = max(abs(Sol(z5(:,1),z5(:,2)) - const));

% Metodo RK4
tic
z6 = RK4(t0,tf,h,z0,F);
t6 = toc;
Erro6 = max(abs(Sol(z6(:,1),z6(:,2)) - const));


% Representacao Grafica dos Resultados
Metodos = categorical({'Euler','Taylor o2','Taylor o3','Heun','RK3','RK4'});

figure;
bar(Metodos,[t1,t2,t3,t4,t5,t6])
ylabel('tempo (s)');
xlabel('1-Euler; 2-Taylor o2; 3-Taylor o3; 4-Heun; 5-RK3; 6-RK4')

figure
bar(Metodos,log([Erro1,Erro2,Erro3,Erro4,Erro5,Erro6]))
ylabel('log(Erro)')
xlabel('1-Euler; 2-Taylor o2; 3-Taylor o3; 4-Heun; 5-RK3; 6-RK4')