% interpol05.m
% interpolation de Lagrange 
% fd, agreg, 08 octobre 2006, 04 mars 2025 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   clear , format long
   
printf("interpol05 : erreurs d arrondis et convergence\n");

%  n  nombre de donnees brutes ; c est un nombre d intervalles...
%
nex = 200 ; deltax =  3*pi ;  dxex = deltax / nex  ;
xex =zeros(nex+1 , 1) ; yex =zeros(nex+1 , 1) ; 
for j=1:nex+1 ; xx =  (j-1)*dxex ;   
xex (j:j , 1) = xx ;  yex (j:j , 1) = sin(xx) ; end 


nmax = 40 %% 30
xexp = zeros (nmax , 1) ; zexp = zeros (nmax , 1) ;  
ztheo = zeros (nmax , 1) ; 
hold off ;   plot(0,0,"*g;;") ; hold off ;


for n = 1:nmax ; 
x =zeros(n+1 , 1) ; 
u0=zeros(n+1 , 1) ; 
dx =  deltax  / n ;
for j=1:n+1 ; xx = (j-1)*dx ;  
x (j:j , 1) = xx ;
u0(j:j , 1) =  sin(xx) ; end 
%             utilisation des fonctions usuelles de matlab  
%      [P, S] = polyfit (x, u0, n) ; 

%                        interpolation de Lagrange 'home made' 
newt=diffdiv(n,x,u0) ; 
% 
nn=nex ;  dy= deltax/nn ; 
xx =zeros(nn+1, 1) ; yy =zeros(nn+1, 1) ; 
for j=1:nn+1 ; xxx =  (j-1)*dy ;
xx (j:j , 1) = xxx ; 
yy(j:j,1) = evalpol(n,newt,x,xxx) ; end ;  
%  yy=polyval(P,xx) ; 

% calcul de l erreur d interpolation en norme l infini
err = 0; errth = log (deltax/4) ; 
for j=1:nex+1 ; 
err = max ( err , abs ( yex (j:j , 1) - yy (j:j , 1) ) ) ; 
end ;  
xexp (n:n,1) = n ;  
zexp (n:n,1) = log ( err ) / log (10) ; 
errth = n * log(deltax) - n ; 
for j=1:n ; errth = errth - log(j) ; end ; 
ztheo (n:n,1) = errth / log (10)  ;
hold on ;    
% plot( n  ,  zexp  ,"*r;;") ;   pause ; 
end ; 
hold off ; 
ylabel (' logarithme en base 10 de l erreur en norme L infini ') ;
plot( xexp  ,  zexp  ,"*r;erreur mesuree;" , ...
      xexp  ,  ztheo  ,"*b;erreur theorique;"  ) ;
axis ( [ .8 , nmax+.2 , -22.2 , 2.1  ]) ; 
title ('erreur entre la fonction sinus et ses interpoles de Lagrange') ;
print('05-erreurs-arrondis', '-djpg','-S891,630');
hold off 
