function P=approx_cannonical(f,a,b,n)
% 
% Srednjekvadratna aproksimacija f-je f na intervalu [a,b], polinomom
% stepena n u odnosu na kanonsku bazu polinoma. 
% 
% Poziv funkcije : P=approx_cannonical(@(x) sqrt(x),0,1,2)
%
% Argumenti funkcije:
%  f -anonimna funkcija
%  a, b - leva i desna granica intervala
%  n - stepen polinoma kojim zelimo da aproksimiramo funkciju

% Gradimo matricu G koja predstavlja proizvode <gi,gj>
[i,j]=meshgrid(0:n,0:n);
G=b.^(i+j+1)./(i+j+1)-a.^(i+j+1)./(i+j+1);

% II nacin: bez funkcije meshgrid, dvostruka for petlja
% G=zeros(n+1,n+1);
% for i=0:n
%     for j=0:n
%         G(i+1,j+1)=(b^(i+j+1)-a^(i+j+1))/(i+j+1);
%     end
% end

% Gradimo vektor fg koji predstavlja proizvode <f,gi>
fg = zeros(n+1,1);  
for i=1:n+1
    fg(i)=integral(@(x) f(x).*x.^(i-1),a,b);
end

P=G\fg;
P=fliplr(P');


xx=linspace(a,b);
plot(xx,f(xx),xx,polyval(P,xx),'m*');
legend('funkcija', 'aproksimacija');

