function P=approx_cannonical(f,a,b,n)
% 
% Srednjekvadratna aproksimacija f-je fun na intervalu [a,b], polinomom
% stepena n u odnosu na kanonsku bazu polinoma. 
% 
% Poziv funkcije za zad.4.5.: P=approx_cannonical('sqrt(x)',0,1,2)
%
% Argumenti funkcije:
%  fun - string koji predstavlja funkciju izmedju navodnika
%  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(1:n+1, 1:n+1);
G = (b.^(i+j-1) - a.^(i+j-1)) ./ (i+j-1)


% Gradimo vektor fg koji predstavlja proizvode <f,gj>
fg = zeros(n+1,1);  
for j=1:n+1
    fg(j) = quad(['(' f ').*x.^' num2str(j-1)], a, b);    
    % Ako je f prosledjeno kao anonimna funkcija 
    % poziv: P=approx_cannonical(@(x)sqrt(x),0,1,2)
    %fg(j) = quad(@pomfja, a, b, [], [], f, j);
    
    % Koriscnje ugradjene funkcije integral() umesto quad():
    %fg(j) = integral(@(x)pomfja(x,f,j), a, b);
end

% Resavamo sistem i obrcemo vetkor tako da odgovara standardnom
% zapisu matlab polinoma
P = fliplr((G\fg)');

% iscrtavamo rezultat
X = linspace(a, b);
plot(X, feval(inline(f), X), X, polyval(P, X),':'); 
legend(f, 'approximation');

% U slucaju da je f prosledjena kao anonimna funkcija:
%function y = pomfja(x,f,j)
%y=f(x).*x.^(j-1);