% script demo_limite_diff_div: calcul et comparaisons de différences divisées par limite formelle et dérivation
%
%
% ************ Fonctions auxiliaires utilisées ************
%  
%     diff_div
%
% *********************************************************
%
%

% corps d'algorithme
clear all;
syms x0 x1 x2;
syms y0 y1 y2;
syms x;
f=sym('f(x)');
fp=diff(f);
fpp=diff(f,2);
y0=subs(f,x,x0);
y1=subs(f,x,x1);
y2=subs(f,x,x2);

% calcul avec les trois valeurs distinctes
disp(' ');
disp(' ');
disp('calcul avec les trois valeurs distinctes');
disp('valeurs des trois différences divisées f[x0],f[x0,x1],f[x0,x1,x2]');
disp(' ');
D=diff_div([x0 x1 x2],[y0 y1 y2]);
pretty(D);
disp(' ');
disp(' ');
disp('appuyez sur une touche pour continuer');
pause;

% calcul avec deux valeurs égales et une distincte 
% premier calcul
disp(' ');
disp(' ');
disp('premier calcul avec deux valeurs égales et une autre distinctes (x2=x1 et x0~=x1)');
disp('valeurs des trois différences divisées f[x0],f[x0,x1],f[x0,x0,x1]');
disp(' ');
D1A=simplify(limit(D,x2,x1));
D1B=simplify(diff_div([x0 x1 x1],[y0 y1 subs(fp,x,x1)]));
disp('calcul par passage à la limite');
pretty(D1A);
disp('calcul par utilisation de diff_div');
pretty(D1B);
disp('comparaison entre les deux expressions');
disp(simplify(D1A-D1B));
disp(' ');
disp(' ');
disp('appuyez sur une touche pour continuer');
pause;

% second calcul
disp(' ');
disp(' ');
disp('second calcul avec deux valeurs égales et une autre distinctes (x0=x1 et x2~=x1)');
disp('valeurs des trois différences divisées f[x0],f[x0,x0],f[x0,x0,x2]');
disp(' ');
D1C=simplify(limit(D,x1,x0));
D1D=simplify(diff_div([x0 x0 x2],[y0 subs(fp,x,x0) y2]));
disp('calcul par passage à la limite');
pretty(D1C);
disp('calcul par utilisation de diff_div');
pretty(D1D);
disp('comparaison entre les deux expressions');
disp(simplify(D1C-D1D));
disp(' ');
disp(' ');
disp('appuyez sur une touche pour continuer');
pause;

% calcul avec les trois valeurs égales 
disp(' ');
disp(' ');
disp('calcul avec les valeurs égales  (x0=x1=x2)');
disp('valeurs des trois différences divisées f[x0],f[x0,x0],f[x0,x0,x0]');
disp(' ');
D2A=simplify(limit(limit(D,x2,x1),x1,x0));
D2B=simplify(diff_div([x0 x0 x0],[y0 subs(fp,x,x0) subs(fpp,x,x0)]));
disp('calcul par passage à la limite');
pretty(D2A);
disp('calcul par utilisation de diff_div');
pretty(D2B);
disp('comparaison entre les deux expressions');
disp(simplify(D2A-D2B));
disp(' ');
disp(' ');
disp('appuyez sur une touche pour continuer');
pause;

% un calcul de dérivée 
disp(' ');
disp(' ');
disp('calcul de la derivee de F : x-> f[x0,x1,x]');
disp(' ');
dodo=diff_div([x0 x1 x],[y0 y1 f]);
F=dodo(3);
D3A=simplify(diff(F,x));
dudu=diff_div([x0 x1 x x],[y0 y1 f fp]);
D3B=simplify(dudu(4));
disp('expression de F''(x)');
pretty(D3A);
disp('appuyez sur une touche pour continuer');
pause;
disp('expression de f[x0,x1,x,x]');
pretty(D3B);
disp(' ');
disp('comparaison entre les deux expressions');
disp(simplify(D3A-D3B));
disp(' ');
disp(' ');
disp('appuyez sur une touche pour continuer');
pause;

% dernier calcul : erreur !! 
disp('essai de calcul de f[x0],f[x0,x1],f[x0,x1,x1] par substitution maladroite');
pretty(subs(D,x2,x1));