%  Multirresolución con IAC y técnica ENO.
%    capiaiamccentradou(xx,ff,nl,nr,grau,nivells)
%    Entradas:
%           xx       = nodos de la funcion inicial
%           ff       = f(xx)
%           nl       = numero de nodos a la izquierda de f^{k}_{2i-1} donde aproximamos
%           nr       = numero de nodos a la derecha de f^{k}_{2i-1} donde aproximamos          
%           grau     = grado del polinomio para F (grau-1 para f)
%           nivells  = niveles de multiresolucion 
%    Salida:
%           Plot de la reconstruccion(-), funcion en el nivel mas grosero(o), funcion original con mas nodos (--), diferencia original y aproximacion(:) 
%
% Autor: José Jaime Noguera    +INFO: www.uv.es/anims/noguera

function capiaiamcenou(xx,ff,nl,nr,grau,nivells)
grau=grau-1; %por concordancia con el PDF
nivells=nivells+1;
[xn,xm]=size(xx);
n=log(xm)/log(2);
f=zeros(nivells,xm);
x=zeros(nivells,xm);
f(nivells,1:xm)=ff(1:xm);
x(nivells,1:xm)=xx(1:xm);
hold on
ntot=nl+nr+1;

%BAJAMOS NIVELES
for k=nivells:-1:2   
   for i=1:2^(n-(nivells-k+1))
      f(k-1,i)=(1/2)*(f(k,2*i-1)+f(k,2*i));
      x(k-1,i)=(x(k,2*i)+x(k,2*i-1))/2;
   end 
end
    
  fr=zeros(nivells,xm);
  fr(1,1:2^(n-(nivells-1)))=f(1,1:2^(n-(nivells-1)));

%SUBIMOS NIVELES
for k=2:nivells
     ultim=2^(n-(nivells-k+1));
    
   %%%%%%%%%%%%ENO%%%%%%%%%%%%%%%%
   for i=1:ultim
      for l=1:ntot
           if(i+l-1<=ultim && i-ntot+l>0)
                  dd=difdiv(x(k-1,i-ntot+l:i+l-1),fr(k-1,i-ntot+l:i+l-1),ntot);
                  dif(l)=abs(dd(ntot,ntot));
           else
                  dif(l)=1e100;  %le doy un valor excesivo para tocar menos codigo en el tratamiento de fronteras  
           end
      end
      [minim,pos]=min(dif(1:ntot));
      vnl(k,i)=ntot-pos; %num nodos a la izquierda de f^{k}_{2i-1} para ENO
      vnr(k,i)=nl+nr-vnl(k,i);
   end
   %%%%FIN ENO%%%%%%%%%%%%%%%%%   
     
   for i=1:ultim
        fr(k,2*i-1)=capiacoefiiamcsol(vnl(k,i),vnr(k,i),grau)*[fr(k-1,i-vnl(k,i):i+vnr(k,i))]';  
        fr(k,2*i)=2*fr(k-1,i)-fr(k,2*i-1);
   end     
end   

[xor,yor]=funtesi(256,0); 

hold on
plot(xor, yor,'--k','LineWidth',2)                                         %original discretizada con 256 pts 
plot(x(1,1:2^(n-(nivells-2+1))),f(1,1:2^(n-(nivells-2+1))),'ko')           %original en el nivel mas grosero
plot(xx,(ff-fr(nivells,1:xm))-(0.1)*ones(1,xm),':k','LineWidth',3)         %original-reconstruccion
plot(xx,fr(nivells,1:xm),'-k','LineWidth',3)                               %reconstruccion
axis([0 1 -0.2 1.1 ]);
set(gca,'Xtick',[0 .5 1], 'FontSize',15)
set(gca,'Ytick',[0 .5 1], 'FontSize',15)
box
hold off
    
