function [D,Dt]=diff_div_dist(X,Y) % % % diff_div_dist : calcul des différences divisées pour des points de supports distincts % % ********************************************************* % % [D,Dt]=diff_div_dist(X,Y) % les différences divisées sont calculées par l'algorithme % pyramidal donné en cours. % % variables d'entrées : % * X : contient les valeurs x_i, pour 0 <=i<=n (deux à deux distinctes) % * Y : contient les valeurs f(x_i), pour 0 <=i<=n % % variables de sortie % * D : contient les différences divisées % f[x_0], f[x_0,x_1], ...., f[x_0,x_1,...,x_n] % variables de sortie optionnelles : % * Dt: contient toutes les différences divisées : % - la première colonne, celles d'ordre 1 (f[x_i]=f(x_i)) % - la seconde (jusqu'à l'avant dernière valeur) celles d'ordre 1 (f[x_i,x_{i+1}]) % ... % - la dernière (uniquement la première), celle d'ordre n+1 (f[x_i,x_{i+1},...,x_{n+1}]) % % % ************ Fonctions auxiliaires utilisées ************ % % aucune % % ********************************************************* % % 2017 by Jérôme BASTIEN % Université Claude Bernard Lyon I, Polytech, Laboratoire LIBM, Villeurbanne % E-Mail : jerome.bastien@univ-lyon1.fr % % Contrôles d'entrée % % nombre d'arguments if nargin~=2 error('nombre d''arguments de la fonction incorrect'); end % taille des deux variables n=length(X)-1; np=length(Y)-1; if n~=np error('les deux tableaux n''ont pas la même taille'); end % vérification des éléments du support deux à deux disjoints % (si X non formel) if isnumeric(X) Z=sort(X); if min(diff(Z))==0 error('deux points du support sont égaux'); end end % Corps d'algorithme nout=nargout; if nout>=2 if isnumeric(X)&&isnumeric(Y) Dt=zeros(n+1,n+1); else Dt=sym(zeros(n+1,n+1)); end end D=Y; if nout>=2 Dt(:,1)=Y.'; end for i=1:n; j=i:n; D(j+1)=(D(j+1)-D(j))./(X(j+1)-X(j-i+1)); if nout>=2 Dt(1:n+1-i,i+1)=(D(i+1:n+1)).'; end end