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)