//TP3 L3 Anum

//Exercice 1 : Interpolation de Lagrange

//On propose ici de coder l'interpolation de Lagrange en utilisant les 3 méthodes. Une seule était demandée
//Base canonique, système linéaire.
function [coef,P]=LagrangeSyst(X,Y,t)
//calcule la valeur en t (eventuellement vecteur) du pol de Lagrange calculé par le syst lineaire aux noeuds (X,Y)
//fabrication de la matrice de Vandermonde, X et Y sont des vecteurs LIGNE.
V=ones(X');
N=length(X);
for i=1:N-1
    V=[V X'.^i]
end
//resolution du syst donne les coeff de P
coef=V\Y';
//calcul de P(t)
P=zeros(t)
for i=1:N
    P=P+coef(i)*t.^(i-1)
end
endfunction
 
//forme de Lagrange
//baselagrange(X,Y,t,i) evalue en t le ieme polynome de la base de lagrange associée aux noeuds X
function Li=baselagrange(X,t,i)
    Li=1;
    N=length(X)
    for j=1:N
        if (j==i), then Li=Li
        else 
            Li=Li.*(t-X(j))/(X(i)-X(j))
        end
    end
endfunction
//LagrangeBase(X,Y,t) evalue en t le polynome de lagrange associé aux noeuds X et valeurs Y en utilisant la decomposition dans la base de Lagrange
function P=LagrangeBase(X,Y,t)
    P=0;
    N=length(X);
    for i=1:N
        Li=baselagrange(X,t,i)
        P=P+Y(i)*Li; 
    end
endfunction

//forme de Newton
// dans Y ont met le tableau des différences divisées classqique
function P=LagrangeNewton(X,Y,t)
    Y=Y';
    Yaux=Y;
    N=length(X);
    for j=2:N
        for i=1:N-j+1
            Yaux(i)=(Y(i+1,j-1)-Y(i,j-1))/(X(i+j-1)-X(i));
        end
        Y=[Y Yaux];
    end
    P=Y(1,N);
    for i=2:N
        P=P.*(t-X(i))+Y(i,N-i+1);
    end
endfunction

disp("Testons nos méthodes sur lexemple vu en TD")
disp("X=")
X=[-1 -1/2 0 1/2 1]
disp(X)
disp("Y=")
Y=[-3/2 0 1/4 0 0]
disp(Y)
t=linspace(-2,2,200);
[coef,P1]=LagrangeSyst(X,Y,t);
P2=LagrangeBase(X,Y,t);
P3=LagrangeNewton(X,Y,t);
figure
subplot(1,3,1)
plot(t,P1)
title('systeme')
plot(X,Y,'o')

subplot(1,3,2)
plot(t,P2)
plot(X,Y,'o')
title('base lagrange')

subplot(1,3,3)
plot(t,P3)
plot(X,Y,'o')
title('base Newton')