function res=int_fcn(c,N,A,B,fcn,varargin)


%	int_fcn : calcul approché d'intégrale par méthode classique
%
% *********************************************************
%
%	res=int_fcn(c,N,A,B,fcn,varargin) renvoie la valeur approchée de l'intégrale
%    d'une fonction sur un intevalle par la méthodes des rectangles, des milieux,
%    des trapèzes ou de simpson.
%
%	variables d'entrées : 
%     * c définit la méthode : 
%            c=1 : méthode des rectangles,
%            c=2 : méthode des trapèzes,
%            c=3 : méthode des milieux,
%            c=4 : méthode de Simpson;
%     * N est le nombre de sous intervalles utilisés (correspondant à h=(B-A)/N)
%     * [A,B] est l'intervalle d'intégration
%     * fcn est une chaîne de caractère représentant la fonction 
%      (de type inline, builtin ou par fichier M-file);
%     * varargin sont les arguments optionnels de la fonction.
%       attention, intégration par rapport à la première variable de f.
%
%	variables de sortie
%     * res est la valeur approchée de l'intégrale calculée.
% 
% 
% ************ Fonctions auxiliaires utilisées ************
%
%       aucune
%
% *********************************************************
%



% Contrôles d'entrée
% nombre d'arguments
if (A>=B)
   error('il faut A<B');
end
if (fix(N)~=N) | (N <1)
   error('n doit être un entier naturel non nul');
end
if ~((c==1) | (c==2) | (c==3) | (c==4))
   error('c doit être un entier égal à 1, 2, 3 ou 4');
end
qs=exist(fcn);
if (qs~=2) & (qs~=5) & (qs~=1)
   error('fcn doit être le nom d''une fonction (built-in, M-file ou inline)');
end


h=(B-A)/N;
switch(c)
% calcul par la méthode des rectangles
   case(1)
      res=h*sum(feval(fcn,A:h:B-h,varargin{:}));
% calcul par la méthode des trapèzes (sans trapz)
   case(2)
      res=(h/2)*(feval(fcn,A,varargin{:})+feval(fcn,B,varargin{:})+...
           2*sum(feval(fcn,A+h:h:B-h,varargin{:})));     
% calcul par la méthode du point milieu
   case(3)
      res=h*sum(feval(fcn,A+h/2:h:B-h/2,varargin{:}));
% calcul par la méthode de Simpson
   case(4)
      res=(h/6)*(feval(fcn,A,varargin{:})+feval(fcn,B,varargin{:})+...
         2*sum(feval(fcn,A+h:h:B-h,varargin{:}))+...
         4*sum(feval(fcn,A+h/2:h:B-h/2,varargin{:})));
end