Katedra Elektrotechniki Teoretycznej i Informatyki
Transkrypt
Katedra Elektrotechniki Teoretycznej i Informatyki
Katedra Elektrotechniki Teoretycznej i Informatyki Przedmiot: Zintegrowane Pakiety Obliczeniowe W Zastosowaniach Inżynierskich Numer ćwiczenia: 3,4 Temat: Wizualizacja rozkładów jedno i wielowymiarowych, graficzny interfejs, interpolacja i decymacja, dopasowanie krzywej Cel ćwiczenia Celem ćwiczenia jest zapoznanie się z podstawowymi funkcjami wykreślającymi wykresy oraz tworzącymi okna komunikacyjne (dialog box). Podstawy teoretyczne MATLAB GRAPHIC - WYKRESY 2D 1 1 0.1 0.8 0.6 0.6 0.5 0.05 0.4 0.4 0.2 0.2 0 0 0 -0.2 0 -0.2 -0.4 -0.4 -0.5 -0.05 -0.6 -0.6 -0.8 -1 1 0.8 -0.8 0 1 2 3 4 5 6 7 -1 8 x=0:0.05:8; y1=sin(x.^2); y2=sin(x); plot(x,y1, x,y2); 0 1 2 3 4 5 -0.1 7 6 -1 0 1 2 3 4 5 6 7 8 9 10 % Tworzenie wykresu z dwiema % % Wykres schodkowy funkcji sin osiami y z użyciem funkcji plot x=0:0.25:10; t = 0:pi/20:2*pi; stairs(x,sin(x)); y1 = sin(t); y2 = 0.5*sin(t-1.5); plotyy(t,y1,t,y2,'plot') 50 10 1.5 0.35 0.3 1 40 10 0.25 0.2 0.5 30 10 0.15 0 0.1 20 10 0.05 -0.5 0 10 10 -0.05 -1 -0.1 0 10 -1 0 10 1 10 2 10 10 -1.5 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 % Wykres błędu x=-2:0.1:2; y=erf(x); e = rand(size(x))/10; errorbar(x,y,e); % Wykres logarytmiczny x = logspace(-1,2); loglog(x,exp(x),'-s'); grid on 90 10 10 -0.15 0 0.5 1 1.5 2 2.5 3 3.5 4 % Stem plot x = 0:0.1:4; y = sin(x.^2).*exp(-x); stem(x,y) 0.5 120 60 11% 0.375 22% 8 10 0.25 150 30 0.125 6 10 180 0 4 33% 10 210 2 10 240 0 10 330 0 1 2 3 4 5 6 7 8 9 10 300 28% 6% 270 1 % Wykres półlogarytmiczny(y-log) x = 0:.1:10; semilogy(x,10.^x) % Wykres biegunowy t=0:.01:2*pi; polar(t,abs(sin(2*t).*cos(2*t))); x = [1 3 0.5 2.5 2]; explode = [0 1 0 0 0]; pie(x,explode) % Wykres półlogarytmiczny(x-log) x = 0:.1:10; semilogx(10.^x,x) 25 1 5 0.9 20 0.8 4 0.7 15 0.6 3 0.5 10 0.4 2 0.3 5 0.2 1 0.1 0 0 -3 -2 -1 0 1 2 % Wykres słupkowy dzwonowej x = -2.9:0.2:2.9; bar(x,exp(-x.*x)); 1 3 2 3 4 5 0 funkcji Y = round(rand(5,3)*10); bar(Y,'stack') 10 10 18 9 9 16 8 8 14 7 7 12 6 6 10 5 5 8 4 4 6 3 3 4 2 2 2 1 0 1 2 3 4 5 6 7 8 9 10 Y = round(rand(19,1)*10); barh(Y) 10 15 25 1 0 1 2 3 4 0 5 Y = round(rand(5,3)*10); bar(Y,1.5) 1 2 3 4 5 Y = round(rand(5,3)*10); bar(Y,'group') 90 12 20 Y = round(rand(5,3)*10); barh(Y,'stack') 20 0 5 2 6 120 60 1.5 4 10 150 1 30 2 8 0.5 6 0 180 0 -0.5 4 -1 210 330 2 -1.5 0 1 1.5 2 2.5 3 Y = [ 1, 5, 3; 3, 2, 7; 2, 6, 1]; area(Y); grid on 3.5 4 -2 240 0 2 4 6 8 10 12 14 16 18 1, 5, 3;... theta = (-90:10:90)*pi/180; r = 2*ones(size(theta)); [u,v] = pol2cart(theta,r); feather(u,v); 90 1 60 3.1227 0.8 2.0818 150 22% 270 theta=2*pi*rand(1,50; rose(theta) 4.1635 120 300 20 0.6 30 0.4 11% 1.0409 0.2 28% 180 33% 0 0 -0.2 6% -0.4 210 330 -0.6 -0.8 240 300 270 x = [1 3 0.5 2.5 2]; explode=[0 1 0 0 0]; pie3(x,explode); Z = eig(randn(20,20)); compass(Z) -1 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 % plot a function fplot('tanh',[-2 2]) 2 Funkcja Zastosowanie Składnia Opis Przykłady hold Zatrzymuje bierzący wykres w okienku hold on hold off hold subplot Tworzy i kontroluje wykresy o wielu osiach subplot(m,n,p) plot Liniowy wykres 2-D plot(Y) plot(X1,Y1,...) plot(X1,Y1,LineSpec,...) grid Rysuje linie siatki dla wykresów 2-D I 3-D grid on grid off grid Funkcja hold określa czy nowo rysowany wykres zostanie dodany do bieżącego wykresu, czy go zastąpi. hold on zatrzymuje bieżący wykres i pewne właściwości osi tak że następne polecenia rysowania dodają kolejne wykresy do bieżącego. Subplot dzieli bieżące okienko wykresu na kwadratowe obszary, które są numerowane rzędami. Każdy obszar zawiera osie. subplot(m,n,p) tworzy osie w p-tym obszarze okienka podzielonego na m-na-n kwadratowych obszarów. Nowe osie stają się osiami bieżącymi. plot(Y) wykreśla kolejne wartości w kolumnach Y. Jeśli Y jest macierzą zespoloną plot(Y) is równoważne do plot(real(Y),imag(Y)). We wszystkich innych przypadkach użycia plot, część urojona jest ignorowana. plot(X1,Y1,...) wykreśla wszystkie linie zdefiniowane parami (Xn, Yn). Jeśli tylko Xn lub Yn jest macierzą, wektor jest rysowany w odniesieniu do rzędów lub kolumn macierzy, w zależności od tego który wymiar macierzy zgadza się z wymiarem wektora. plot(X1,Y1,LineSpec,...) wykreśla wszystkie linie zdefiniowane przez trójki Xn,Yn,LineSpec triples, gdzie LineSpec jest specyfikacją linii określającą jej typ, marker, kolor itp. Funkcja grid włącza i wyłącza linie siatki dla bieżących osi. grid on dodaje siatką dla bieżących osi. grid off usuwa siatkę dla bieżących osi. grid przełącza stan widoczności siatki. income = [3.2 4.1 5.0 5.6]; outgo = [2.5 4.0 3.35 4.9]; subplot(2,1,1); plot(income) subplot(2,1,2); plot(outgo) plot(X,Y,'c+') %rysuje wykres w kolorze cyan z % markerem + w każdym punkcie Xn,Yn plot(X,Y,'r-',X,Y,'go') %rysuje wykres czerwoną ciągłą linią %łączącą punkty i zielonymi kółkami %oznaczającymi lokalizację punktów %danych 3 legend Wyświetla legendę osi title Dodaje opis do bierzącej osi xlabel, ylabel, zlabel Opis osi x, y ,z legend umieszcza legendę na wykresie. Legenda pokazuje, dla każdej linii na wykresie, typ linii, markera i jej kolor obok opisu wprowadzonego przez użytkownika. W przypadku wykreślania wypełnionych przestrzeni, legenda zawiera kolor ścianki. Po wyświetleniu legendy użytkownik może przesuwać ją po wykresie przy użyciu myszki. pos = -1 umieszcza legendę poza obszarem ograniczonym przez osie, po prawej stronie pos = 0 umieszcza legendę w obszarze ograniczonym przez osie zasłaniając jak najmniej punktów wykresu pos = 1 umieszcza legendę w górnym-prawym rogu obszaru wyznaczonego przez osie (wartość domyślna). pos = 2 umieszcza legendę w górnym-lewym rogu obszaru wyznaczonego przez osie. pos = umieszcza legendę w dolnym-lewym rogu obszaru wyznaczonego przez osie. pos = 4 umieszcza legendę w dolnym-prawym rogu obszaru wyznaczonego przez osie. pos = [XlowerLeft YlowerLeft] Jawne określenie współrzędnych dla dolnej lewej pozycji legendy w znormalizowanych współrzędnych. title('string') Każdy obiekt Axes może posiadać jeden opis (tytuł). title(fname) Opis jest zlokalizowany pośrodku, powyżej osi. title(...,'PropertyName',PropertyValu title('string') wyświetla string pośrodku, powyżej e,...) bieżącej osi. title(fname) wywołuje funkcję zwracającą łańcuch tekstowy który jest wyświetlany pośrodku powyżej bieżącej osi. legend('string1','string2',...) legend('off') legend('string1','string2',...,pos) xlabel('string') xlabel(fname) xlabel(...,'PropertyName',PropertyV alue,...) ylabel(...) zlabel(...) Każdy obiekt Axes może posiadać jeden opis dla osi x, y, z. Opis pojawia się poniżej odpowiedniej osi w przypadku wykresu 2-D i obok lub poniżej w przypadku wykresu 3-D. xlabel('string') opisuje oś x dla bieżących osi. xlabel(fname) wywołuje funkcję zwracającą łańcuch tekstowy który jest wyświetlany pośrodku powyżej osi x dla bieżącego układu osi. xlabel(...,'PropertName',PropertyValue,...) określa wartości (PropertyValue) dla danej własności x = -pi:pi/20:pi; plot(x,cos(x),'-r',x,sin(x),'-.b') h=legend('cos','sin',0); f = 70; c = (f--32)/1.8; title(['Temperature is ',num2str(c),'C']) n = 3; title(['Case number #',int2str(n)],... 'Color','y') xlabel(‘X [mm]) 4 xlim, ylim, zlim Ustawia limit wartości dla osi x, y, z xlim xlim([xmin xmax]) xlim('mode') xlim('auto') xlim('manual') xlim(axes_handle,...) same for ylim, and zlim (PropertName) dla obiektu graficznego Text utworzonego przez xlabel. ylabel(...) and zlabel(...) opisuje osie x i y w bieżącym układzie osi xlim bez argumentów zwraca indywidualne zakresy dla bieżących osi. xlim([xmin xmax]) ustawia zakres wartości od xmin do xmax dla bieżącej osi [x,y] = meshgrid([-1.75:.2:3.25]); z = x.*exp(-x.^2-y.^2); surf(x,y,z); xlim([-1.75 3.25]); ylim([-1.75 3.25]); xlim('mode') zwraca bieżący tryb: automatyczny lub ręczny xlim('auto') ustawia tryb ograniczania wartości na automatyczny xlim('manual') ustawia tryb ograniczania wartości na ręczny 5 colormap Ustawia bierzącą mapę kolorów Colormap(map) Colormap('default') cmap = colormap Mapa kolorów jest m-na-3 macierzą liczb load spine rzeczywistych w zakresie pomiędzy 0.0 a 1.0. Każdy image (X) rząd odpowiada wektorowi RGB definiującym jeden colormap bone kolor. k-ty rząd definiuje k-ty kolor mapy kolorów, gdzie map(k,:) = [r(k) g(k) b(k)]) określa intensywność kolorów: czerwonego, zielonego i niebieskiego. colormap(map) ustawia macierz map jako mapę kolorów. Jeśli jakaś wartość macierzy map jest poza zakresem [0 1], MATLAB zwraca błąd: Colormap must have values in [0,1]. colormap('default') ustawia domyślna mapę kolorów cmap = colormap; zwraca bieżącą mapę kolorów. Wartości sa w zakresie [0 1]. Dostępne mapy kolorów: autumn -Odcienie od czerwonego do żółtego bone -Skala szarości z odcieniem niebieskiego contrast -Skala szarości z polepszeniem kontrastu obrazu cool -Odcienie od cyan do magenta copper -Odcienie miedziane flag -Naprzemiennie czerwony, biały, niebieski i czarny gray -Liniowa skala szarości hot -Czarno – czerwono – żółto – biała mapa kolorów hsv -Hue-saturation-value (HSV) jet -Odmiana HSV lines -Line color colormap prism -Kolory pryzmatowe (rozszczepienie światła) spring -Odcienie od magenta do żółtego summer -Odcienie od zielonego do żółtego winter -Odcienie niebieskiego i zielonego 6 rotate3d Obracanie osi przy użyciu myszy rotate3d rotate3d on rotate3d off rotate3d on umożliwia interaktywne obracanie osi w bieżącym okienku przy użyciu myszy. rotate3d off uniemożliwia interaktywne obracanie osi w bieżącym okienku przy użyciu myszy. [x,y] = meshgrid([-1.75:.2:3.25]); z = x.*exp(-x.^2-y.^2); surf(x,y,z); rotate3d on rotate3d przełącza interaktywne obracanie osi w bieżącym okienku przy użyciu myszy. view Specyfikacja położenia obserwatora view(az,el) view([az,el]) view([x,y,z]) view(2) view(3) Pozycja obserwatora (viewpoint) określa orientację osi. Użytkownik może zdefiniować pozycję obserwatora przez podanie współrzędnych w przestrzeni 2-D lub poprzez podanie azymutu i wysokości patrzenia. view(az,el) i view([az,el]) ustawiają kąt patrzenia dla wykresu 3-D. Azymut az, jest poziomą rotacją wokół osi z mierzoną w stopniach od ujemnej osi y. Wartości dodatnie liczone są zgodnie z obrotem wskazówek zegara. el jest pionową wysokością liczoną w stopniach. Wartości dodatnie odpowiadają poruszaniu się powyżej obiektu, ujemne poniżej obiektu. view([x,y,z]) ustawia pozycję obserwatora o współrzędnych x, y, i z. view(2) ustawia domyślne współrzędne obserwatora dla wykresu 2-D, az = 0, el = 90. [x,y] = meshgrid([-1.75:.2:3.25]); z = x.*exp(-x.^2-y.^2); surf(x,y,z); az = 0; el = 90; view(az, el); view(3) ustawia domyślne współrzędne obserwatora dla wykresu 3-D, az = --37.5, el = 30 7 clf Czyści bierzące okienko wykresu clf clf reset clf usuwa wszystkie nieukryte obiekty graficzne z bieżącego okienka clc Czyści okienko komend Tworzy podstawowy obiekt graficzny Figure (okienko umożliwiające wyświetlanie innych obiektów graficznych) clc clc czyści okienko komend figurefigure('PropertyName',Propert yValue,...)figure(h)h = figure(...) figure tworzy obiekt graficzny Figure. Obiekt ten stanowi odrębne okienko na ekranie umożliwiające wyświetlanie grafiki figure scrsz = get(0,'ScreenSize'); figure('Position',[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2]) figure Tworzy okienko o domyślnych parametrach. figure('PropertyName',PropertyValue,...) tworzy nowy obiekt Figure przy użyciu określonych przez użytkownika własnościach. MATLAB używa wartości domyślnej dla każdej własności nie zmodyfikowanej przez użytkownika. figure(h) robi dwie rzeczy w zależności czy okienko o uchwycie h istnieje czy nie. Jeżeli h jest uchwytem do istniejącego okienka, figure(h) ustawia okienko h na okienko aktywne, przesuwa je na wierzch. Aktywne okienko jest używane jako aktualne wyjście graficzne. Jeżeli h nie jest uchwytem istniejącego okienka, ale jest liczbą całkowitą, figure(h) tworzy okienko i przyporządkowuje mu uchwyt h. figure(h) gdzie h nie jest uchwytem okienka lub nie jest liczbą całkowitą jest błędne. h = figure(...) zwraca uchwyt do obiektu Figure. 8 zoom Powiększanie i pomniejszanie wykresu 2-D zoom on zoom off zoom out zoom reset zoom zoom xon zoom yon zoom(factor) zoom on włącza interaktywne zoomowanie. Umożliwia to zbliżanie i oddalanie obrazu poprzez naciśnięcie przycisku myszki w obszarze wykresu. Złomowanie zmienia wartości graniczne osi. Dla myszki jednoprzyciskowej zbliżanie uzyskuje się poprzez naciśnięcie przycisku, oddalanie poprzez naciśnięcie Shift i przycisku myszki. Dla myszki dwu i trójprzyciskowej – zbliżanie poprzez naciśnięcie lewego przycisku, oddalanie poprzez naciśnięcie prawego przycisku. Wciśnięcie przycisku i przesuwanie myszy powoduje rysowanie prostokąta, którego zawartość jest powiększana w momencie zwolnienia przycisku myszy. Podwójne kliknięcie ponad osiami powoduje powrót do powiększenia początkowego. zoom off wyłącza interaktywny zooming. zoom out ustawia powiększenie wykresu do wartości początkowej zoom reset ustawia aktualne powiększenie jako domyślne. zoom przełącza stan powiększania interaktywnego. zoom xon i zoom yon ustawia odpowiednio zoom on dla osi x i y. zoom(factor) zbliża lub oddala z określonym współczynnikiem bez wpływu na aktualny tryb zoomowania. Wartości większe od 1 zbliżają obraz o określoną wartość, wartości mniejsze od 1 i większe od 0 oddalają ze współczynnikiem 1/factor. 9 close Usuwa określone okienko wykresu close close(h) close all drawnow Wykonuje wszystkie polecenia rysowania oczekujące w kolejce drawnow hidden Usuwa ukryte linie z obiektów siatkowych hidden on hidden off hidden shading Ustawia metodę cieniowania shading flat shading faceted shading interp close Kasuje bieżące okienko lub określone okienka. Opcjonalnie zwraca status wykonanej operacji kasowania. close kasuje bieżące okienko (równoważne do close(gcf)). close(h) Kasuje okienko o uchwycie h. Jeżeli h jest wektorem lub macierzą, kasuje wszystkie obiekty określone przez h. close all kasuje wszystkie obiekty graficzne, których uchwyty nie są ukryte. drawnow czyści kolejkę oczekujących poleceń rysowania i odświeża okienko Hidden rysuje jedynie linie które są widoczne dla obserwatora (niezasłonięte przez inne obiekty, płaszczyzny lub linie) hidden on włącza usuwanie niewidocznych linii dla bieżącego wykresu. Linie znajdujące się z tyłu obiektu nie są rysowane. Jest to ustawienie domyślne. hidden off wyłącza usuwanie niewidocznych linii dla bieżącego wykresu. hidden przełącza opcję usuwania linii Funkcja shading kontroluje sposób cieniowania dla obiektów Surface i Patch (powierzchnie i łaty). shading flat każda linia siatki obiektu i jego ścianki posiadają stały jednorodny kolor określony przez kolor ostatniego pojedynczego punktu ścianki posiadającej najmniejszy indeks. shading faceted cieniowanie jednorodne z nałożonymi czarnymi liniami siatki. Jest to ustawienie domyślne. shading interp określa kolor każdej linii I ścianki poprzez interpolację kolorów z bieżącej mapy kolorów wzdłuż linii lub ścianki x = -pi:pi/20:pi; plot(x,cos(x)); drawnow title('A Short Title');grid on [x,y] = meshgrid([-1.75:.2:3.25]); z = x.*exp(-x.^2-y.^2); surf(x,y,z); shading interp 10 colorbar Wyświetla barwną skalę wartości. Colorbar colorbar('vert') colorbar('horiz') colorbar(h) h = colorbar(...) Funkcja colorbar wyświetla bieżącą mapę kolorów w surf(peaks(30)) bieżącym okienku przyporządkowując każdemu colormap cool kolorowi wartość liczbową z zakresu wartości colorbar występujących na osiach. colorbar odświeża pasek kolorów lub dodaje nowy pionowy w przypadku gdy aktywne okienko nie posiadało paska kolorów colorbar('vert') Dodaje pionową skalę kolorów do obiektu Axes colorbar('horiz') Dodaje poziomą skalę kolorów do obiektu Axes colorbar(h) umieszcza skalę kolorów przu obiekcie zdefiniowanym uchwytem h. Pasek kolorów jest poziomy jeśli szerokość osi jest większa niż ich wysokość. h = colorbar(...) zwraca uchwyt do paska kolorów. 11 axis Wygląd i skala osi axis([xmin xmax ymin ymax]) axis([xmin xmax ymin ymax zmin zmax]) v = axis axis auto axis manual axis tight axis fill axis ij axis xy axis equal axis image axis square axis vis3d axis normal axis off axis on Osiami można manipulować zwykle poprzez użycie opcji Axes properties. (zobacz Algorithm section.) axis([xmin xmax ymin ymax]) ustawia limity dla osi x, y dla bieżącego obiektu Axes. axis([xmin xmax ymin ymax zmin zmax]) ustawia limity dla osi x, y, z dla bieżącego obiektu Axes. v = axis zwraca wektor zawierający współczynniki skalowania dla osi x, y, z. axis auto ustawia automatycznie limity wartości na osiach. axis manual and axis(axis) zatrzymuje skalowanie na bierzących limitach wartości. Jeśli zostanie użyta funkcja hold on, kolejne wykresy będą używały tych samych zakresów wartości na osiach. axis tight ustawia proporcje rozmiaru osi tak, że jednostka danych na osiach jest taka sama we wszystkich kierunkach. axis fill ustawia limity osi w odniesieniu do zakresu danych axis ij umieszcza początek układu współrzędnych w lewym górnym rogu. axis xy rysuje wykres w domyślnym układzie kartezjańskim z początkiem układu w dolnym lewym rogu axis equal ustawia proporcje rozmiaru osi tak że jednostki danych są takie same we wszystkich kierunkach. Proporcje rozmiaru osi są ustawiane automatycznie w odniesieniu do zakresu danych w kierunkach x, y, z axis image tak samo jak axis equal za wyjątkiem tego ze obszar rysowania ściśle przylega do rysowanych danych. axis square tworzy bieżący obiekt Axes kwadratowym (lub sześciennym w przypadku wykresów 3-D). MATLAB reguluje osie x, y, z tak że mają one jednakową długość axis vis3d blokuje współczynnik proporcji osi w celu umożliwienia obracania 3-D axis normal automatycznie reguluje współczynnik proporcji osi tak aby wykres wypełnił okienko rysowania. axis off wyłącza wszystkie osie, znaczniki, etykiety axis on włącza wszystkie osie, znaczniki, etykiety. 12 griddata Generowanie siatki ZI = griddata(x,y,z,XI,YI) [XI,YI,ZI] = griddata(x,y,z,xi,yi) [...] = griddata(...,method) meshgrid Generuje [X,Y] = meshgrid(x,y) macierze X i Y [X,Y] = meshgrid(x) do wykresów [X,Y,Z] = meshgrid(x,y,z) trójwymiarowych ZI = griddata(X,Y,Z,XI,YI) tworzy powierzchnię X1,Y1 na podstawie najczęściej niejednorodnie rozłożonych danych (X,Y,Z), gdzie Z = F(X,Y). griddata interpoluje tę powierzchnię w punktach określonych przez (XI,YI) w celu obliczenia ZI. Powierzchnia zawsze przechodzi przez punkty danych. XI i YI są przeważnie jednorodna siatką (stworzoną przez meshgrid). [XI,YI,ZI] = griddata(X,Y,Z,XI,YI) zwraca XI i YI stworzone tą drogą (wynik [XI,YI] = meshgrid(XI,YI)). [...] = griddata(...,'method') gdzie 'method' może być: 'linear' – liniowa interpolacja (domyslna). 'cubic' - cubic interpolation. 'nearest' - interpolacja najbliższych sąsiadów. 'v4' - MATLAB 4 griddata method. rand('seed',0) x = rand(100,1)*4-2; y = rand(100,1)*4-2; z = x.*exp(-x.^2-y.^2); % x, y, and z are now vectors containing % nonuniformly sampled data. Define a % regular grid, and grid the data to it: ti = -2:.25:2; [XI,YI]=meshgrid(ti,ti); ZI=griddata(x,y,z,XI,YI); %Plot the gridded data along with the %nonuniform data points used to generate %it: mesh(XI,YI,ZI), hold on plot3(x,y,z,'o'); hold off [X,Y] = meshgrid(x,y) transformuje obszar [X,Y] = meshgrid(1:3,10:14) określony przez wektory x i y w tablice X i Y, które mogą być użyte do opisu funkcji dwóch zmiennych w przypadku wykresów siatkowych I powierzchniowych 3-D. Rządy tablicy wyjściowej X są kopiowane z wektora T x; kolumny Y są kopiowane z wektora y. [X,Y] = meshgrid(x) to samo co [X,Y] = meshgrid(x,x). [X,Y,Z] = meshgrid(x,y,z) generuje trójwymiarowe tablice używane do opisania funkcji trzech zmiennych. 13 MATLAB Graphic - Wykresy 3D % Three-dimensional bar chart % style detached Y = cool(7); bar3(Y,'detached') % Three-dimensional bar chart % style grouped Y = cool(7); bar3(Y,'grouped') 1 40 0.5 30 % Three-dimensional bar chart % style grouped Y = cool(7); bar3(Y,'stacked') 0.6 0.4 0.2 0 20 0 -0.2 10 -0.4 -0.5 0 1 -1 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 0.5 2 -1 0 -1 -0.5 -1 -0.5 0 0 -0.5 %plots velocity vectors as arrows with %components (px,py) [x,y] = meshgrid(-2:.2:2,-1:.15:1); z = x .* exp(-x.^2 - y.^2); [px,py] = gradient(z,.2,.15); contour(x,y,z), hold on quiver(x,y,px,py); hold off, axis image 1 1 0.5 0 0.5 -2 -1 % Linear 3-D plot t = 0:pi/50:10*pi; plot3(sin(t), cos(t), t) grid on axis square 1 % Three-dimensional velocity plot [X,Y]=meshgrid(-2:0.25:2,... -1:0.2:1 ); Z = X.* exp(-X.^2 - Y.^2); [U,V,W] = surfnorm(X,Y,Z); quiver3(X,Y,Z,U,V,W,0.5); 1.5 0.5 1 0 0.5 0 1 -0.5 1 0.5 2 2 0 -0.5 -1 -1 1 0 0 -0.5 % Volumetric slice plot % Visualize the function % v = x*exp(-x.2-y2-z2) [x,y,z] = meshgrid(-2:.2:2, 2:.25:2, -2:.16:2); v = x.*exp(-x.^2-y.^2-z.^2); xslice = [-1.2 .8 2]; yslice = 2; zslice = [-2 0]; slice(x,y,z,v,xslice,yslice,zslice); colormap jet; rotate3d on 0.5 1 0 -1 -1 -2 % Plot three-dimensional discrete % sequence data [X,Y]=meshgrid(-2:0.5:2,... -1:0.4:1); Z = X.* exp(-X.^2 - Y.^2); stem3(X,Y,Z+1,'fill') -2 % Waterfall plot [X,Y] = meshgrid(-2:0.1:2,... -1:0.1:1); Z = X.* exp(-X.^2 - Y.^2); waterfall(X,Y,Z) 3 25 2.5 0.4 2 20 1.5 0.2 0.1 0 -0.1 1 15 0 0.2 0. 3 -0.1 -0.3 -0.2 -0.4 2 0.2 0 -0.1 -1 0 -0.2 10 0.1 -0.5 -0.2 -0.3 -0 .4 0.5 0.1 5 1 -1.5 -2 -2 2 1 0 0 -1 -1.5 -1 -0.5 0 0.5 1 1.5 2 2 4 6 8 10 12 14 16 18 20 -1 -2 -2 14 % Two-dimensional contour plot [X,Y] = meshgrid(-2:.2:2,-2:.2:3); Z = X.*exp(-X.^2-Y.^2); [C,h] = contour(X,Y,Z); clabel(C,h); colormap cool; % Two-dimensional contour plot [X,Y] = meshgrid(-2:.2:2,-2:.2:3); Z = X.*exp(-X.^2-Y.^2); [C,h] = contourf(Z,10); colormap autumn % Three-dimensional contour plot [X,Y] = meshgrid([-2:.25:2]); Z = X.*exp(-X.^2-Y.^2); contour3(X,Y,Z,30); colormap jet grid off % Display a surface and % contour plot [X,Y] = meshgrid([-2:.15:2]); Z = X.*exp(-X.^2-Y.^2); surfc(X,Y,Z); % Three-dimensional shaded surface % from z components in matrix Z [X,Y] = meshgrid([-2:.15:2]); Z = X.*exp(-X.^2-Y.^2); surf(X,Y,Z); % Three-dimensional shaded surface % from z components in matrix Z [X,Y] = meshgrid([-2:.15:2]); Z = X.*exp(-X.^2-Y.^2); surfl(X,Y,Z); shading interp; colormap(gray); % Combination mesh/contourplot [X,Y] = meshgrid([-2:.15:2]); Z = X.*exp(-X.^2-Y.^2); meshc(X,Y,Z); % 3-D mesh with reference plane [X,Y] = meshgrid([-2:.15:2]); Z = X.*exp(-X.^2-Y.^2); mesh(X,Y,Z); % 3-D mesh with reference plane [X,Y] = meshgrid([-2:.15:2]); Z = X.*exp(-X.^2-Y.^2); meshz(X,Y,Z); % Triangular mesh plot [X,Y] = meshgrid([-2:.15:2]); Z = X.*exp(-X.^2-Y.^2); tri = delaunay(X,Y); trimesh(tri,X,Y,Z) % Triangular surface plot [X,Y] = meshgrid([-2:.15:2]); Z = X.*exp(-X.^2-Y.^2); tri = delaunay(X,Y); trisurf(tri,X,Y,Z) % Ribbon plot [x,y] = meshgrid(-3:.5:3,-3:.1:3); z = peaks(x,y); ribbon(y,z); colormap hsv 15 INTERFEJS GRAFICZNY – FUNKCJE KOMUNIKACYJNE Menu menu polecenie o składni: choice = menu(header, item1, item2, ... ) generuje menu wyboru o tytule określonym przez argument header i zawierające przyciski z nazwami zawartymi w argumentach: item1, item2,... itemn. Parametr wyjściowy jest wielkością skalarną odpowiadającą wybranemu przyciskowi. Nie ma ograniczeń na liczbę przycisków. Przykładowo wprowadzając polecenie: k = menu('choose a color','red','blue','green') otrzymujemy następujące okno: i możemy dokonać wyboru opcji poprzez kliknięcie odpowiedniego przycisku. Przykład 4. k=1; while (k<3) k = menu('Select action', 'Plot Data1','Plot Data2','END'); switch k case 1 plot(sin(0:0.1:2*pi)) case 2 plot(cos(0:0.1:2*pi)) end end Input dialog box. INPUTDLG Input dialog box. Answer = inputdlg(Prompt) funkcja generuje okno dialogowe umożliwiające wprowadzenie ciągu alfanumerycznego. Parametr wejściowy prompt jest typu „cell array” i zawiera tekst wypisywany w polu dialogowym. Pole dialogowe może być wykorzystane do wprowadzenia zmiennej tekstowej lub numerycznej 16 Przykład pola dialogowego do definiowania zmiennej tekstowej: prompt={'Enter the colormap name:'}; answer=char(inputdlg(prompt)); Przykład pola dialogowego do definiowania zmiennej numerycznej: prompt={'Enter the velocity:'}; vel=str2num(char(inputdlg(prompt))); Question dialog box ButtonName=QUESTDLG(Question) polecenie generuje okno dialogowe często stosowane w programach. W oknie tym znajdują się trzy przyciski z napisami „Yes”, „No” i „Cancel”. Funkcja po kliknięciu zwraca string odpowiadający wybranemu przyciskowi. Przykład 5. ButtonName=questdlg('Do you like to change the parameters?'); switch ButtonName, case 'Yes', disp('Action for Yes'); case 'No', disp('Action for No'); end Po wykonaniu poleceń generowane jest okno: i klikając myszą możemy dokonać wyboru odpowiedniej opcji. INTERPOLACJA I DECYMACJA Interpolacja jeden z rodzajów aproksymacji funkcyjnej, polegający na wyznaczaniu w określonym przedziale funkcji y = f(x), która dla danych liczb x1<x2<…<xn z danego przedziału przyjmuje z góry dane wartości y1,y2,..,yn . Dla jednoznaczności rozwiązania tego problemu żąda się dodatkowo, by funkcja f(x) była wielomianem możliwie niskiego stopnia. Interpolacja jest często stosowana w naukach doświadczalnych, gdzie dysponuje się zazwyczaj skończoną liczbą danych do określenia zależności między wielkościami. 17 Jeśli mamy ciąg n różnych danych xk i dla każdego xk przyporządkowaną wartość yk, wówczas szukamy funkcji f takiej, aby: Parę xk,yk nazywamy punktem pomiarowym a funkcję f interpolacją punktów pomiarowych. Interpolacja w Matlabie odbywa się za pomocą wielomianów lub za pomocą szybkiej transformaty Fouriera. Możemy wyróżnić interpolacje jednowymiarową dla funkcji postaci y=f(x) i dwuwymiarową dla funkcji postaci z=f(x,y). Interpolacja jednowymiarowa Używana często do analizy danych i do dopasowywania wykresów 2-D. W Matlabie deklarowana jest za pomocą funkcji. yi = interp1(x,y,xi,method) Funkcja ta zwraca wektor yi odpowiadający elementom xi , który powstał w efekcie interpolowania wektora x względem y daną metodą. przy czym: x - wektor wartości x danych pomiarowych y - wektor wartości y=f(x) danych pomiarowych xi - zwiększona ilość wartości x ( wielkość wektora x < wartości wektora xi) yi - wartości interpolowane y dla punktów xi daną metodą method - metoda interpolacji method = 'nearest' – metoda przybliżania wartości punktów przy pomocy wartości najbliższego punktu method = 'linear' - metoda przybliżania wartości punktów przy pomocy linii utworzonej pomiędzy dwoma poszczególnymi punktami method = 'spline' - metoda przybliżania wartości punktów przy pomocy wielomianu 3-go stopnia pomiędzy punktami method = 'pchip' or 'cubic' - metoda przybliżania wartości punktów przy pomocy wielomianu 3-go stopnia Hermita Rys. 1. Funkcja y = f(x) wraz z aproksymowanymi punktami xi i yi 18 Rys. 2. Porównanie metod interpolacji 2D % skrypt porównujący poszczególne metody interpolacji funkcji y=sin(x) x = 0:10; y = sin(x); xi = 0:.25:10; % interpolacja dla metody nearest yi = interp1(x,y,xi,'nearest'); subplot(2,2,1); plot(x,y,'o',xi,yi); title('nearest point'); % interpolacja dla metody linear yi = interp1(x,y,xi,'linear'); subplot(2,2,2); plot(x,y,'o',xi,yi); title('linear'); % interpolacja dla metody spline yi = interp1(x,y,xi,'spline'); 19 subplot(2,2,3); plot(x,y,'o',xi,yi); title('cubic spine'); % interpolacja dla metody cubic yi = interp1(x,y,xi,'cubic'); subplot(2,2,4); plot(x,y,'o',xi,yi); title('cubic'); Interpolacja dwuwymiarowa Używana jest najczęściej do przetwarzania obrazu i wizualizacji danych. ZI = interp2(X,Y,Z,XI,YI,method) Funkcja ta zawraca wartości interpolowane ZI dla zwiększonej ilości punktów XI iYI funkcji dwuwymiarowej Z=F(X,Y). Funkcja ta zwraca macierz ZI odpowiadający elementom XI i YI , który powstał w efekcie interpolowania wektora X i Y względem Z daną metodą. Przy czym: X- tablica wartości x dla wykresów 3D Y- tablica wartości y dla wykresów 3D XI - nowe tablica wartości x przy czym (rozmiar X jest mniejszy od XI) YI - nowe tablica wartości y przy czym (rozmiar Y jest mniejszy od YI) Z – tablica wartości Z=F(X,Y) ZI –tablica wartości interpolowanych method - metoda interpolacji method = 'nearest' – metoda przybliżania wartości punktów przy pomocy wartości najbliższego punktu method = 'linear' - metoda przybliżania wartości punktów przy pomocy linii utworzonej pomiędzy dwoma poszczególnymi punktami method = 'spline' - metoda przybliżania wartości punktów przy pomocy wielomianu 3-go stopnia pomiędzy punktami method = 'pchip' or 'cubic' - metoda przybliżania wartości punktów przy pomocy wielomianu 3-go stopnia Hermita Rys. 3. Funkcja Z = F(X,Y) wraz z aproksymowanymi punktami XI,YI i ZI 20 Rys. 4. Porównanie metod interpolacji 3D % Porównanie metod interpolacji 3D [X,Y] = meshgrid(-3:1:3); Z = peaks(X,Y); [XI,YI] = meshgrid(-3:.1:3); % dla metody nearest ZI = interp2(X,Y,Z,XI,YI,'nearest'); subplot(1,2,1); mesh(X,Y,Z), hold, mesh(XI,YI,ZI+15) hold off axis([-3 3 -3 3 -5 20]); subplot(1,2,2); contour(XI,YI,ZI); colorbar; title('nearest'); pause % dla metody linear ZI = interp2(X,Y,Z,XI,YI,'linear'); subplot(1,2,1); mesh(X,Y,Z), hold, mesh(XI,YI,ZI+15) hold off axis([-3 3 -3 3 -5 20]); subplot(1,2,2); contour(XI,YI,ZI); 21 colorbar; title('linear'); pause % dla metody spline ZI = interp2(X,Y,Z,XI,YI,'spline'); subplot(1,2,1); mesh(X,Y,Z), hold, mesh(XI,YI,ZI+15) hold off axis([-3 3 -3 3 -5 20]); subplot(1,2,2); contour(XI,YI,ZI); colorbar; title('spline'); pause % dla metody cubic ZI = interp2(X,Y,Z,XI,YI,'cubic'); subplot(1,2,1); mesh(X,Y,Z), hold, mesh(XI,YI,ZI+15) hold off axis([-3 3 -3 3 -5 20]); subplot(1,2,2); contour(XI,YI,ZI); colorbar; title('cubic'); Interpolacja odbywać może się za pomocą szybkiego przekształcenia Fouriera przy pomocy funckci interpft(x,n) Jest to: - interpolacja przy pomocy transformaty Fouriera - y=f(x) musi być funkcją periodyczną - dane przekształcane są przy pomocy transformaty Fouriera - następnie następuje przekształcenie odwrotne z n ( większą ilością punktów) ilością punktów Decymacja w środowisku Matlab polega na zmniejszeniu ilości punktów x i odpowiadającym im wartościom y funkcji y=f(x).Operacja decymacji polega na tym, że dane funkcji filtrowane są za pomocą filtru dolnoprzepustowego, i następnie ponownie próbkowany z mniejszą ilością danych. Operacja decymacji odbywa się funkcją y = decimate(x,r) – zmniejszenie ilości punktów x o dzielnik r , przy pomocy filtru dolnoprzepustowego stopnia ósmego Chebyshev Type I 22 y = decimate(x,r,n) – zmniejszenie ilości punktów x o dzielnik r , przy pomocy filtru dolnoprzepustowego stopnia n-tego Chebyshev Type I y = decimate(x,r,'fir') - zmniejszenie ilości punktów x o dzielnik r , przy pomocy filtru dolnoprzepustowego 30 punktowego typu FIR y = decimate(x,r,n,'fir') - zmniejszenie ilości punktów x o dzielnik r , przy pomocy filtru dolnoprzepustowego n punktowego typu FIR Rys. 5. Decymacja sygnału dyskretnego 2D % listing programu pokazujący decymacje sygnału dyskretnego t = 0:.00025:1; x = sin(2*pi*30*t) + sin(2*pi*60*t); y = decimate(x,4); subplot(2,1,1); stem(x(1:120)), axis([0 120 -2 2]); title('Original Signal'); subplot(2,1,2); stem(y(1:30)); title('Decimated Signal'); Dopasowanie krzywej - w środowisku Matlab mozliwe jest przeprowadzenie w prosty sposób dopasowania wielomianu dowolnego stopnia do danych podanych w postaci zestawu punktów. wielomian=polyfit(x,y,n) - umożliwia obliczenie współczynników wielomianu o stopniu n, który jest najlepiej "dopasowany" do zadanego zestawu danych (x,y) x i y - współrzędne punktów dyskretnych n - stopień wielomianu wielomian - zawiera współczynniki wielomianu dopasowującego wartości y do x z wykorzystaniem metody najmniejszych kwadratów. Zawiera m=n+1 współczynników odpowiadających potęgom zmiennej x wielomianu w porządku malejącym zgodnie z: wielomian(x) = c1xn + c2xn-1 + ... cm W celu określenia pierwiastków wielomianu można użyć polecenia roots: 23 r = roots(wielomian); gdzie: r - wektor kolumnowy zawierający pierwiastki wielomianu wielomian - zawiera współczynniki wielomianu w porządku malejącym W celu wykonania operacji "odwrotnej", czyli określenia współczynników wielomianu na podstawie pierwiastków można użyć polecenia poly: wielomian = poly(r) Określenia wartości wielomianu o współczynnikach wielomian dla zadanego wektora x można użyć funkcji polyval: y = polyval(wielomian, x); Przykład Dioda Zenera posiada charakterystykę określoną przez punkty: uD = [-4.686 -4.694 -4.704 -4.708 -4.712 -4.715] iD= [-1.187e-2 -1.582e-2 -2.376e-2 -2.773e-2 -3.170e-2 -3.568e-2] Narysuj charakterystykę prądu iD w funkcji napięcia uD i określ wartość rezystancji dynamicznej rD, jeżeli: rD = ΔuD / ΔiD iD = m ∙ uD + I0 % Diada ud = [-4.686 -4.694 -4.704 -4.708 -4.712 -4.715]; id= [-1.187e-2 -1.582e-2 -2.376e-2 -2.773e-2 -3.170e-2 -3.568e-2]; % okreslenie wspolczynnikow; na podstawie wzoru na prad zaleznosc jest % liniowa -> wielomian 1-ego stopnia % i_wiel = m * ud + io wsp_wiel=polyfit(ud,id,1); m = wsp_wiel(1); io = wsp_wiel(2); % okreslenie wektora ud o zwiekszonej ilosci punktow (101pkt) ud_wiel = [ud(1):(ud(end)-ud(1))/100:ud(end)]; id_wiel = m * ud_wiel + io; % obliczenie rezystancji dynamicznej; rezygnacje można obliczyć jako wartość kąta nachylenia stycznej w danym punkcie charakterystyki do osi OX. Odpowiada to w tym przypadku odwrotności współczynnika kierunkowego. rd = 1/m; % wykreślenie charakterystyki figure(1); plot(ud,id,'bo',ud_wiel,id_wiel,'k-') xlabel('\it U\rm_D'); ylabel('\it I\rm_D'); title('\it I\rm_D vs \it U\rm_D'); 24 Program ćwiczenia 1. Wykreśl funkcję f(x,y) = sin(x) * cos(y) w przedziale <0:10> co 0.5, używając dwóch funkcji graficznych, pcolor i surf. Dodaj opis osi, wprowadź legendę oraz skalę barw. Wykorzystaj mapy kolorów jet, hot, oraz gray. 2. Opisz osie i tytuł wykresów 3. Wykreśl wykres nie- i interpolowany na jednym wykresie. Przy czym wykres nieinterpolowany wykreślić należy w postaci znaczników gwiazdek ( * ) koloru czarnego a wykres interpolowany w postaci linii ciągłej koloru czerwonego. 4. Wstaw legendę i opis osi. 5. Wykonaj operację decymacji sygnału y=sin(x)*cos(x) do 10 punktów i wykreśl wykres sygnału oryginalnego i decymowanego na jednym wykresie w kolorem czerwonym i linią przerywaną dla sygnału oryginalnego i żółtym linią ciągła dla sygnału decymowanego , wstaw opis osi i legendę. 6. Wykorzystując powyższe funkcje komunikacyjne napisz skrypt do obliczania układu równań postaci: 3x1 x 2 x3 0 5 x1 3x2 2 x3 3 7 x1 2 x 2 2 x3 5 z możliwością wprowadzania wartości macierzy współczynników A oraz macierzy wynikowej B. Wprowadź możliwość wyboru sposobu prezentacji wyników (wykreślanie za pomocą funkcji bar lub wyświetlanie w Workspace). % definicja inputdlg prompt={'a11: ', 'a12: ', 'a13: ','a21:', 'a22: ','a23:', 'a31: ',... 'a32:', 'a33: ', 'b11: ', 'b21: ','b31: '}; lineNo=1; titleWin='Parametry wejsciowe'; def={'3','1','-1','5','3','-2','7','2','2','0','-3','5'}; answer=inputdlg(prompt,titleWin,lineNo,def); % odzyskiwanie wartosci [temp]= str2num(char(answer)); %wczytywanie wartosci do macierzy A i B A=[temp(1:3)';temp(4:6)';temp(7:9)']; B=temp(10:12); % rozwiazanie ukladu rownan X=A^-1*B; %button = questdlg('pytanie','tytul okna','przycisk 1','przycisk 2', %'domyslny przycisk') Type = questdlg('Co zrobic z wynikami?', ... 'Pytanie?', ... 'Wykresl','Pokaz wyniki','Wykresl'); % okreslenie reakcji na wybrany przycisk switch Type case 'Wykresl', figure; bar(X,'k'); title('wartosci elementow macierzy X'); figure; bar(A); legend('wiersz 1-szy', 'wiersz 2-gi', 'wiersz 3-ci','Location', ... 'NorthOutside'); title('wartosci elementow macierzy A'); figure; 25 bar(B); title('wartosci elementow macierzy B'); case 'Pokaz wyniki', clc disp('Rozwiazanie dla macierzy A postaci :'); A disp('i macierzy B postaci :'); B disp('jest dane :'); X end 26