%%diary('exercici1.txt')
%%diary on
%%
%% Exercici 1: Calculeu els polinomis de Lagrange associats al conjunt
%% de punts x={-3,-2,1,2} denotant-los per L0,...,L3 respectivement
%%
%% calculeu el polinomi interpolador de Lagrange en aquests punts per
%% la funcio f(x)=exp(x). Avalueu-lo en el punt 0.1 i compareu l'error
%% amb el valor exacte.

clear
format long
% Calcul directe.
x=[-3 -2 1 2];         % x = [X(0),X(1),X(2),X(3)], con
                       % X(0) = x(1) = -3,
                       % X(1) = x(2) = -2,
                       % X(2) = x(3) =  1,
                       % X(3) = x(4) =  2

m0=poly([x(2),x(3),x(4)]); % m0: M0(X)=(X-X(1))*(X-X(2))*(X-X(3))
m1=poly([x(1),x(3),x(4)]); % m1: M1(X)=(X-X(0))*(X-X(2))*(X-X(3))
m2=poly([x(1),x(2),x(4)]); % m2: M2(X)=(X-X(0))*(X-X(1))*(X-X(3))
m3=poly([x(1),x(2),x(3)]); % m3: M3(X)=(X-X(0))*(X-X(1))*(X-X(2))

% Per tenir els polinomis interpoladors de Lagrange hem de dividir m0,
% m1, m2 i m3 pels valors que prenen aquests polinomis a  x(1), x(2),
% x(3) i x(4) respectivament.

L0=m0/polyval(m0,x(1))   % L0
L1=m1/polyval(m1,x(2))   % L1
L2=m2/polyval(m2,x(3))   % L2
L3=m3/polyval(m3,x(4))   % L3

% Ara L0, L1, L2, i L3 son els polinomis interpoladors de Lagrange
% corresponents als valors de x donats

f=exp(x);
p1=f(1)*L0+f(2)*L1+f(3)*L2+f(4)*L3 % Polinomi interpolador de exp(x)

% Alternativament, podem fer servir la funcio lagrange_interp1 que varem
% programar a la sessio anterior (feu help lagrnage_interp1)
p2=lagrange_interp1(x,f)

% O fins i tot la comanda polyfit del Matlab/Octave (feu help polyfit)
% amb n = 3 (grau del polinomi).
p3=polyfit(x,f,3)

% Comproveu que tots tres polinomis p1,p2 i p3 coincideixen


xx=-3:0.01:2;              % Punts on avaluarem les funcions per dibuixar-les
fxx=exp(xx);               % Avaluem la funcio y=exp(x) als punts de xx
pxx=polyval(p1,xx);        % Avaluem el polinomi interpolador als punts de xx

plot(x,f,'og',xx,fxx,'-b') % Dibuxem la funcio y=exp(x) i els punts de la taula
xlabel('X')
ylabel('Y')
title('Polinomi iterplador de y=exp(x) als punts x=-3,-2,1,2')
hold on

plot(xx,pxx,'-.r');        % Dibuixem el polinomi interplador
legend('punts a la taula','funcio exp(x)','Polinomi interpolador')
hold off

% Avaluem la funcio i el polinomi interpolador al punt x=0.1 i comparem.
% Donarem l'error com el valor absolut de la diferencia.
x0=0.1
px0=polyval(p1,x0)
fx0=exp(x0)
error=abs(fx0-px0)

%%diary off
