25.11.2008 Grafy, úprava, popisky, vizualizace výsledků výpočtů - pokračování Další typy grafů - plot - obdobou jsou: semilogx použití log. osy x semilogy použití log. osy y loglog obě osy jsou log. Více grafů v jednom okně subplot(kolik_radku_s_grafy, kolik_sloupcu_s_grafy, ktery_graf) 1 <- to je číslo-který graf 2 3 4 5 6 subplot(3,2,4); 1 2 3 2 Jak na to? subplot(2,3,1); něco tam vykreslíme; subplot(2,3,2); něco tam vykreslíme; subplot(2,3,3); něco tam vykreslíme; subplot(2,1,2); něco tam vykreslíme; Subgrafy se chovají jako samostatné mají svůj titulek, své nastavení hold atd. plot3(x,y,z) 3D graf, křivkový vyjadřuje obvykle závislost y a z na x Plošné grafy jako mesh, surf atp. vyjadřují obvykle závislost z na x a y
Grafy, úprava, popisky, vizualizace výsledků výpočtů - lze zobrazovat jak rovinné, tak 3-D (síťové, křivkové, plošné) grafy - v menu Help -> Demos - ukázky některých grafických funkcí - příkaz alpha nastavuje průhlednost grafů Př.: surf(cylinder) alpha(0.4) % průhlednost 40% - 0 je úplně průhledný a 1 je neprůhledný (viz výchozí stav) Příkaz plot - vytváří rovinné grafy závislosti x a y - jsou-li x a y vektory o stejné délce, pak plot(x,y) otevře grafické okno a vykreslí x-y graf Př.: příkazy pro graf funkce sinus na intervalu od -4 do 4 x = -4:.01:4; y = sin(x);
plot(x,y) - stiskem libovolné klávesy způsobí návrat z grafickém modu na příkazový řádek - příkaz shg (show graph = zobraz graf) vrátí aktuální grafickou obrazovku (aktuální figure) Př: - nakreslit graf funkce y = e -x2 na intervalu od -1.5 do 1.5 function y=enaminusxna2(x) % pocita e na minus druhou mocninu x y=exp(-x.^2); - potom volání a vykreslení x = -1.5:.01:1.5; vysledek = enaminusxna2(x); plot(x,vysledek) - před znak ^ napíšeme tečku - jistota, že umocnění proběhne po složkách Př: - grafy parametrizovaných křivek t=0:.001:2*pi; x=cos(3*t); y=sin(2*t); plot(x,y)
grid - přikreslí do grafu čtvercovou síť - opakované použití grid opět síť vypne - lze použít příkazy grid on a grid off - viz minulá přednáška titulky, popisky os a text přímo do grafu umožňují příkazy s argumentem řetězec title titulek grafu xlabel popis osy x ylabel popis osy y gtext interaktivně vkládaný text umístění textu na zadané text souřadnice
- měřítko pro osy se volí automaticky axis změna měřítka os, bez parametrů vrátí vektor s rozsahy os Př: axis ans = -1.0000 1.0000 0.3000 1.0000 - je-li zadán c = [xmin, xmax, ymin, ymax] - čtyřprvkový vektor axis(c); % nastaví měřítko podle předpisu v c - lze též zapsat takto: axis([xmin, xmax, ymin, ymax]); - samotný příkaz axis zmrazí do odvolání, pro všechny grafy, aktuální nastavení - zadá-li se příkaz axis ještě jednou, vrátí se nastavení na automatické měřítko axis('square') - zajistí, že na obou osách bude použito stejné měřítko graf vytvoří čtvercovou oblast
axis('equal') stejný krok na obou osách, rovnost měřítek tělesa ve 3D např. koule nebudou zmáčknutá, deformovaná axis off vypne osy v grafu (axis on je zase zapne) axis on axis([-0.5, 0, 0.5, 1]);
axis('normal') návrat k výchozímu stavu co se týče "tvaru" axis('auto') návrat k výchozímu stavu co se týče mezí os - další parametry viz help axis Základním je příkaz plot - pro zobrazení závislosti dvou proměnných nebo průběhu jedné proměnné data jsou předávána ve formě sloupcových nebo řádkových vektorů - obecně má příkaz tvar plot(x,y,s,...) (x a s mohou být vynechány) Př: plot(sin(0:0.01:4*pi)) - vykreslí dvě periody funkce sinus - vhodnější je nadefinovat proměnné X=[0:0.01:4*pi]' Y=sin(X) plot(y) - pro tento rychlý graf též tlačítko v okně Workspace:
- parametr S specifikuje barvu a způsob vykreslení průběhu - skupina parametrů X,Y,S lze i několikrát opakovat - parametr Y nemusí být jen sloupcový vektor, více sloupcových vektorů složených do matice, provede vykreslení několika průběhů Př: - na úplnou formu příkazu plot x=[0:0.01:4*pi]' plot(x,[sin(x)./x],'k-',x,[sin(x),cos(x)],'r--') - vykreslí průběhu funkce [sinx/x] - jsou přidány funkce sinx a cosx - znak 'k' definuje černou barvu - znak 'r' definuje červenou barvu - znak '-' definuje plnou čáru - znaky '- -' definují čárkovanou čáru Nebo jinak totéž: function nekolik_grafu x=[0:0.01:4*pi].'; y1 = sin(x)./x; y23 = [sin(x),cos(x)]; % pozor, půjde o dva sloupce!!!!
plot(x,y1,'k-',x,y23,'r--') - MATLAB umožňuje vykreslit více grafů do jednoho okna: 1) vedle sebe, pod sebe (subplot) viz minulá přednáška 2) přes sebe - hold on (zpátky na mazání předch. grafu hold off) x=cos(3*t); plot(t,y) hold on plot(t,x) nebo plot(t,y,t,x) % dokáže aut. přepínat barvy grafů
Př: vykreslení dvou grafů do jednoho obrázku x=0:.01:2*pi; y1=sin(x); y2=sin(2*x); y3=sin(4*x); plot(x,y1,x,y2,x,y3) Př: sestavení matice Y, která jako sloupce obsahuje funkční hodnoty x=0:.01:2*pi; Y=[sin(x)', sin(2*x)', sin(4*x)']; plot(x,y) - příkaz hold zmrazí aktuální grafickou obrazovku a všechny následující grafické výstupy do ní přikresluje - opětovné zadání příkazu hold ruší příkaz "hold" původní - ve verzi 4.0 lze použít i příkazy hold on a hold off Nastavení typů čar a způsob vykreslování bodů Př: x=0:.01:2*pi; y1=sin(x); y2=sin(2*x); y3=sin(4*x); plot(x,y1,'--',x,y2,':',x,y3,'+') - na výstupu bude první graf čárkovaně - druhý tečkovaně - třetí jako bodový - na každém bodě se zobrazí + - uvedením značky (Marker) zároveň říkám, že nechci čáru grafu. - pokud bych čáru chtěl zároveň se značkou, např. se značkou + - je nutno uvést parametr: '+-' Druhy čar a znaků pro grafiku Čáry:
- plná - - čárkovaná -- - tečkovaná : - čerchovaná -. (pozor '.-' by znamenalo značka kolečko a spojit plnou čarou) Značky: - bod. - plus + - hvězdička * - kroužek o (znak malé o) - křížek x (znak malé x) - různé trojúhelníky > < ^ - další viz help plot Barvy b blue modrá g green zelená r red červená c cyan modrozelená (tyrkysová) m magenta purpurová y yellow žlutá k black černá Příkaz plot některé parametry (obdobné jsou u semilogx, semilogy, loglog): Tloušťka čáry: plot(x, y, 'LineWidth', 5);
Nastavení na červenou barvu, značka trojúhelník vrcholem doprava, tloušťka čáry 3, velikost značky 16, barva vnitřku značky na červenou 'r', barva okraje značky na purpurová 'm': plot(a, b, 'r>', 'LineWidth', 5, 'MarkerSize', 16, 'MarkerFaceColor', 'r', 'MarkerEdgeColor', 'm'); 3D graf křivkový plot3(x,y,z) - lze použít podobné příkazy a parametry jako ve 2D (plot) plot3(t,t.*sin(t),t.*cos(t), 'LineWidth', 2) axis vis3d
Graf funkce - lze zadat do apostrofů pravou stranu funkce, druhý parametr je vektor o dvou prvcích [od, do]: fplot('x.^2+3',[-5, 5]) - zadat odkaz na m-file (@nazev_m-file), druhý parametr je vektor o dvou prvcích [od, do]:: fplot(@sin,[-5, 5]) - viz též funkce ezplot, ezmesh, ezsurf kde ez značí easy-to-use Př.: function demo_funkce while (1) kterou = input('kterou funkci ukazat (0 pro ukonceni): '); switch kterou case 0 break; case 1 fprintf('\nbudeme kreslit sinus.\n'); testf = @sin; case 2 fprintf('\nbudeme kreslit cosinus.\n'); testf = @cos;
case 3 fprintf('\nbudeme kreslit e na x na 2.\n'); testf = @enaxna2; otherwise fprintf('\ntakovou funkci tu nemam.\n'); continue; end; t = [0:0.1:2*pi]; y = testf(t); if (exist('graf')) close(graf); clear graf; end; graf = figure; plot(t,y); end; close(graf) fprintf('\nna shledanou, hezky den...\n'); Poznámky: - znak @ obecně slouží pro vytvoření odkazu (reference) na funkci - exist('nejak_promenna') test zda nějaká proměnná existuje (vrací 0 nebo 1 tj. ne / ano) Vytváření hodnot pro osu x, resp. t (pro grafy a výpočty): - vektorem - [od:krok:do] použijeme tehdy, známe-li meze (od, do) a zvolenou velikost kroku - pomocí linspace linspace(od, do, kolik_kroků) použijeme tehdy, známe-li meze (od, do) a počet kroků pozor pokud uvedeme jen parametry od a do, počet kroků je automaticky 100
x3 = linspace(od,do,100) - pomocí logspace x4 = logspace(od,do,kolik_kroků) vytvoří logaritmický vektor hodnot s počtem kolik_kroků hodnoty jsou 10 od až 10 do pozor pokud uvedeme jen parametry od a do, počet kroků je automaticky 50 x4 = logspace(2, 8, 10) bude od 10 2 až 10 8 a 10 kroků (vhodné např. budu-li potom graf vykreslovat stejně pomocí semilogx, lineární osa je zbytečná) Další typy grafů spy pro analýzu řídkých matic (grafické zobrazení) spy(b) body mi v grafu ukáží nenulové hodnoty - dále např. gplot Funkce pro arcustangens: atan "normální" atan2 počítá přes všechny 4 kvadranty komplexní roviny, má dva parametry - imaginární a reálnou část komplexního čísla
Např.: z = -3 + 4i; theta = atan2(imag(z),real(z)) úhel spojnice počátku a bodu v komplexní rovině vzhledem k ose x fáze theta = angle(z) totéž
Graf v polárních souřadnicích polar(uhel, vzdalenost_od_počátku) polar(angle(z), abs(z), '>') Přímo pro zobrazení komplexních čísel: compass(cislo) compass(z) Dále např. funkce feather a další. Pozn.: užitečná funkce pol2cart převod polárních na kartézské [x,y] = pol2cart(uhel, vzdálenost_od_počátku); A další funkce: errorbar chybové úsečky stairs "schodový" graf bar slopcový graf Dále viz na konci souboru seznam funkcí MATLABu
3D "plošné" grafy 3D plochy a sítě mesh(x, y, z) vykreslí do souřadnic x,y síť (drátěný model) tvarovanou podle z (lze též uvést mesh(z) nemám potom regulérní hodnoty x,y) surf(x,y,z) - vykreslí do souřadnic x,y plochu (vybarvenou) tvarovanou podle z (lze též uvést mesh(z) nemám potom regulérní hodnoty x,y) Př.: Funkce: z = sin ( ) 2 2 x + y x 2 + [X,Y] = meshgrid(-20:0.5:20); R = sqrt(x.^2 + Y.^2); Z = sin(r)./ R; mesh(x,y,z) y 2 Pro různé osy X a Y: [X,Y] = meshgrid(-20:0.5:20,-40:0.5:40); [X,Y] = meshgrid(linspace(-20,20,50),linspace(- 40,40,50)); Proč používáme meshgrid: - pro usnadnění zápisu výpočtu s takto vytvořenými souř. mohu zapisovat rovnice "normálně" dle matematického zápisu, pouze nesmím zapomenout na tečka-notaci. Pozn:. Funkce vracející jako výsledek dvě a více hodnot (může být i dvě matice) bude mít hlavičku: function [prvni,druha]=vraci_dve(parametry)...atd... první = nejaký výsledek; druha = nějaký výsledek;
Volání této funkce bude potom vypadat např.: [a, b] = vraci_dve(x) Příkladem takové funkce je meshgrid. Pozn:. Při prohlížení proměnných s více hodnotami je občas výhodné nechat si z array editoru (prohlížeč proměnných) vykreslit grafy z vybraných částí této proměnné viz minulá přednáška Použijeme surf na stejný výpočet: surf(x,y,z) a doplníme barevnou stupnici (škálu) colorbar - plošné (pohled shora) vykreslení např. vrstevnic, ekvipotenciál atp.: contour(x,y,z) contour(x,y,z,n) chci vykresli n-úrovní (v podstatě určím jak hustě se mají kreslit vrstevnice) contourc(x,y,z,30) - trojrozměrné vykreslení např. vrstevnic, ekvipotenciál atp.: contour3(x,y,z) - obdoba contour, ale vykresleno jako barevné plochy pcolor(x,y,z) - vyhlazení hran barevných grafů shading faceted výchozí stav, nevyhlazené, vykreslené hrany shading flat nevyhlazené, bez vykreslených hran shading interp vyhlazené s barevnými přechody, bez vykreslených hran Např. function patvar
[X,Y] = meshgrid(-3:0.02:-1.5,1.7:0.02:2.3); Z = sin(x.^2).* (cos(sin(x) - cos(y))./ cos(y)); % mesh(x,y,z) % mesh(z) figure surf(x,y,z) shading interp colorbar figure contour(x,y,z) figure contour3(x,y,z) figure pcolor(x,y,z) shading interp - grafy lze kombinovat využijeme příkaz hold on - je více variant příkazů, některé kombinují vlastnosti dvou dohromady: meshc, surfc (mesh a surf a k tomu contour), meshz (mesh s "podstavcem"), surfl (surf s osvětlení) colormap(paleta) nastavuje barevnou paletu pro graf - parametr paleta je matice o 3 sloupcích představujících Red Green Blue, položky mají hodnoty od 0 do 1 (tj. 0 až 100%) - předpřipravené palety gray, hot, copper, hsv, cool Další typy grafů Zobrazení gradientů funkce: quiver(parametry) neumí počítat gradient umí vykreslit graf ze šipek, které mohou představovat gradienty v daném bodě function splouch [X,Y] = meshgrid(-7:0.5:7,-7:0.5:7); R = sqrt(x.^2 + Y.^2); Z = sin(r)./ R; % vypocteme gradient
[px,py] = gradient(z,.5,.5); % krok pro vypocet gradientu, ne pro vykresleni % vykreslime gradient pomoci quiver figure quiver(x,y,px,py); % gradient je vykreslen s krokem podle kroku X a Y