function dy=deriv_tab(x,y)
%deriv_tab - priblizny vypocet derivace funkce zadane tabulkou
%x,y...nezavisle a zavisle promenna
%dy..priblizna hodnota derivace ve vsech bodch 'x'
%priklad volani: x=0:pi/10:pi; y=sin(x); dy_pribliz=deriv_tab(x,y)
%cos(x) sprave hodnoty derivaci
%plot(x,dy_pribliz,'k.', x,cos(x),'rx'), legend ('num.derivace','presna derivace')

if nargin<1 || nargin<2
    error('Zadejte 2 vektory!')
end
n=length(x) ;
if n~=length(y)
    error('Zadejte dva stejne dlouhe vektory!');
end
if (n<3)
    error('Zadejte alespon TRI funkci hodnoty!');
end

dy=y;   %priprava

for i=1:n
    if i==1 %prvni bod ma derivaci podle prvniho vzorce
            h=x(2)-x(1);
                if h~=(x(n-1)-x(n-2))
                    error('Nezavisle promenna musi byt ekvidistantne rozdelena!')
                end
            dy(1)=(-3*y(1)+4*y(2)-y(3))/(2*h);
    elseif i==n %posledni bod ma derivaci podle posledniho vzorce
            h = x(n)-x(n-1);
                if h~=(x(n-1)-x(n-2))
                    error('Nezavisle promenna musi byt ekvidistantne rozdelena!')
                end
                    dy(n)=(y(n-2)-4*y(n-1)+3*y(n))/(2*h);
    else        %ostatni vnitrni body, jejich derivaci (tecnu v prislusnem bode) nahrazujeme secnou
            h = x(i+1)-x(i-1);
                if x(i)-x(i-1) ~= x(i+1)-x(i)
                    error('Nezavisle promenna musi byt ekvidistantne rozdelena!')
                end   
        dy(i)=(y(i+1)-y(i-1))/(2*h);
    end
end
    