function P=approx_legendre(fun,a,b,n)
% Aproksimacija f-je fun na intervalu [a,b], polinomom stepena n 
% u odnosu na bazu Legandre-ovih polinoma. 
% Poziv funkcije: P=approx_legendre(@(x)abs(x),-1,1,5)

% Konstruisimo bazne polinome
% L je cell array koji sadrzi Lezandrove polinome L{i}=Li-1 na intervalu [a, b]
L = legendre_poly(n+1, a, b);

% koeficijenti aproksimacionog polinoma
P = zeros(1,n+1); %prealokacija

for i=1:n+1
    P = P + [zeros(1,n-i+1) (2*i-1)/(b-a) * quad(@Lf,a,b,[],[],fun,L{i}) * L{i}];
    % ili
    %P = P + [zeros(1,n-i+1) quad(@Lf,a,b,[],[],fun,L{i})/quad(@Ll,a,b,[],[],L{i}) * L{i}];
end


% iscrtavamo rezultat 
X = linspace(a, b);
plot(X, fun(X), X, polyval(P, X));


% Pomocna funkcija potrebna za racunanje integrala 
% Funkcija racuna vrednost proizvoda funcije f i 
% odgovarajuceg Legendreovog polinoma l u datim tackama x
function y = Lf(x, f, l)
    % l(x)*f(x)
    y = polyval(l, x).*feval(f, x);
    
% Pomocna funkcija potrebna za racunanje integrala 
% Funkcija racuna vrednost kvadrata odgovarajuceg Legendreovog polinoma l 
% u datim tackama x
%function y = Ll(x, l)
%    % l(x)*l(x)
%    y = polyval(l, x).^2;