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)