Interpolace a aproximace
Interpolace polynomem
>> x = 0 : 4; % x = [ 0 1 2 3 4 ] >> y = [ 3 1 2 6 8 ]; >> xx = 0 : 0.1 : 4; % deleni intervalu < 0 ; 4 > s krokem 0.1 >> n = length(x)-1; % n ... stupen polynomu >> p = polyfit(x,y,n) % p ... vektor koeficientu polynomu >> yy = polyval(p,xx); % yy ... hodnoty polynomu spoctene s krokem 0.1 >> plot(x,y,'ro',xx,yy,'b') % graf polynomu - dane body jsou cervene krouzky, graf je modry
Porovnání interpolace polynomem a kubickým splajnem:
Nechte proběhnout předchozí příklad, nezavírejte okno s obrázkem a zadejte tyto příkazy:
>> yy1 = spline(x,y,xx); % yy1 ... hodnoty kubickeho splajnu >> hold on % chceme kreslit do stejneho obrazku >> plot(x,y,'ro',xx,yy1,'g') % zeleny graf splajnu
Na následujícím příkladu lépe vynikne výhodnost interpolace splajnem:
>> x = -4 : 4; % x = [ -4 -3 -2 -1 0 1 2 3 4 ] >> y = [ 0 0 0 0 1 2 6 7 7]; >> xx = -4 : 0.1 : 4; % deleni intervalu < -4 ; 4 > s krokem 0.1 >> n = length(x)-1; % n ... stupen polynomu >> p = polyfit(x,y,n) % p ... vektor koeficientu polynomu >> yy = polyval(p,xx); % yy ... hodnoty polynomu spoctene s krokem 0.1 >> hold off % chceme kreslit do noveho obrazku >> plot(x,y,'ro',xx,yy,'b') % graf polynomu - dane hodnoty cervene krouzky, graf modry >> yy1 = spline(x,y,xx); % yy1 ... hodnoty kubickeho splajnu >> hold on % chceme kreslit do stejneho obrazku >> plot(x,y,'ro',xx,yy1,'g') % zeleny graf splajnu
Aproximace polynomem metodou nejmenších čtverců
Proložení přímky
>> x = -4 : 4; % x = [ -4 -3 -2 -1 0 1 2 3 4 ] >> y = [ 0 0 0 0 1 2 6 7 7]; >> xx = -4 : 0.1 : 4; % deleni intervalu < -4 ; 4 > s krokem 0.1 >> p = polyfit(x,y,1) % prolozeni primky metodou nejmensich ctvercu >> yy = polyval(p,xx); % yy ... hodnoty na primce spoctene s krokem 0.1 >> plot(x,y,'ro',xx,yy,'b') % graf - dane body jsou cervene krouzky, primka je modra
Funkce pro postupnou aproximaci dat polynomy všech stupňů od přímky až po interpolační polynom:
function mnc( X, Y, krok)
% mnc( X, Y, krok)
% vstup:
% X - radkový vektor x-ovych souradnic danych bodu (aspon dva body, nekontroluje se)
% Y - radkový vektor y-ovych souradnic danych bodu (spravny rozmer se nekontroluje)
% krok>0 - se kterym se budou kreslit grafy polynomu
% vystup:
% obrazek s aproximacnimi polynomy od primky po interpolaci
% dalsi polynom se nakresli vzdy po stisku mezerniku
n = length(unique(X)); % pocet ruznych hodnot v X
% deleni intervalu s danym krokem:
minx = min(X);
maxx = max(X);
xx = linspace(minx, maxx, (maxx-minx)/krok);
p = polyfit(X,Y,1); % primka
yy = polyval(p,xx); % body na grafu primky
hold off; % novy obrazek
plot(X,Y,'ro',xx,yy);
hold on; % dal se bude kreslit do stejneho obrazku
for i = 2 : n-1
pause % cekani na stisk mezerniku
p = polyfit(X,Y,i);
yy = polyval(p,xx);
plot(xx,yy);
end % for
end % function
Funkci můžeme zavolat takto (vždy po stisknutí mezery nakreslí další polynom):
>> x = -4 : 4; >> y = [ 0 0 0 0 1 2 6 7 7]; >> mnc(x, y, 0.2)