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 3 5 subplot(3,2,4); 1
2 4 6
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ř: 2 - nakreslit graf funkce y = e-x 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 xlabel ylabel gtext text
titulek grafu popis osy x popis osy y interaktivně vkládaný text umístění textu na zadané 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 g green r red c cyan m magenta y yellow k black
modrá zelená červená modrozelená (tyrkysová) purpurová žlutá č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 10od až 10do – pozor pokud uvedeme jen parametry od a do, počet kroků je automaticky 50 x4 = logspace(2, 8, 10) – bude od 102 až 108 – 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 x 2 + y 2
)
x2 + y2
[X,Y] = meshgrid(-20:0.5:20);
R = sqrt(X.^2 + Y.^2);
Z = sin(R) ./ R; mesh(X,Y,Z) 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