155GIT1 / 6. cvičení: Porovnání verzí

Z GeoWikiCZ
mBez shrnutí editace
(Není zobrazeno 29 mezilehlých verzí od 2 dalších uživatelů.)
Řádek 1: Řádek 1:
{{Geoinformatika}}
{{Geoinformatika}}
{{Cvičení|155GIT1|6|Algoritmizace, podmínky a cykly}}
{{Cvičení|155GIT1|6|Matlab - Grafy funkcí}}


== Náplň cvičení ==
== Náplň cvičení ==


# zobrazení zpráv, zadaní vstup
# grafické okno <code>figure</code>
# podmínky (<tt>if, else, elseif, end, all, any</tt>)
# grafy funkcí <code>plot(), subplot(), polar()</code>
# větvení (<tt>switch</tt>)
# podmínky (<tt>for, while</tt>)
# příkazy <tt>break, continue</tt>
# složené podmínky


== Ukázky ==
== Ukázky ==


=== Interaktivní vstup ===
=== Grafické okno ===


<source lang=octave>
<source lang=octave>
disp('Program vyzaduje vstup');
figure    # -> 1
a = input('Zadejte cislo a: ')
figure    # -> 2
figure(4) # -> 4
</source>
</source>


=== Větvení (if) ===
* Pro zavření všech grafických oken najednou funguje příkaz
 
* [http://geo.fsv.cvut.cz/user/gin/git1/matlab/matlab.pdf#63]
 
<source lang=octave>
<source lang=octave>
% skalarni podminka
close all
a = randi(10)
</source>
b = randi(10)


if a < b
=== Grafy funkcí ===
    disp('a je mensi nez b');
else
    disp('a je vetsi nebo rovno b');
end;


% vektorova podminka
* <code>plot()</code> {{bullet}} [http://geo.fsv.cvut.cz/vyuka/155git1/matlab/matlab.pdf#page=94 argumenty]
a = [1 2];
b = [0 3];


if a < b
<source lang=octave>
    disp('a je po prvcich vzdy mensi nez b');
x = [0:3:360];
else
y = sin(x*pi/180);
    disp('a je po prvcich alespon jednou vetsi nez b');
plot(x, y);
end;
%
% nove okno
figure(2)
plot(x, y, 'r+')
%
% vice grafu najednou
figure(3)
z = cos(x*pi/180);
plot(x, y, '--b', x, z, ':k');
</source>


% test na (ne)nulove prvky promenne
{{fig|octave-graf-1|<code>plot(x, y, '--b', x, z, ':k')</code>}}
if b    % totez jako:  if all(b)
    disp('b neobsahuje zadne nulove cleny');
elseif a
    disp('b obsahuje nulovy clen, a neobsahuje zadne nulove cleny');
else
    disp('a i b obsahuji nulovy clen');
end;
   
if any(b)
    disp('b obsahuje alespon jeden nenulovy clen');
end;
</source>


=== Větvení (switch) ===
==== Popisky grafů ====


<source lang=octave>
<source lang=octave>
cislo = randi(10)
figure(4)
hold on  % zapne kresleni grafu do aktivniho okna bez vymazani predchoziho obsahu
plot(x,y,'m');
plot(x,z,'b');
title('Funkce sinus a cosinus')
xlabel('argument ve stupnich')
ylabel('funkcni hodnota')
xlim([0 360])
ylim([-1.2 1.2])
box on
%
% legenda
legend('sinus','cosinus','Location','southwest')
      % prvni argumenty ('sinus','cosinus') jsou polozky legendy
      % 'Location' je jedna z vlastnosti objektu legend a bezprostredne po ni nasleduje nastaveni pripustne hodnoty teto vlastnosti ('southwest')
% V Matlabu lze pouzit i vhodnejsi umisteni legendy (nejmensi kolize s grafem)
legend('sinus','cosinus','Location','best')
% popr. zapisy, ktere umisti legendu mimo plochu grafu
legend('sinus','cosinus','eastoutside')
legend('sinus','cosinus','bestoutside')
%
grid on
plot([0 360],[0 0],'k')  % vykresleni osy x plnou cernou carou
hold off
</source>


switch cislo
{{fig|octave-graf-4|Graf s popisky}}
  case 1
    disp('cislo je 1')
  case {2,3}
    disp('cislo je 2 nebo 3')
  case {4,6,7}
    disp('cislo je 4, 6 nebo 7')
  otherwise
    disp('cislo je 5 nebo vetsi nez 7')
end
</source>


=== Cyklus for ===
==== Více grafů v jednom okně ====


<source lang=octave>
<source lang=octave>
% tvorba vektoru
x = 1:100;
n = 3
figure(5)
for i = 1:n
% prvni graf
    a(i) = i
subplot(2, 2, 1)
end
plot(x, x)
% druhy graf
subplot(2, 2, 2)
plot(x, sqrt(x))
% treti graf
subplot(2, 2, 3)
plot(x, log(x))
% ctvrty graf
subplot(2, 2, 4)
plot(x, x.^2)
</source>


% tvorba matice
{{fig|octave-graf-2|<code>subplot()</code>}}
m = 4  % pocet radku
n = 3  % pocet sloupcu
for i = 1:m
    for j = 1:n
        A(i,j) = i+j
    end
end
 
% priklad - v matici vyhledat sude radky
A = rand(5,4)
for i=1:size(A,1)
    if rem(i,2) == 0        % rem(a,b) ... zbytek po deleni cisla a cislem b
        A(i,:) = -1 * A(i,:)
    end
end
</source>


=== Cyklus while ===
==== Omezení oblasti grafu ====


<source lang=octave>
<source lang=octave>
a = 1;
x = 0:0.1:5;
b = 5;
y = exp(x);
while a < b
figure(6)
    a
% cely graf
    a = a + 1;
subplot(2, 1, 1)
end
plot(x, y)
% vysek grafu pro oblast x <1, 2>; y <0, 10>
subplot(2, 1, 2)
plot(x, y)
axis([1,2,0,10])
</source>
</source>


=== Příkazy break, continue ===
{{fig|octave-graf-3|<code>axis()</code>}}


<source lang=octave>
==== Graf s orientaci os v S-JTSK ====
for i = 1:5
    if i == 1
        continue;
    elseif i == 3
        break;
    end
    fprintf('i=%d\n', i);
end
</source>


=== Složené podmínky ===
Vstupní data: [http://geo102.fsv.cvut.cz/vyuka/155GIT1/data/body.txt body.txt]


<source lang=octave>
<source lang=octave>
% logicke AND - musi platit vsechny podminky soucasne
% nacteni dat
% iterativni proces v ukazce proto skonci jiz pri splneni jedne z pozadovanych presnosti
vstup = fopen('body.txt','r');
dx = 10;   % pozadovana presnost v souradnici x
P = fscanf(vstup,'%f',[3 inf]);
dy = 10;   % pozadovana presnost v souradnici y
BYX = P';
i = 0;     % citac iteraci
fclose(vstup);
while dx > 0.1 & dy > 0.1
    i = i+1
    dx = dx/2
    dy = dy/5
end


% totez
% vypocet smerniku
dx = 10;   % pozadovana presnost v souradnici x
stan = [4001 730288.89 1054582.63]; % cb Y X (stanovisko)
dy = 10;   % pozadovana presnost v souradnici y
DY = BYX(:,2) - stan(2);
i = 0;     % citac iteraci
DX = BYX(:,3) - stan(3);
while [dx > 0.1, dy > 0.1]
sig = atan2(DY,DX);     % v radianech
     i = i+1
sig = sig*200/pi;
     dx = dx/2
% prevod smerniku do intervalu <0,400>
    dy = dy/5
for i=1:length(sig)
     if sig(i)<0
        sig(i)=sig(i)+400;
     end
end
end
sig  % kontrolni zobrazeni vypoctenych hodnot smerniku


% totez
% kontrolni graf v JTSK
dx = 10;   % pozadovana presnost v souradnici x
figure(7)
dy = 10;   % pozadovana presnost v souradnici y
x = BYX(:,3);
i = 0;     % citac iteraci
y = BYX(:,2);
while all([dx > 0.1, dy > 0.1])
cb = BYX(:,1);
    i = i+1
plot(-y,-x,'.r',-1*stan(2),-1*stan(3),'.b');
     dx = dx/2
for i=1:size(BYX,1)
     dy = dy/5
     cislab = num2str(cb(i));      % prevod numericke hodnoty na format string
     text(-y(i)+0.4,-x(i),cislab);
end
end
cislos = stan(1);
text(-1*stan(2),-1*stan(3),num2str(cislos));
title('body v JTSK');
xlabel('Y'); ylabel('X');
%
% v Matlabu je mozne i dalsi siroke ovladani vzhledu grafu, napr.:
% ----------------------------------------------------------------
axis equal % stejne meritko os X a Y
% nastaveni pozice popisu os pro aktivni osy
set(gca,'XAxisLocation','top','YAxisLocation','right');  % gca - vrati identifikator pro objekt aktivnich os
%
% zapis spravnych numerickych hodnot poradnic na (matlabovske) ose x
krokx = 10;  % rozestup poradnic
poradnicex = (-1*ceil(max(y)/10)*10) : krokx : (-1*floor(min(y)/10)*10)  % definice okrouhlych hodnot poradnic
xlim([poradnicex(1) poradnicex(end)]);
set(gca,'XTick',poradnicex);                        % definice rysek poradnic
set(gca,'XTickLabel',sprintf('%.0f|',-poradnicex)); % definice popisu rysek poradnic spolu s nastavenim jejich formatu
%
% zapis spravnych numerickych hodnot poradnic na (matlabovske) ose y
kroky = 10;
poradnicey = (-1*ceil(max(x)/10)*10) : kroky : (-1*floor(min(x)/10)*10)
ylim([poradnicey(1) poradnicey(end)]);
set(gca,'YTick',poradnicey);
set(gca,'YTickLabel',sprintf('%.0f|',-poradnicey));
</source>


==== Polární graf ====
* např. zobrazení polohy satelitu (tzv. Skyplot)


% logicke OR - musi platit alespon jedna podminka
<source lang=octave>
% iterativni proces v ukazce proto skonci az po splneni vsech pozadovanych presnosti
ele = [80 30 10 50];   % elevacni uhel satelitu [°]
dx = 10;   % pozadovana presnost v souradnici x
azi = [10 110 220 330]; % azimut satelitu [°]
dy = 10;   % pozadovana presnost v souradnici y
azi = azi*pi/180;
i = 0;     % citac iteraci
figure(8)
while dx > 0.1 | dy > 0.1
polarplot(pi/2-azi,90-ele,'*'); % starsi funkce: polar(uhel,pruvodic,format_linie)
    i = i+1
    dx = dx/2
    dy = dy/5
end
 
% totez
dx = 10;  % pozadovana presnost v souradnici x
dy = 10;  % pozadovana presnost v souradnici y
i = 0;     % citac iteraci
while any([dx > 0.1, dy > 0.1])
    i = i+1
    dx = dx/2
    dy = dy/5
end
</source>
</source>


== Úlohy ==
== Úlohy ==
* [[155GIT1 / 6. cvičení / Příklady|6. cvičení - příklady]]
* [[155GIT1 / 6. cvičení / Příklady|6. cvičení - příklady]]

Verze z 25. 3. 2021, 19:02

Matlab - Grafy funkcí

Náplň cvičení

  1. grafické okno figure
  2. grafy funkcí plot(), subplot(), polar()

Ukázky

Grafické okno

figure    # -> 1
figure    # -> 2
figure(4) # -> 4
  • Pro zavření všech grafických oken najednou funguje příkaz
close all

Grafy funkcí

x = [0:3:360];
y = sin(x*pi/180);
plot(x, y);
%
% nove okno
figure(2)
plot(x, y, 'r+')
%
% vice grafu najednou
figure(3)
z = cos(x*pi/180);
plot(x, y, '--b', x, z, ':k');
plot(x, y, '--b', x, z, ':k')

Popisky grafů

figure(4)
hold on  % zapne kresleni grafu do aktivniho okna bez vymazani predchoziho obsahu
plot(x,y,'m');
plot(x,z,'b');
title('Funkce sinus a cosinus')
xlabel('argument ve stupnich')
ylabel('funkcni hodnota')
xlim([0 360])
ylim([-1.2 1.2])
box on
%
% legenda
legend('sinus','cosinus','Location','southwest')
       % prvni argumenty ('sinus','cosinus') jsou polozky legendy
       % 'Location' je jedna z vlastnosti objektu legend a bezprostredne po ni nasleduje nastaveni pripustne hodnoty teto vlastnosti ('southwest')
% V Matlabu lze pouzit i vhodnejsi umisteni legendy (nejmensi kolize s grafem)
legend('sinus','cosinus','Location','best')
% popr. zapisy, ktere umisti legendu mimo plochu grafu
legend('sinus','cosinus','eastoutside')
legend('sinus','cosinus','bestoutside')
%
grid on
plot([0 360],[0 0],'k')   % vykresleni osy x plnou cernou carou
hold off
Graf s popisky

Více grafů v jednom okně

x = 1:100;
figure(5)
% prvni graf
subplot(2, 2, 1)
plot(x, x)
% druhy graf
subplot(2, 2, 2)
plot(x, sqrt(x))
% treti graf
subplot(2, 2, 3)
plot(x, log(x))
% ctvrty graf
subplot(2, 2, 4)
plot(x, x.^2)
subplot()

Omezení oblasti grafu

x = 0:0.1:5;
y = exp(x);
figure(6)
% cely graf
subplot(2, 1, 1)
plot(x, y)
% vysek grafu pro oblast x <1, 2>; y <0, 10>
subplot(2, 1, 2)
plot(x, y)
axis([1,2,0,10])
axis()

Graf s orientaci os v S-JTSK

Vstupní data: body.txt

% nacteni dat
vstup = fopen('body.txt','r');
P = fscanf(vstup,'%f',[3 inf]);
BYX = P';
fclose(vstup);

% vypocet smerniku
stan = [4001 730288.89 1054582.63]; % cb Y X (stanovisko)
DY = BYX(:,2) - stan(2);
DX = BYX(:,3) - stan(3);
sig = atan2(DY,DX);     % v radianech
sig = sig*200/pi;
% prevod smerniku do intervalu <0,400>
for i=1:length(sig)
    if sig(i)<0
        sig(i)=sig(i)+400;
    end
end
sig  % kontrolni zobrazeni vypoctenych hodnot smerniku 

% kontrolni graf v JTSK
figure(7)
x = BYX(:,3);
y = BYX(:,2);
cb = BYX(:,1);
plot(-y,-x,'.r',-1*stan(2),-1*stan(3),'.b');
for i=1:size(BYX,1)
    cislab = num2str(cb(i));      % prevod numericke hodnoty na format string
    text(-y(i)+0.4,-x(i),cislab);
end
cislos = stan(1);
text(-1*stan(2),-1*stan(3),num2str(cislos));
title('body v JTSK');
xlabel('Y'); ylabel('X');
%
% v Matlabu je mozne i dalsi siroke ovladani vzhledu grafu, napr.:
% ----------------------------------------------------------------
axis equal			 % stejne meritko os X a Y
% nastaveni pozice popisu os pro aktivni osy
set(gca,'XAxisLocation','top','YAxisLocation','right');  % gca - vrati identifikator pro objekt aktivnich os
%
% zapis spravnych numerickych hodnot poradnic na (matlabovske) ose x
krokx = 10;  % rozestup poradnic
poradnicex = (-1*ceil(max(y)/10)*10) : krokx : (-1*floor(min(y)/10)*10)  % definice okrouhlych hodnot poradnic
xlim([poradnicex(1) poradnicex(end)]);
set(gca,'XTick',poradnicex);                        % definice rysek poradnic
set(gca,'XTickLabel',sprintf('%.0f|',-poradnicex)); % definice popisu rysek poradnic spolu s nastavenim jejich formatu
%
% zapis spravnych numerickych hodnot poradnic na (matlabovske) ose y
kroky = 10;
poradnicey = (-1*ceil(max(x)/10)*10) : kroky : (-1*floor(min(x)/10)*10)
ylim([poradnicey(1) poradnicey(end)]);
set(gca,'YTick',poradnicey);
set(gca,'YTickLabel',sprintf('%.0f|',-poradnicey));

Polární graf

  • např. zobrazení polohy satelitu (tzv. Skyplot)
ele = [80 30 10 50];    % elevacni uhel satelitu [°]
azi = [10 110 220 330]; % azimut satelitu [°]
azi = azi*pi/180;
figure(8)
polarplot(pi/2-azi,90-ele,'*');  % starsi funkce: polar(uhel,pruvodic,format_linie)

Úlohy