16.1.015 Výpočetní systémy umožňují vykreslit více grafů do jednoho grafického okna: vedle sebe, pod sebe - rozdělení grafického okna (subplot) přes sebe např. plot(x 1,y 1,x,y,,x n,y n ) přes sebe hold přidrží aktuální graf v grafickém okně (zmrazí aktuální grafickou obrazovku) a všechny následující grafické výstupy do něho přikresluje, lze tedy nakreslit více grafů do jednoho grafického okna postupně vypnutí, konec možnosti kreslit více grafů do jednoho grafického okna (tj. opět mazání předchozích grafů) text(x,y,'nejaky text') umístí text na souřadnice x, y gtext('nejaky g-text') umístí text na souřadnice tam, kam je kliknuto myší ( platí v MATLABu) Soustavy souřadnic kartézská soustava souřadnic je taková soustava souřadnic, u které jsou souřadné osy vzájemně kolmé a protínají se v jednom bodě - počátku soustavy souřadnic. plot(x,y),semilogx(x,y),semilogy(x,y), polární soustava souřadnic je taková soustava souřadnic v rovině, u které jedna souřadnice (označovaná r) udává vzdálenost bodu od počátku souřadnic, druhá souřadnice (označovaná φ) udává úhel spojnice tělesa a počátku od zvolené osy ležící v rovině. polar(φ,r) plot(x,y,s) rovinný graf s lineárním dělením na osách x, y (tj. klasický graf x, y, v kartézských souřadnicích), jsou-li x a y vektory o stejné délce, pak plot(x,y) vykreslí x-y graf, semilogx(x,y,s) graf jako plot, ale s logaritmickou stupnicí (o základu 10) na ose x, semilogy(x,y,s) graf jako plot, ale s logaritmickou stupnicí (o základu 10) na ose y, loglog(x,y,s) graf jako plot, ale s logaritmickou stupnicí (o základu 10) na obou osách x, y. polar(uhel,velikost,s) graf v polárních souřadnicích compass(u,v,s) vektor se složkami u, v ve formě šipky vycházející z počátku Parametr S je řetězec, který musí být v apostrofech (některé výpočetní systémy připouštějí i uvozovky) a specifikuje barvu, způsob vykreslení a styl křivky nebo typ značky bodu. Pozn. barvy, typy značek bodů, styly čar viz předchozí přednášky a viz help plot Základním je pro vykreslení grafu v kartézských souřadnicích je příkaz plot: plot(x,y,s) rovinný graf s lineárním dělením na osách x, y 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) skupinu parametrů x,y,s lze i několikrát opakovat parametr y nemusí být jen jeden vektor, více sloupcových vektorů složených do matice provede vykreslení několika průběhů sestavení matice Y, která jako 3 sloupce obsahuje funkční hodnoty y 1 = sin(x), y = sin(x), y 3 = sin(4x), pro x od 0 do π, a vykreslení grafů y 1 (x), y (x), y 3 (x) pomocí dat v matici Y. x = 0:.01:*pi; Y = [sin(x).', sin(*x).', sin(4*x).']; % tři sloupce plot(x.',y) leg('sin(x)','sin(x)','sin(4x)') 1
16.1.015 sestavení matice Y, která jako 3 sloupce obsahuje funkční hodnoty y 1 = sin(x), y = sin(x), y 3 = sin(4x), pro x od 0 do π, a vykreslení grafů y 1 (x), y (x), y 3 (x) pomocí dat v matici Y. x = 0:.01:*pi; Y = [sin(x).', sin(*x).', sin(4*x).']; % tři sloupce plot(x.',y) leg('sin(x)','sin(x)','sin(4x)') sestavení matice Y, která jako 3 sloupce obsahuje funkční hodnoty y 1 = sin(x), y = sin(x), y 3 = sin(4x), pro x od 0 do π, a vykreslení grafů y 1 (x), y (x), y 3 (x) pomocí dat v matici Y. x = 0:.01:*pi; Y = [sin(x).', sin(*x).', sin(4*x).']; % tři sloupce plot(x.',y) leg('sin(x)','sin(x)','sin(4x)') Stejný graf obdržíme, bude-li mít matice Y 3 řádky s příslušnými funkčními hodnotami x = 0:.01:*pi; Y = [sin(x); sin(*x); sin(4*x)]; % tři řádky plot(x,y) leg('sin(x)','sin(x)','sin(4x)') sestavení matice Y, která jako 3 sloupce obsahuje funkční hodnoty y 1 = sin(x), y = sin(x), y 3 = sin(4x), pro x od 0 do π, a vykreslení grafů y 1 (x), y (x), y 3 (x) pomocí dat v matici Y. x = 0:.01:*pi; Y = [sin(x).', sin(*x).', sin(4*x).']; % tři sloupce plot(x.',y) leg('sin(x)','sin(x)','sin(4x)') Stejný graf obdržíme, bude-li mít matice Y 3 řádky s příslušnými funkčními hodnotami x = 0:.01:*pi; Y = [sin(x); sin(*x); sin(4*x)]; % tři řádky plot(x,y) leg('sin(x)','sin(x)','sin(4x)') Vykreslení grafů funkcí y 1 = sin(x)/x, y = sin (x), y 3 = cos(x ). function nekolik_grafu(a) x = a.'; % sloupcový vektor x (transponovaný a) y1 = sin(x)./x; % jeden sloupcový vektor y3 = [sin(x).^,cos(x.^)]; % dva sloupce plot(x,y1,x,y3) leg('sin(x)/x','sin^(x)','cos(x^)','location','southeast') Volání funkce pro x od 0 do 4π : x = [0:0.01:*pi]; nekolik_grafu(x) Vykreslení grafů funkcí y 1 = sin(x)/x, y = sin (x), y 3 = cos(x ). function nekolik_grafu(a) x = a.'; % sloupcový vektor x (transponovaný a) y1 = sin(x)./x; % jeden sloupcový vektor y3 = [sin(x).^,cos(x.^)]; % dva sloupce plot(x,y1,x,y3) leg('sin(x)/x','sin^(x)','cos(x^)','location','southeast') leg('krivka1', 'krivka','location','south') parametrem 'Location' lze nastavit polohu (umístění) legy podle světových stran, (např. 'SouthEast' jihovýchod vpravo dole), pokud umístění legy není nastaveno, je na severovýchodě (vpravo nahoře) Volání funkce pro x od 0 do 4π : x = [0:0.01:*pi]; nekolik_grafu(x) plotyy graf s dvěma různými osami y pro dvě různé křivky, např. plotyy (x 1,y 1,x,y ) osa pro graf y 1 vlevo, osa pro graf y vpravo Vykreslení grafů funkcí y 1 = sin(x), y = 100cos(x) x=[0:0.01:4*pi]; y1=sin(x); y=100*cos(x); plotyy(x,y1,x,y) leg('y_1','y_')
16.1.015 compass(u,v,s) vektor se složkami u, v ve formě šipky vycházející z počátku Příklady: Zobrazení vektorů a = [-5,5], b = [6,] compass([-5,6],[5,]) nebo jiným způsobem: a = [-5,5]; b = [6,]; compass([a(1),b(1)],[a(),b()]) polar(uhel,velikost,s) graf v polárních souřadnicích graf v polárních souřadnicích r = sin(4φ) cos(4φ), kde φ je z intervalu od 0 do π. fi = 0:0.01:*pi; y = sin(4.*fi).*cos(4.*fi); polar(fi, y, 'r') Zobrazení komplexních čísel viz předchozí přednášky Např. compass(-6+3i,'r') polar(uhel,velikost,s) graf v polárních souřadnicích graf logaritmické spirály v polárních souřadnicích Logaritmická spirála se vyskytuje např. v kresbě ulit plžů, je dána rovnicí r = a e mφ Křivka vykreslena pro a = 1, m = 1/1, φ z intervalu od 0 do 1 π. phi = 0:0.1:1*pi; r = exp((1/1)*phi); polar(phi,r,'m') Pozn.: užitečná funkce polcart převod souřadnic polárních na kartézské [x,y] = polcart(uhel, vzdálenost_od_počátku); graf logaritmické spirály z předchozího příkladu r = a e mφ, kde a = 1, m = 1/1, φ je z intervalu od 0 do 1 π, je převeden do kartézských souřadnic a vykreslen příkazem plot. phi = 0:0.1:1*pi; r = exp((1/1)*phi); [x,y]=polcart(phi,r); plot(x,y) Naopak: cartpol převod souřadnic kartézských na polární - graf parametrizované křivky (popsán parametrickými rovnicemi) - t je parametr, na kterém závisí x, y t = 0:.001:*pi; x = cos(3.*t); y = sin(.*t); plot(x,y) grid % grid přikreslí do % grafu síť (mřížku) xlabel('x') ylabel('y') % popis os křivkové grafy body, úsečky, křivky v prostoru např. plot3(x,y,z) vyjadřuje obvykle závislost y a z na x plošné grafy síťové(drátové), povrchové grafy např. mesh(x,y,z), surf(x,y,z) atp. vyjadřují obvykle závislost z na x a y 3
16.1.015 plot3(x,y,z,s) 3D graf křivkový vykreslí křivku v prostoru procházející body o souřadnicích x, y, z, které jsou prvky stejně dlouhých vektorů x, y, z, vyjadřuje obvykle závislost y a z na x, lze použít podobné příkazy a parametry jako ve D (plot), parametr S je řetězec, který specifikuje barvu, způsob vykreslení a styl křivky nebo typ značky bodu. graf křivky popsané parametrickými rovnicemi: x = t, y = sin(t), z = cos(t), pro t od 0 do 0π. t = [0:0.1:0*pi] plot3(t,sin(t),cos(t),'r') xlabel('x') ylabel('y') zlabel('z') vykreslení úsečky v prostoru z bodu [0, 0, 0] do bodu [1,, 3] x=[0,1]; % x-ové souřadnice bodů y=[0,]; % y-ové souřadnice bodů z=[0,3]; % z-ové souřadnice bodů plot3(x,y,z,'c','linewidth',3) % zvolena barva - modrozelená (cyan) % zvolena tloušťka čáry % 'LineWidth',3 plot3(0,0,0,'ro','markersize',15,'linewidth',3) plot3(1,,3,'ro','markersize',15,'linewidth',3) % 'ro' - body jsou zobrazeny červenými kolečky % 'MarkerSize',15 - velikost značky % 'LineWidth',3 - tloušťka čáry kolečka (značky) xlabel('x') % popis osy x ylabel('y') % popis osy y zlabel('z') % popis osy z grid % přidá do grafu síť, mřížku Příklady: Graf křivky popsané parametrickými rovnicemi: x = t, y = t sin(t), z = t cos(t), pro t od 0 do 0π. t = [0:0.1:0*pi]; plot3(t,t.*sin(t),t.*cos(t)) Graf křivky popsané parametrickými rovnicemi: x = t sin(t), y = t cos(t), z = t, pro t od 0 do 0π. t = [0:0.1:0*pi]; plot3(t.*sin(t),t.*cos(t),t,'g') 3D "plošné" grafy 3D plochy a sítě vykreslí nad souřadnicemi 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í nad souřadnicemi x, y plochu (vystínovanou, vybarvenou) tvarovanou podle Z (lze též uvést surf(z) nemám potom regulérní hodnoty x, y) Matice náhodných čísel s 8 řádky a 8 sloupci zobrazená pomocí surf. Rozsah osy x a y bude dán automaticky od 1 do 8 (indexy prvků matice). N = round(rand(8,8).*10); surf(n) Graf funkce: sin x y z( x, y) x y pro x, y od -0 do 0 s krokem 0,5. x = -0:0.5:0; y = x; [X,Y] = meshgrid(x,y); Z = sin(sqrt(x.^+y.^))./sqrt(x.^+y.^); Pokud mají x, y stejný rozsah -0 až 0, lze zapsat, např. takto: [X,Y] = meshgrid(-0:0.5:0); Z = sin(sqrt(x.^+y.^))./sqrt(x.^+y.^); Proč používáme meshgrid? - [X,Y] = meshgrid(x,y)vytvoří pomocné matice X, Y, jejichž prvky obsahují souřadnice bodů v rovině xy - pro usnadnění zápisu výpočtu s takto vytvořenými souřadnicemi mohu zapisovat rovnici pro výpočet Z "normálně" dle matematického zápisu, pouze nesmím zapomenout na operace prvek po prvku (tečkanotaci). Pozn.: Funkce vracející jako výsledek dvě a více hodnot (mohou to být i dvě matice) bude mít hlavičku: function [prvni,druha] = vraci_dve(vstupni_parametry)...atd... prvni = nějaký výsledek; druha = nějaký výsledek; Volání této funkce bude potom vypadat např.: [a, b] = vraci_dve(x) a =... b =... Příkladem takové funkce je meshgrid. 4
16.1.015 Graf funkce: sin x y z( x, y) x y pro x, y od - do s krokem 1. [X,Y] = meshgrid(-:) Z = sin(sqrt(x.^+y.^))./sqrt(x.^+y.^) surf(x,y,z) X = Za příkazy nejsou xlabel('x') - -1 0 1 středníky, vypíší se ylabel('y') - -1 0 1 matice zlabel('z') - -1 0 1 X, Y, Z - -1 0 1 - -1 0 1 Y = - - - - - -1-1 -1-1 -1 0 0 0 0 0 1 1 1 1 1 Z = 0.11 0.35 0.45 0.35 0.11 0.35 0.70 0.84 0.70 0.35 0.45 0.84 NaN 0.84 0.45 0.35 0.70 0.84 0.70 0.35 0.11 0.35 0.45 0.35 0.11 Graf funkce: sin x y z( x, y) x y pro x od -30 do 30 a y od -10 do 10 (různý rozsah os x, y) x = linspace(-30,30,50); y = linspace(-10,10,50); [X,Y] = meshgrid(x,y); Z = sin(sqrt(x.^+y.^))./sqrt(x.^+y.^); pro x od -0 do 0 a y od -40 do 40 [X,Y] = meshgrid(-0:0.5:0,-40:0.5:40); Z = sin(sqrt(x.^+y.^))./sqrt(x.^+y.^); Graf funkce: sin x y z( x, y) x y pro x od -30 do 30 a y od -10 do 10 (různý rozsah os x, y) x = linspace(-30,30,50); y = linspace(-10,10,50); [X,Y] = meshgrid(x,y); Z = sin(sqrt(x.^+y.^))./sqrt(x.^+y.^); pro x od -0 do 0 a y od -40 do 40 [X,Y] = meshgrid(-0:0.5:0,-40:0.5:40); Z = sin(sqrt(x.^+y.^))./sqrt(x.^+y.^); Graf funkce: z = cos(xy) pro x, y od -π do π. funkční hodnoty vypočtené pomocí meshgrid a nematicových operací x = -pi:pi/50:pi; y = x; tic [X,Y] = meshgrid(x,y); Z = cos(x.*y); toc colorbar Elapsed time is 0.05995 seconds. colorbar doplní barevnou stupnici (škálu) Graf funkce: z = cos(xy) pro x, y od -π do π. funkční hodnoty vypočtené pomocí cyklů for x = -pi:pi/50:pi; y = x; tic for m=1:length(x) for n=1:length(y) Z(m,n)=cos(x(m)*y(n)); toc colorbar Elapsed time is 0.31 seconds. Vykreslení vrstevnic contour(x,y,z) plošné (pohled shora) dvourozměrné vykreslení např. vrstevnic, ekvipotenciál atp. contour(x,y,z,n) chci vykresli n-úrovní (v podstatě určím jak hustě se mají kreslit vrstevnice), např. contour(x,y,z,30) contourf(x,y,z) vrstevnice s barevnými plochami contour3(x,y,z) trojrozměrné vykreslení např. vrstevnic, ekvipotenciál atp. pcolor(x,y,z) obdoba contour, ale vykresleno jako barevné plochy 5
16.1.015 mesh(), surf() lze použít pro zobrazení stejné funkce Graf funkce z = cos(x + y ) pro x, y od π/ do π/ a jeho vrstevnice. [X,Y] = meshgrid(-pi/:0.1:pi/); Z = cos(x.^+y.^); subplot(,,1) subplot(,,) surf(x,y,z) subplot(,,3) contour(x,y,z) subplot(,,4) contourf(x,y,z) Graf funkce z = cos(x + y ) pro x, y od -1 do 1 s krokem 0. a vykreslení vrstevnic ke grafu [X,Y] = meshgrid(-1:0.:1); Z = cos(x.^+y.^); [C,h]=contour(X,Y,Z); clabel(c,h); contour() - vrstevnice grafu clabel() - popisky vrstevnic Vrstevnice grafu funkce z = cos(x + 0.5y ) pro x, y od -10 do 10 x=[-10:0.5:10]; y=x; [X,Y]=meshgrid(x,y); Z=X.^+0.5*Y.^; subplot(,,1) contour(x,y,z) colorbar subplot(,,) contourf(x,y,z) colorbar subplot(,,3) contour(x,y,z,30) colorbar subplot(,,4) pcolor(x,y,z) colorbar Zobrazení gradientů funkce: [FX,FY]=gradient(F) výpočet gradientu matice F, výsledkem jsou dvě matice podobně jako u meshgrid(). quiver(parametry) neumí počítat gradient umí vykreslit graf ze šipek, které mohou představovat gradient v daném bodě. (Gradient je v obecném smyslu slova směr růstu, matematickým výsledkem je vektorové pole vyjadřující směr a velikost změny skalárního pole, gradienty jsou tedy vektory, jejichž složky tvoří jednotlivé parciální derivace funkce vyjadřující dané skalární pole. FX odpovídá F/ x, FY pak F/ y.) Graf funkce: z 1 = cos(x +y ) a funkce z = cos(x +y ) a vykreslení jejich vrstevnic a gradientu, pro x, y od 1 do 1 s krokem 0,5. [X,Y]=meshgrid(-1:0.5:1); Z=cos(X.^+Y.^); subplot(,,1) subplot(,,3) [GX,GY]=gradient(Z); quiver(x,y,gx,gy) contour(x,y,z) Z=-cos(X.^+Y.^); subplot(,,) mesh(x,y,z) subplot(,,4) [GX,GY]=gradient(Z); quiver(x,y,gx,gy) contour(x,y,z) Graf funkce: z 1 = cos(x +y ) a funkce z = cos(x +y ) a vykreslení jejich vrstevnic a gradientu, pro x, y od 1 do 1 s krokem 0,5. [X,Y]=meshgrid(-1:0.5:1); Z=cos(X.^+Y.^); subplot(,,1) subplot(,,3) [GX,GY]=gradient(Z); quiver(x,y,gx,gy) contour(x,y,z) Z=-cos(X.^+Y.^); subplot(,,) mesh(x,y,z) Krok tentokrát zvolen větší, aby byly dobře vidět šipky vyjadřující gradient. subplot(,,4) [GX,GY]=gradient(Z); quiver(x,y,gx,gy) contour(x,y,z) 6
16.1.015 Graf funkce: sin x y z( x, y) a vykreslení jejího gradientu x y pro x, y od -7 do 7 s krokem 0,5. [X,Y] = meshgrid(-7:0.5:7); Z = sin(sqrt(x.^+y.^))./sqrt(x.^+y.^); figure % nové grafické okno [Px,Py] = gradient(z,.5,.5); quiver(x,y,px,py); Graf funkce: sin z( x, y) x y a vykreslení jejího gradientu x y pro x, y od -7 do 7 s krokem 0,5. [X,Y] = meshgrid(-7:0.5:7); Z = sin(sqrt(x.^+y.^))./sqrt(x.^+y.^); figure % nové grafické okno [Px,Py] = gradient(z,.5,.5); quiver(x,y,px,py); gradient je vykreslen s krokem podle kroku X a Y krok pro výpočet gradientu, ne pro vykresleni Normály k povrchu (k ploše) grafu [U,V,W] = surfnorm(x,y,z) vytvoření pomocných matic U, V, W pro normály k plošnému grafu funkce Z quiver3(x,y,z,u,v,w) vykreslí graf ze šipek se složkami U, V, W v bodech se souřadnicemi X, Y, Z. Matice X, Y, Z, U, V, W musí mít všechny stejnou velikost. Graf funkce z = cos(x + y ) pro x, y od -1 do 1 a vykreslení normál k povrchu funkce [X,Y] = meshgrid(-1:0.:1); Z = cos(x.^+y.^); [NX,NY,NZ] = surfnorm(x,y,z); quiver3(x,y,z,nx,ny,nz) vytvoření pomocných matic NX,NY,NZ pro normály k plošnému grafu funkce Z vykresleni normál k ploše grafu jako vektoru (šipek) - grafy lze kombinovat využijeme příkaz / off Graf funkce z = cos(x + y ) pro x, y od π/ do π/ a jeho 3D vrstevnice. [X,Y] = meshgrid(-pi/:0.1:pi/); Z = cos(x.^+y.^); subplot(,1,1) contour3(x,y,z) - je více variant příkazů pro zobrazení plošných grafů (odlišné v různých výpočetních systémech), v MATLABu některé kombinují vlastnosti dvou dohromady, např.: meshc, surfc (mesh a surf a k tomu contour), meshz (mesh s podstavcem ), surfl (surf s osvětlením ) Graf funkce z = - cos(x + y ) pro x, y od π/ do π/ [X,Y] = meshgrid(-pi/:0.1:pi/); Z = -cos(x.^+y.^); surfc(x,y,z) surfl(x,y,z) subplot(,1,) contour3(x,y,z,'k') 7
16.1.015 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 Graf funkce z = cos(x + y ) pro x, y od π/ do π/ [X,Y] = meshgrid(-pi/:0.1:pi/); Z = cos(x.^+y.^); surf(x,y,z) colormap(gray) colormap(hot) colormap(winter) Grafy zobrazující vztah částí k celku (statistika) bar sloupcový graf pie výsečový (koláčový) graf barh horizontální sloupcový graf bar3 trojrozměrný sloupcový graf pie3 trojrozměrný výsečový (koláčový) graf bar3h trojrozměrný horizontální sloupcový graf Platí pro MATLAB, v jiných výpočetních systémech nemusí být trojrozměrné grafy k dispozici V bufetu bylo za 15 minut prodáno 10 rohlíků, 0 baget, 30 koblih a 5 kusů ostatního pečiva. Vytvořte výsečový graf, který ukáže podíl prodaného druhu pečiva. pecivo = [10,0,30,5]; subplot(,,1) pie(pecivo) subplot(,,) pie(pecivo,{'rohliky',... % tři tečky pokračování na další řádce 'bagety','koblihy','ostatni'}) subplot(,,3) ex=[0,1,0,0]; pie(pecivo,ex) subplot(,,4) pie(pecivo,[1,1,1,1],... {'rohliky','bagety','koblihy','ostatni'}) V bufetu bylo za 15 minut prodáno 10 rohlíků, 0 baget, 30 koblih a 5 kusů ostatního pečiva. Vytvořte výsečový graf, který ukáže podíl prodaného druhu pečiva. pecivo = [10,0,30,5]; subplot(,,1) pie(pecivo) subplot(,,) pie(pecivo,{'rohliky',... 'bagety','koblihy','ostatni'}) subplot(,,3) ex=[0,1,0,0]; pie(pecivo,ex) subplot(,,4) pie(pecivo,[1,1,1,1],... {'rohliky','bagety','koblihy','ostatni'}) V bufetu bylo za 15 minut prodáno 10 rohlíků, 0 baget, 30 koblih a 5 kusů ostatního pečiva. Vykreslete rovněž toto prodané pečivo ve formě sloupcového grafu pecivo = [10,0,30,5]; bar(pecivo) V bufetu bylo za 15 minut prodáno 10 rohlíků, 0 baget, 30 koblih a 5 kusů ostatního pečiva, ve druhé prodejně bylo prodáno za stejnou dobu prodáno 8 rohlíků, 1 baget, 4 koblih a 15 kusů ostatního pečiva a ve třetí prodejně bylo prodáno opět za stejnou dobu prodáno 0 rohlíků, 4 bagety, 7 koblih a 5 kusů ostatního pečiva. Vykreslete poměrné zastoupení prodaného pečiva v jednotlivých prodejnách. prodejna=[10,0,30,5; 8,1,4,15; 0,4,7,5] subplot(1,,1) bar(prodejna,'stacked') leg('rohliky','bagety','koblihy','ostatni') subplot(1,,) bar(prodejna,'grouped') leg('rohliky','bagety','koblihy','ostatni') 8
16.1.015 V bufetu bylo za 15 minut prodáno 10 rohlíků, 0 baget, 30 koblih a 5 kusů ostatního pečiva, ve druhé prodejně bylo prodáno za stejnou dobu prodáno 8 rohlíků, 1 baget, 4 koblih a 15 kusů ostatního pečiva a ve třetí prodejně bylo prodáno opět za stejnou dobu prodáno 0 rohlíků, 4 bagety, 7 koblih a 5 kusů ostatního pečiva. Vykreslete poměrné zastoupení prodaného pečiva v jednotlivých prodejnách. prodejna=[10,0,30,5; 8,1,4,15; 0,4,7,5] subplot(1,,1) bar(prodejna,'stacked') leg('rohliky','bagety','koblihy','ostatni') subplot(1,,) bar(prodejna,'grouped') leg('rohliky','bagety','koblihy','ostatni') Další typy grafů stairs "schodový" graf hist graf vyjadřující u spojité proměnné rozdělení četností podle intervalů hodnot. hist(y) rozdělí prvky y na 10 rovnoměrně rozložených intervalů a vrací počet prvků v každém intervalu. hist(y,x), kde x je vektor, vrátí rozdělení y mezi intervaly s centry určenými x rose úhlový histogram errorbar chybové úsečky ukazují úroveň spolehlivosti dat nebo odchylku podél křivky. feather graf zobrazující vektory vycházející z bodů rovnoměrně rozložených podél vodorovné osy, tj. z [0,0], [1,0], [,0], a další viz help stairs "schodový" graf Příklady: V bufetu bylo za 15 minut prodáno 10 rohlíků, 0 baget, 30 koblih a 5 kusů ostatního pečiva. Vykreslete rovněž toto prodané pečivo ve formě schodového grafu pecivo = [10,0,30,5,0]; stairs(pecivo) hist graf vyjadřující u spojité proměnné rozdělení četností podle intervalů hodnot. hist(y) rozdělí prvky y na 10 rovnoměrně rozložených intervalů a vrací počet prvků v každém intervalu. hist(y,x), kde x je vektor, vrátí rozdělení y mezi intervaly s centry určenými x Příklady: a=rand(1,1000).*10; hist(a) Zobrazení funkce sin(x) x = linspace(-*pi,*pi,40); stairs(x,sin(x)) hist graf vyjadřující u spojité proměnné rozdělení četností podle intervalů hodnot. hist(y) rozdělí prvky y na 10 rovnoměrně rozložených intervalů a vrací počet prvků v každém intervalu. hist(y,x), kde x je vektor, vrátí rozdělení y mezi intervaly s centry určenými x rose úhlový histogram uhel = rand(1,500).*.*pi; rose(uhel) Příklady: a=rand(1,1000).*10; hist(a) x = -5:0.1:5; y = randn(1000,1); hist(y,x) Prvky vektoru uhel musí být zadány v radiánech. 9
16.1.015 errorbar chybové úsečky ukazují úroveň spolehlivosti dat nebo odchylku podél křivky. x = linspace(0,*pi,10); y = sin(x); er = std(y)*ones(size(x)); errorbar(x,y,er) feather graf zobrazující vektory vycházející z bodů rovnoměrně rozložených podél vodorovné osy, tj. z [0,0], [1,0], [,0], [3,0], Příklady: Zobrazení funkce sin(x) x = linspace(-*pi,*pi,40); feather(x,sin(x)) grid Zobrazení komplexních čísel C = [-+i,-3-4i,1+i,4-3i,i,1]; subplot(1,,1) compass(c) subplot(1,,) feather(c) spy grafické zobrazení řídké matice (pro analýzu řídkých matic ) V = zeros(9); V(1,) = 7; V(,3) = 6; V(1,4) = 9; V(5,5) = 4; V(7,8) = 5; spy(v,'r') % body mi v grafu ukáží nenulové hodnoty V = 0 7 0 9 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 f = fopen('nazev_soubor', 'režim'); fopen otevře soubor s názvem nazev_soubor pro přístup pro čtení nebo zápis podle zvoleného režimu. Řetězec nazev_soubor obsahuje název souboru, který má být otevřen. Pokud fopen nemůže otevřít soubor, vrátí hodnotu -1. Jetliže soubor není v aktuální složce, lze zadat i cestu k souboru, např.: f = fopen('c:\\cesta_k_souboru\\soubor', 'režim'); kde režim může být: 'r' číst (read) 'w' zápis, přepis, vytvoření nového souboru (write) 'a' připsat na konec existujícího (app) 'r+' čtení nebo zápis 'w+' čtení nebo zápis, přepis, vytvoření nového souboru 'a+' čtení nebo zápis, přepis, vytvoření nového souboru a přidávat na konec souboru další data Zápis do textového souboru: fprintf() jako na obrazovku, jediný rozdíl je, že je nutné uvést proměnnou, do které je otevřen soubor, např. muj_soubor = fopen('c:\\cesta\\soubor.txt','w'); fprintf(muj_soubor,'format.sekvence',argumenty); formátovací sekvence a argumenty používáme stejné jako při výpisu na obrazovku Použitý soubor je třeba nakonec zavřít pomocí fclose(), jež vrací 0 v případě úspěšného zavření souboru nebo -1 v případě neúspěchu. fclose(muj_soubor); Pozn.: test konce souboru feof(muj_soubor) pokud je konec souboru, vrátí 1 'w' zápis Zápis do textového souboru: (write) fprintf() jako na obrazovku, jediný rozdíl je, že je nutné uvést proměnnou, do které je otevřen soubor, např. muj_soubor = fopen('c:\\cesta\\soubor.txt','w'); fprintf(muj_soubor,'format.sekvence',argumenty); formátovací sekvence a argumenty používáme stejné jako při výpisu na obrazovku Použitý soubor je třeba nakonec zavřít pomocí fclose(), jež vrací 0 v případě úspěšného zavření souboru nebo -1 v případě neúspěchu. fclose(muj_soubor); Pozn.: test konce souboru feof(muj_soubor) pokud je konec souboru, vrátí 1 10
16.1.015 Funkce, v níž do textového souboru uloženého v aktuální složce bude zapsán text, znak a číslo, které zadá uživatel z klávesnice. function soubor_ulozeni f = fopen('soubor.txt', 'w'); zadany_text = input('zadejte text: ', 's'); zadany_znak = input('zadejte znak: ', 's'); cislo = input('zadejte cislo: '); fprintf(f,'bylo zadan text: %s\n', zadany_text); fprintf(f,'bylo zadan znak: %c\n', zadany_znak); fprintf(f,'bylo zadano cislo: %g\n', cislo); fclose(f); Funkce, v níž do textového souboru uloženého v aktuální složce bude zapsán text, znak a číslo, které zadá uživatel z klávesnice. 'w' zápis (write) function soubor_ulozeni f = fopen('soubor.txt', 'w'); zadany_text = input('zadejte text: ', 's'); zadany_znak = input('zadejte znak: ', 's'); cislo = input('zadejte cislo: '); fprintf(f,'bylo zadan text: %s\n', zadany_text); fprintf(f,'bylo zadan znak: %c\n', zadany_znak); fprintf(f,'bylo zadano cislo: %g\n', cislo); fclose(f); Volání funkce soubor_ulozeni: Zadejte text: Ahoj! Zadejte znak: x Zadejte cislo: 1345 V textovém souboru soubor.txt, který je uložen v aktuálním adresáři, je zapsáno: Bylo zadan text: Ahoj! Bylo zadan znak: x Bylo zadano cislo: 1345 function soubor_cisla p = input('zadej, kolik chces ulozit cisel? '); if(p > 0) f = fopen('data.txt','w'); for n = 1:p 'w' zápis (write) fprintf(f,'%g\n',rand); fclose(f); fprintf('cisla byla ulozena\n'); else fprintf('chybne zadani\n'); Volání funkce soubor_cisla: Zadej, kolik chces ulozit cisel? -5 Chybne zadani nebo Zadej, kolik chces ulozit cisel? 0 Cisla byla ulozena V textovém souboru data.txt, který je uložen v aktuální složce, je pak zapsáno např.: 0.106653 0.961898 0.004634 0.77491 0.817303 0.868695 0.0844358 0.399783 0.5987 0.800068 0.431414 0.910648 0.181847 0.63803 0.145539 0.136069 0.8699 0.579705 0.54986 0.144955 fscanf čtení z textového souboru uloženého na disku, soubor musí nejprve být otevřen pomocí fopen Např. Načtení všech čísel ze souboru data.txt uloženého na disku C soubor = fopen( C:\\data.txt', 'r'); cisla = fscanf(soubor, '%g'); fclose(soubor); 'r' číst (read) Načtení jednoho čísla ze souboru data.txt uloženého na disku D (1 řádek, 1 sloupec) soubor = fopen('d:\\data.txt', 'r'); cisla = fscanf(soubor, '%g', [1,1]); fclose(soubor); Velikost je nepovinná, ale pomocí ní lze omezit počet prvků, které je možné číst ze souboru. 11
16.1.015 Velikost je tedy nepovinná, ale pomocí ní lze omezit počet prvků, které je možné číst ze souboru, je-li zadán rozměr matice, vyplní se matice o dané velikosti, např. Čtení z textového souboru soubor.txt uloženého v aktuálním adresáři: muj_soubor = fopen('soubor.txt', 'r'); cisla = fscanf(muj_soubor, '%g', [,inf]); fscanf má přečíst reálná čísla, organizovaná ve řádcích a neznámém počtu sloupců (chci číst až do konce souboru), na pozici řádek nesmí být inf. Použitý soubor je třeba nakonec zavřít: fclose(muj_soubor) 1