3. Polynomy p x x x 3 ( ) = 2 5 Polynom je reprezentován řádkovým vektorem koeficientů jednotlivých řádů od nejvyššího dolů p = [1 0-2 -5]; kořeny polynomu r = roots(p) r = 2.0946-1.0473 + 1.1359i -1.0473-1.1359i Získání polynomu z kořenů p2 = poly(r) p2 = 1 8.8818e-16-2 -5 Pozn.: místo nuly je malé číslo. Hodnota polynomu polyval(p,5) ans = 110 Konvoluce a dekonvoluce 2 ax ( ) = x + 2x+ 3, bx x x 2 ( ) = 4 + 5 + 6 a = [1 2 3]; b = [4 5 6]; c = conv(a,b) c = 4 13 28 27 18 Zpátky pomocí deconv(), které vrací výsledek a zbytek:
[q,r] = deconv(c,a) q = 4 5 6 r = 0 0 0 0 0 Derivace polynomu p = [5 2-4 3] polyder(p) ans = 15 4-4 Prokládání dat křivkou polynomem p = polyfit(x,y,n), kde x a y jsou data která mají být proložena a n je řád polynomu Př. x = [1 2 3 4 5]; y = [5.5 43.1 128 290.7 498.4]; p = polyfit(x,y,3) % porovnání dat s křivkou a vykreslení do grafu x2 = 1:.1:5; y2 = polyval(p,x2); plot(x,y,'o',x2,y2) Příklad animace změny prokládané křivky při změně polohy jednoho z bodů figure; for k=1:15 x= [1 2 3 4 5];y = [.5 5 7 k 20]; p1=polyfit(x,y,2); p2=polyfit(x,y,3); p3=polyfit(x,y,4); x2 = 1:0.05:5; y1 = polyval(p1,x2); y2 = polyval(p2,x2); y3 = polyval(p3,x2); plot(x,y,'o',x2,y1,x2,y2,x2,y3); grid; axis ([1,5,1,20]); M(k) = getframe; end; for k=1:15 x= [1 2 3 4 5];y = [.5 5 7 15-k 20]; p1=polyfit(x,y,2); p2=polyfit(x,y,3); p3=polyfit(x,y,4); x2 = 1:0.05:5; y1 = polyval(p1,x2); y2 = polyval(p2,x2); y3 = polyval(p3,x2); plot(x,y,'o',x2,y1,x2,y2,x2,y3);
grid; axis ([1,5,1,20]); M(15+k) = getframe; end; movie(m,6);
4. Interpolace V Matlabu existují dvě skupiny interpolačních metod, jedna je založená na polynomech, druhá na Fourierově transformaci 4.1 Interpolace polynomem Jednorozměrná interpolace metoda interp1 yi = interp1(x,y,xi,method), kde x data, x-ova osa y příslušné hodnoty pro x data method řetězec který určuje která metoda se použije, nabývá hodnot: nearest Metoda nejbližšího souseda rychlá, nespojitá linear Lineární interpolace sousedících bodů default rychlá, spojitá, není hladká spline Kubický splajn pomalá, paměťově ok cubic Kubická Hermitovská interpolace po částech rychlejší, paměťově náročná Příklad x = 0:10; y = sin(x); xi = 0:.25:10; yi = interp1(x,y,xi); yi2 = interp1(x,y,xi,'spline'); plot(x,y,'o',xi,yi,xi,yi2) Příklad 2 různé metody, chyby interpolace x = 0:10; % body na x ose y = sin(x); % odpovidajici hodnoty sin xi = 0:.25:10; % interpolovane hodnoty yi = interp1(x,y,xi); % default = linear yi1 = interp1(x,y,xi,'nearest'); yi2 = interp1(x,y,xi,'spline'); yi3 = interp1(x,y,xi,'cubic'); subplot(2,1,1) plot(x,y,'ok',xi,yi,xi,yi1,xi,yi2,xi,yi3) legend('data','linear','nearest','spline','cubic'); % vypocet a zobrazeni chyby y_mabyt = sin(xi); % hodnoty sin v danych x souradnicich e0 = y_mabyt - yi; e1 = y_mabyt - yi1; e2 = y_mabyt - yi2; e3 = y_mabyt - yi3; subplot(2,1,2) plot(xi,e0,xi,e1,xi,e2,xi,e3) legend('linear','nearest','spline','cubic');
4.2 Interpolace pomocí Fourierovy transformace Spočívá ve výpočtu FT pro daná data a výpočet zpětné (inverzní) FT pro více bodů. y = interpft(x,n) kde x je vektor hodnot periodické funkce (v rovnoměrně vzdálených bodech) a n je počet bodů které má funkce vrátit. Pozn. Tohle mi není moc jasny.
4.3 Dvourozměrná interpolace Používá se polynomická interpolace. Obecný tvar funkce je: ZI = interp2(x,y,z,xi,yi,method) Kde Z je matice hodnot pro X a Y (původní, která se má interpolovat) a XI a YI jsou matice obsahující body, ve kterých se má interpolace provádět. Pro XI a YI využijeme metodu meshgrid. Parametr method nabývá hodnot: nearest, bilinear, bicubic Příklad: [X,Y] = meshgrid(-3:.25:3); % kde jsou puvodni body Z = peaks(x,y); % generovani původních dat [XI,YI] = meshgrid(-3:.125:3); % kde se ma interpolovat ZI = interp2(x,y,z,xi,yi); % interpolace, použita default metoda mesh(x,y,z), hold, mesh(xi,yi,zi+15) % vykresleni hold off axis([-3 3-3 3-5 20]) Porovnání metod: % stejná data jako v předchozím příkladu ale s horším rozlišením [x,y] = meshgrid(-3:1:3); z = peaks(x,y); surf(x,y,z) % generování jemné sítě pro interpolaci [xi,yi] = meshgrid(-3:0.25:3); % Jednotlivé metody zi1 = interp2(x,y,z,xi,yi,'nearest'); zi2 = interp2(x,y,z,xi,yi,'bilinear'); zi3 = interp2(x,y,z,xi,yi,'bicubic'); % Porovnání metod pomocí povrchových a konturových grafů subplot(3,2,1); surf(xi,yi,zi1) title('nearest'); subplot(3,2,2); contour(xi,yi,zi1) title('nearest'); subplot(3,2,3); surf(xi,yi,zi2) title('bilinear'); subplot(3,2,4); contour (xi,yi,zi2)
title('bilinear'); subplot(3,2,5); surf(xi,yi,zi3) title('bicubic'); subplot(3,2,6); contour (xi,yi,zi3) title('bicubic'); 4.4 Interpolace vyšších rozměrů Obdobně jako u interp2, existuje funkce interp3 a interpn. 4.5 Ostatní Matlab obsahuje celou řadu dalších nástrojů spojených s interpolací, např. Delaunayova triangulace, Voronoiovy diagramy, atd. Konvexní obálka (convex hull) - nejmenší konvexní množina která zahrnuje dané body gumička přes všechny body Příkaz: convhull(x,y) Příklad xx = -1:.05:1; yy = abs(sqrt(xx)); [x,y] = pol2cart(xx,yy); k = convhull(x,y); plot(x(k),y(k),'r-',x,y,'b+') Další příklad data seamount výška podmořského terénu v daných souřadnicích load seamount plot(x,y,'.','markersize',10) k = convhull(x,y); hold on plot(x(k),y(k),'-r') hold off
Delaunayova triangulace Pro danou množinu bodů je delaunayova triangulace kupa trojúhelníků, kdy kružnice opsaná neobsahuje žádný z bodů (vymyšleno Borisem Delaunayem v roce 1934 ). Příkaz: tri = delaunay(x,y) - vraci trojice (vrcholy trojúhelníků jako indexy bodů v x a y) Vykreslení: příkaz triplot(tri,x,y) je možno i jako plochu pomocí trimesh(tri,x,y,z) nebo trisurf() Příklad: load seamount plot(x,y,'.','markersize',12) xlabel('longitude'), ylabel('latitude') tri = delaunay(x,y); % vlastni triangulace hold on triplot(tri,x,y) hold off figure % 3D zobrazeni pomoci trimesh hidden on trimesh(tri,x,y,z) xlabel('longitude'); ylabel('latitude'); zlabel('hloubka ve stopach') figure % povrch pomoci trisurf h = trisurf(tri,x,y,z) % vylepseni vzhledu... light('position',[-2,2,20]) lighting phong shading interp material([0.4,0.6,0.5,30]); set(h,'facecolor',[0.7 0.7 0],'BackFaceLighting','lit') shading interp xlabel('longitude'); ylabel('latitude'); zlabel('hloubka ve stopach')
Srovnání Delaunayovi triangulace a Voronoyových diagramů Voronoyovi diagramy rozdělím plochu, která obsahuje n bodů tak, aby jednotlivá políčka obsahovala pouze jeden bod a to tak že všechny body oblasti jsou blíže danému bodu (kolem kterého oblast je) než libovolnému dalšímu bodu. Příkaz: voronoi(x,y), nebo voronoi(x,y,tri) kde TRI je delaunayova triangulace rand('state',0); % nastaveni random generatoru x = rand(1,10); % nahodna data y = rand(1,10); TRI = delaunay(x,y); % delaunay subplot(1,2,1) triplot(tri,x,y) axis([0 1 0 1]); hold on; plot(x,y,'or'); hold off [vx, vy] = voronoi(x,y,tri); % voronoy pro ta stejna data subplot(1,2,2) plot(x,y,'r+',vx,vy,'b-') axis([0 1 0 1]) 1 1 0.8 0.8 0.6 0.6 0.4 0.4 0.2 0.2 0 0 0.5 1 0 0 0.5 1