function [y_aprox,p,S]=aprox_poly(x,y,n)
%aprox_poly - aproximace dat polynomem zadaneho stupne
%x..nezavisle promenna
%y..zavisle promenna, resp. funkcni hodnoty v bodech x
%n..stupen polynomu
%vystupy: y_aprox..aproximovane hodnoty, p...koeficienty hledaneho
%polynomu, S..soucet ctvercu odchylek aprx. a puvodnich hodnot
%priklad volani:    aprox_poly([1:10], rand(1,10),2)   %parabola
%[y,p,S]=aprox_poly([1:10],sin(1:10),2)     aproximace sinusoidy parabolou
%[y,p,S]=aprox_poly([1:10],sin(1:10),9)     interpolace sinusoidy

x=x(:); %pro jistotu sloupcove vektory
y=y(:);
d1=length(x);
d2=length(y);
if d1~=d2, error('1. a 2. vstup musi mit shodnou delku!'), end
if n<0, error('Stupene polynomu musi byt 0 nebo vyssi!'), end
if n~=fix(n), error('Stupen polynomu musi byt cele cislo!'), end
if n>d2, error('Stupen polynomu musi byt mensi nez delka dat'), end

%vytvoreni vystupu
p=polyfit(x,y,n);      %aproximace (n<d1) nebo interpolace (n=d1)
y_aprox=polyval(p,x);
S=sum((y-y_aprox).^2);

%kresleni
x1=linspace(min(x),max(x),1000);    %kreslime podrobnosti pro 1000
y1=polyval(p,x1);
plot(x,y,'+',x1,y1,'r')
title(sprintf('Aproximace dat polynem stupne %d',n))