%
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> Codigo complementar do livro "Equacoes Diferenciais Ordinarias"  <><>
%<><> dos professores Marcelo Viana e Jose Espinar                     <><>
%<><>                                                                  <><>
%<><> Codigo escrito por Guilherme Tegoni Goedert e Marcelo Viana      <><>
%<><> https://git.impa.br/ggoedert/EDO/tree/master                     <><>
%<><> v 2.0 - 17/06/2018                                               <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
%<><> Capitulo 5                                                       <><>
%<><> Experimento: Circuitos Eletricos                                 <><>
%<><> Objetivo 1                                                       <><>
%<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>

function [t,x] = RKF45(ti,tf,hi,xi,F,Tol)

% valores minimo e maximo para o passo
hmin = 1e-3;
hmax = 5e-1;

% condicoes iniciais
tn = ti;
xn = xi;
hn = hi;

% inicializando a solucao
t = ti;
x = xi;

% aplicando o metodo RKF45
while tn <= tf
   
   [x4,x5] = RKF45Passo(tn,hn,xn,F);    % iteracao do metodo RKF45
   E = norm(x4-x5);                     % estimativa do erro

% caso em que o erro esta abaixo da tolerancia   
   if E <= Tol/2
     
       tn = tn + hn;                    % novo valor do tempo 
       xn = x4;                         % novo valor da solucao
 
       t = [t;tn];                      % atualizando o tempo
       x = [x;xn];                      % atualizando a solucao
 
       hn = ((Tol/(2.*E)).^(1/4)).*hn;  % aumentando o passo
       
       if hn > hmax                     % protecao contra passo grande
          hn = hmax;
       end
       
% caso em que o erro esta acima da tolerancia    
   else 
       
       hn = ((Tol/(2.*E))^(1/4))*hn;    % diminuindo o passo

       if hn < hmin                     % protecao contra passo pequeno
          hn = hmin;
       end
       
      [x4,x5] = RKF45Passo(tn,hn,xn,F); % aplicando RKF45 com o novo passo
           
       tn = tn + hn;                    % novo valor do tempo 
       xn = x4;                         % novo valor da solucao
 
       t = [t;tn];                      % atualizando o tempo
       x = [x;xn];                      % atualizando a solucao
          
   end
       
end