function L2_aproximace(x,f,stupen);
%
% Sestroji diskretni L2-aproximaci 
% pro funkci zadanou tabulkou [x;f(x)]
% pouzitim polynomu stupne stupen
%
% nejsou-li zadane vektory x,f => zadaji se mysi


clc;
pocet_deleni=1000;
presah=15;
barva=['r','m','g','b','k'];
styl=['- ';'--';'-.';': '];

if exist('stupen') 
  if stupen>max(size(x))-1
    stupen=max(size(x))-1;
    disp(' ');
    disp('Pozor! Stupen aproximujiciho polynomu musi byt mensi nez pocet zadanych bodu');
    disp(' ');
  end;
end;  
figure(1);
clf;
hold on;
zoom on;
set(figure(1),'Units','centimeters');
set(figure(1),'Position',[10 3 18 15]);

if ~exist('x') | ~exist('f')
  [x,f]=zadej_body;
  clc;
else
  xmin=min(x);
  xmax=max(x);
  fmin=min(f);
  fmax=max(f);
  plot(x,f,'ro');
end;  

[x,indexy]=sort(x);
f=f(indexy);
n=max(size(x));
deleni=(x(n)-x(1))/pocet_deleni;
zoom on;

disp('----------------------------------------------------------------------------');
if exist('stupen') 
 disp(sprintf('  Diskretni L2-aproximace polynomem stupne %2d',stupen));
else
 disp(sprintf('  Diskretni L2-aproximace polynomy stupne 0 az %2d',n-1));
end;  
disp(sprintf('          pro funkci danou tabulkou'));
disp(' ');
disp(sprintf(' |    x(k)    |    f(k)    |'));
disp(sprintf(' ==========================='));
for i=1:n
  disp(sprintf(' | %9.4f  | %9.4f  |',x(i),f(i)));
end;  


xmin=x(1);
xmax=x(n);
xk=x(1)-presah/100*(xmax-xmin):deleni:x(n)+presah/100*(xmax-xmin);
if exist('stupen') 
 p=polyfit(x,f,stupen);  
 fk=polyval(p,xk);
 fmin=min([min(fk),min(f)]);
 fmax=max([max(fk),max(f)]);
else
 fmin=min(f);
 fmax=max(f);
 for i=0:n-1 
  p=polyfit(x,f,i);  
  fk=polyval(p,xk);
  fmin=min([min(fk),fmin]);
  fmax=max([max(fk),fmax]);
 end;  
end;  
 
 
set(figure(1),'Position',[7 3 32 15]);
clf;
hold on;
axis([xmin-2*presah/100*(xmax-xmin) xmax+2*presah/100*(xmax-xmin) ...
      fmin-presah/200*(fmax-fmin) fmax+presah/200*(fmax-fmin)]); 
plot(x,f,'ro');
popis=sprintf('Zadane body                             ');
texty(1,:)=popis(1:35); 
legend(texty,-1);

disp(' ');
disp('Stiskni klavesu');
pause;

if exist('stupen') 
 plot(xk,fk,'b');
 popis=sprintf('L2-aproximace polynomem stupne %2d     ',stupen);
 texty(2,:)=popis(1:35); 
 legend(texty,-1);
 text=['P_',num2str(stupen),'(x) = ',predpis_polynom(p)];
 disp(' ');
 disp(text);
 disp(' ');
else
 for i=0:n-1
  k=i+1; 
  color=strcat(barva(mod(k-1,5)+1),styl(mod(floor((k-1)/5),5)+1,:));
  p=polyfit(x,f,i);  
  fk=polyval(p,xk);
  plot(xk,fk,color);
  text=['P_',num2str(i),'(x) = ',predpis_polynom(p)];
  disp(' ');
  disp(text);
  if i==n-1
    popis=sprintf('Interpolace polynomem stupne %2d     ',i);
  else  
    popis=sprintf('L2-aproximace polynomem stupne %2d     ',i);
  end;
  texty(i+2,:)=popis(1:35); 
  legend(texty,-1);
  if i<n-1
    pause;
  else
    disp(' ');
  end; 
 end; 
end;


