% script demo_test_compar_methode : comparaison des différentes méthodes pour calculer un polynôme d'interpolation
%
%
% Ce script permet de comparer, en terme d'évaluation numérique et graphique 
% le polynôme interpolateur p_n d'une fonction f sur le support (x_i) où, pour 0<=i<=n, 
% on a x_i=a+i*(b-a)/n, avec a, b,  n et f donnée, en fonction des trois méthodes : 
% a) calcul en utilisant la forme de Newton et les différences divisées,
% b) calcul à partir des polynômes de Lagranges l_i.
% c) calcul à partir de la forme canonique de p_n
%
%
% ************ Fonctions auxiliaires utilisées ************
%  
%   saisiefonction, diff_div_dist, eval_horner, 
%   newton_cano, poly_eval_lagr
%
% *********************************************************

clear all;
a=input('Entrez l''abscisse minimale a : ');
b=input('Entrez l''abscisse maximale b : ');
pgra=input('Entrez le nombre de points pour le graphique : ');
f=saisiefonction;
n=input('Entrez l''entier n positif (égal au nombre de points oté de un) : ');
beton=0;
choixpoint='o';
xgra=a:(b-a)/pgra:b;
ygra=feval(f,xgra);
while(n>=0)
   if strcmp(choixpoint,'o')
      choixpoint=input('Afficher le support ? entrez o ou n : ','s');
   end   
   switch beton
      case 0
          choix=input('Conserver le graphique par calcul à partir de la forme canonique ? entrez o ou n : ','s');
          if strcmp(choix,'n')
             beton=1;
          end
      case 1
          choix=input('Conserver le graphique par calcul à partir des polynômes de Lagrange ? entrez o ou n : ','s');
          if strcmp(choix,'n')
             beton=2;
          end
   end
   if (n==0) 
      X=(a+b)/2;
   else
      X=a:(b-a)/n:b;
   end
   Y=feval(f,X);
   D=diff_div_dist(X,Y);
   ygranewton=eval_horner(xgra,X(1:end-1),D);
   ygralagrange=poly_eval_lagr(xgra,X,Y);
   P=newton_cano(D,X(1:end-1));
   ygracanonique=polyval(P,xgra);   
   clf;
   hold on;
   if (strcmp(choixpoint,'o'))
      switch beton
      case 0
		    plot(X,Y,'go',xgra,ygra,xgra,ygranewton,xgra,ygralagrange,xgra,ygracanonique);
            legend('Points du support','Fonction exacte','Newton','Lagrange','Canonique',0);
         case 1
	   	    plot(X,Y,'go',xgra,ygra,xgra,ygranewton,xgra,ygralagrange);
            legend('Points du support','Fonction exacte','Newton','Lagrange',0);
         case 2
		    plot(X,Y,'go',xgra,ygra,xgra,ygranewton);
   		   legend('Points du support','Fonction exacte','Newton',0);
      end
   else
      switch beton
      case 0
		    plot(xgra,ygra,xgra,ygranewton,xgra,ygralagrange,xgra,ygracanonique);
            legend('Fonction exacte','Newton','Lagrange','Canonique',0);
         case 1
	   	    plot(xgra,ygra,xgra,ygranewton,xgra,ygralagrange);
            legend('Fonction exacte','Newton','Lagrange',0);
         case 2
		   plot(xgra,ygra,xgra,ygranewton);
   		   legend('Fonction exacte','Newton',0);
      end
   end
   if exist(f)==1
      title(['interpolation de la fonction ',formula(f),' avec ',int2str(n+1),' points']);
   else
      title(['interpolation de la fonction ',f,' avec ',int2str(n+1),' points']);
   end
   hold off;
   n=input('pour continuer, entrez un nombre n positif (pour arrêter, le choisir négatif) : ');
end