function [S,y]=splajn(X,Y,x)
%funkcija nalazi kubni splajn za tablicno zadatu funkciju
%S-matrica koja sadrzi koeficijente kubnog splajna
%vektori X i Y sadrze cvorove interpolacije, tj. vrednosti funkcije u tim tackama
%y-vrednost formiranog splajna u tacki x

%kod prirodnog splajna (M0=Mn=0) jednacine za unutrasnje tacke su oblika
%     2M1 +     ni1M2                                        = lambda1
%   mi2M1         2M2     +ni2M3                             = lambda2
%               mi3M2        2M3   +ni3M4                    = lambda3
%
%.................................
%
%                                   mi_n-1 Mn-2 +2Mn-1      = lambda_n-1
%Sistem ima trodijagonalnu matricu, na dijagonali su 2, na naddijagonali vrednosti ni, a na
%poddijagonali vrednosti mi
n=length(X);
h=diff(X); %h=[x2-x1,x3-x2,...xn-xn-1]
%matrica sistema

mi=h(1:end-1)./(h(1:end-1)+h(2:end));
ni=1-mi;
pr1=diff(Y)./diff(X); %podeljene razlike reda 1.....  operator ./ deli odgovarajuce koordinate vektora Y i X 
lambda=6*diff(pr1)./(X(3:end)-X(1:end-2));

%Formiramo matricu sistema kao zbir tri kvadratne matrice dimenzije n-2:
A=diag(2*ones(1,n-2))+diag(mi(2:end),-1)+diag(ni(1:end-1),+1); 
%funkcija diag(v) formira kvadratnu matricu koja na glavnoj dijagonali ima vektor v, a ostali
%elementi su 0 -probati u komandnom prozoru diag([1 2 3])
%diag(v,k) formira kvadratnu matricu koja na k-toj dijagonali ima vektor v, a ostali
%elementi su 0. Dijagonale iznad glavne imaju pozitivan redni broj, a
%isppod glavne dijagonale negativan -probati u komandnom prozoru diag([1 2 3],1) i diag([1 2 3],-1)


%Resavamo sistem po nepoznatim momentima
M=A\lambda'; 
M=[0;M;0];  % dodajemo vrednosti M0 i Mn
S=[]; %matrica koja sadrzi koeficijente splajna, u prvoj vrsti su koeficijenti na intervalu [x0,x1]: delta0,gama0,beta0,alpha0 itd
for i=1:n-1
    alpha=Y(i);
    beta=(Y(i+1)-Y(i))/h(i)-h(i)/6*(2*M(i)+M(i+1));
    gama=0.5*M(i);
    delta=1/(6*h(i))*(M(i+1)-M(i));
    S=[S;[delta gama beta alpha]];
end
%Ako se trazi vrednost splajna u tacki x:
%Nalazimo kom segemntu [xl,xd] pripada tacka x
d=min(find(X>x)); %desni indeks.... find nalazi sve indekse na kojima vazi dati uslov, min(find(...)) nalazi najmanji takav indeks
l=d-1; %levi indeks
koef=S(l,:); %koeficijenti odgovarajuceg polinoma S_i
y=koef(1)*(x-X(l))^3+koef(2)*(x-X(l))^2+koef(3)*(x-X(l)) +koef(4);








