% Metoda interpolacji Lagrange'a _____________________________

% Tworzy wielomian interpolacyjny przechodzący przez podane punkty.
%
% Argumenty:
%     x: wektor zawierający wartości x.
%     y: wektor zawierający wartości y.
%     
% ____________________________________________________________


% Wczytanie argumentów _________________________________________
clc; clear

%x = [-2 1 3 5 ];
%y = [0 -1.8 -1.2 -1.6];

x = [-7 -6 0 5];
y = [-23 -54 -954 145];

%x = [-1 -0.3 0 0.6 1 2 2.5];
%y = exp(x);


sum = 0; % zadeklarowanie wektora, który będzie przechowywał współczynniki wielomianu interpolacyjnego
for k = 1:length(x)
    l = 1;
    for i = 1:length(x)
        if i ~= k
            c = poly(x(i))/(x(k)-x(i)); % tworzy kolejne ilorazy różnicowe.
            l = conv(l,c); % sukcesywnie tworzy wielomiany l dla kolejnych wartości k
        end
    end
    term = l*y(k); % utworzenie k-tego składnika wielomianu Lagrange'a
    sum = sum + term; % aktualizacja współczynników wielomianu Lagrange'a
end
disp('Współczynniki wielomianu interpolacyjnego Lagrangea:');
disp(sum);
xx = linspace(min(x), max(x), 100); % tworzy wektor zawierający 100 równoodległych punktów pomiędzy min(x) a max(x)
%yy = sum(1)*xx.^3 + sum(2)*xx.^2 + sum(3)*xx + sum(4);

yy = 0;
for n = 1:length(x)
    yy = yy + sum(n)*xx.^(length(x)-n);
end

plot(x, y, '-s')
hold on 
plot(xx,yy,'-r')
%plot(sum,'-o')
xlabel('x'), ylabel('y'), title('Interpolacja wielomianowa Lagrangea ')
legend('Węzły interpolacji', 'Wielomian interpolacyjny', 'Location', 'NorthOutside')