function res=deriv_app(k,n,x,y,X)
% fournit une valeur approchée de dérivée d'ordre k avec un polynome de degré n
% 
% variables d'entrée
% k est un entier naturel qui désigne l'ordre de dérivation demandé
% n est un entier désignant le degré du polynome d'interpolation utilisé pour
% la dérivation approchée.
% Selon la parité de n,
% f est supposée donnée en x=(x0,...,xn) centrés autour de t,
% par les valeurs y=(y0,...,yn) via yi=f(xi).
% X désigne l'indéterminée classique.
% 
% variable de sortie
% le résultat res uniquement défini comme un symbolique.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                       Fonctions connexes appelées
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
global d base;
syms t h real;

% tests d'entrée
if nargin~=5
    error('Nombre des arguments incorrect');
end

% effectué en amont... On peut choisir un autre style.

% algorithme proprement dit


% calcul du polynome interpolant adapté aux choix effectués
% et calcul de sa dérivée formelle
util=d(1:n+1)*(base(1:n+1))';
deriv=diff(util,'X',k);

% détermination du support centré selon parité de n
% sachant qu'il y a n+1 points au support.
if (2*fix(n/2)==n)
    % n est pair
    % détermination du centre parmi les valeurs xi
    c=n/2+1;
    
    % écriture des centres
    xcentre(c)=t;
    for i=n/2:-1:1,
        xcentre(c-i)=t-i*h;xcentre(c+i)=t+i*h;
    end
else
    % n est impair
    sup=(n+1)/2;
    for i=1:sup,
        xcentre(i)=t-(sup-i+1)*h;xcentre(n+2-i)=t+(sup-i+1)*h;
    end
end

% valeur approchée de la dérivée en fonction des valeurs centrées
res1=simple(subs(deriv,x(1:n+1),xcentre));

% sortie des résultats
disp('Les valeurs considérées en x sont :');
disp(x(1:n+1));
disp('soit encore, une fois centrées :');
disp(xcentre);
disp('auxquelles correspondent respectivement en f(x):');
disp(y(1:n+1));
sor=[];
if (2*fix(n/2)==n)
    sor=sprintf([sor '=D%df(t=x%d)'],k,c-1);
end
ch=sprintf(['La valeur approchée de D%df(t)' sor ' est,'],k);
disp(ch);
disp('sous forme classique :');
pretty(simple(subs(res1,X,t)));
res=simple(subs(res1,X,t));





