function y=LagrangeVecOpt(X,Y,x)
% NAME
%   LagrangeVecOpt
% USAGE
%   y=LagrangeVecOpt(X,Y,x)
% DESCRIPTION
%   Calcule, aux points x, le polynome d'interpolation de Lagrange, (*@$P_n$@*), 
%   associe aux n+1 points (X(i),Y(i)) en utilisant la version optimisee
% INPUTS
%   X : tableau de n+1 reels
%   Y : tableau de n+1 reels
%   x : tableau de m reels   
% RETURN VALUES
%   y : tableau de m reels tel que (*@$y(i)=P_n(x(i))$@*)
% EXAMPLE
%   X=0:pi/3:2*pi;Y=cos(X);x=0:pi/100:2*pi;
%   y=LagrangeVecOpt(X,Y,x);
% CREATION DATE
%   8 janvier 2013
% MODIFICATION HISTORY
%   None
% NOTES
%   1. Colle au plus pres a l'algorithme optimise mais
%      au niveau Matlab tres loin d'etre optimum! 
%   2. 
% AUTHOR
%   Cuvelier F., cuvelier@math.univ-paris13.fr
m=length(x);
N=length(X); % N=n+1
V=zeros(1,N); % contient les (*@$v'(x_i)@*)
for i=1:N % Calcul de V
  P=1;
  for j=[1:i-1,i+1:N]
    P=P*(X(i)-X(j));
  end
  V(i)=P;
end

y=zeros(size(x));
for i=1:m % Calcul de (*@$P_n(x(i))$@*)
  S1=0;
  S2=0;
  ie=0;   
  for j=1:N
    alpha=(x(i)-X(j))*V(j);
    if (alpha==0)
      ie=j;
      break
    else
      S1=S1+Y(j)/alpha;
      S2=S2+(1/alpha);
    end
  end
  if (ie==0)
    y(i)=S1/S2;
  else
    y(i)=Y(ie);
  end
end