Výpočetní technika II - Algoritmizace v systému MATLAB Aktualizace: 26. prosince 2000


Navigační menu
  Vysvětlivky
  Obsah
  Kapitola 1: Matlab
       Kapitola 1.1: Úvod
       Kapitola 1.2: Režimy práce
  Kapitola 2: Skaláry, vektory, matice
       Kapitola 2.1: Operace
       Kapitola 2.2: Funkce
       Kapitola 2.3: Submatice
  Kapitola 3: Vytváření funkcí
  Kapitola 4: Větvení a rozhodování
  Kapitola 5: While cyklus
  Kapitola 6: For cyklus
  Kapitola 7: Objekty a 2-D grafika
  Kapitola 8: 3-D grafika
  Kapitola 9: Datové soubory
       Kapitola 9.1: Ukládání do souboru
       Kapitola 9.2: Načtení ze souboru
       Kapitola 9.3: Import dat z Excelu
  Kapitola 10: Symbolická matematika
  Kapitola 11: Řešení rovnice f(x)=0
  Kapitola 12: Soustavy lineárních rovnic
  Kapitola 13: Minimum funkce f(x)
  4. Větvení a rozhodování  

 
  • Motto: Jestliže je v jedné funkci příliš mnoho příkazů IF, pak se její autor patrně minul povoláním. Už jste někdy viděli letecký snímek velkého nádraží? V České Třebové je celá řada výhybek, se kterými se nehýbe a kolejí, po kterých se nikdy nejezdilo.
  • Bez větvení – každý příkaz se provede právě jednou (v uvedeném pořadí)
    S větvením – každý příkaz uvnitř větvení se provede nejvýše jednou
  • Větvení má svůj začátek – if logická_podmínka
    Větvení má svůj konec – end
    Větvení má své tělo – libovolné příkazy mezi if a end
    Uvnitř větvení může být použito klíčové slovo else
    Pozitivní část těla – příkazy mezi if a else, chybí-li else, je celé tělo pozitivní
    Negativní část těla – příkaz mezi else a end, chybí-li else, chybí i negativní část
    Příkaz return – v těle větvení můžeme realizovat předčasný únik z funkce
  • Syntaxe úplné podmínky:
 
       if podminka
        % prikazy pozitivni casti
     else
        % prikazy negativni casti
     end
 
 
  • Syntaxe neúplné podmínky:
 
       if podminka
        % prikazy pozitivni casti
     end
 
 
  • Příklad kompletního větvení:
 
       if IQ>=95
        zamysli_se;
     else
        najez_se;
     end
     jdi_domu;
 
 
  • Příklad větvení bez negativní části:
 
       if cas==6
        vstavej;
        snidej;
        vypadni;
     end
     jdi_do_prace;
 
 
  • Větvení může být nejen za jiným větvením, ale i uvnitř těla jiného větvení
 
  Příklad 4A.1:  
  Přeložte z angličtiny: If I am thirsty I will go to the pub. If I am happy I will drink milk. Anyway I will drink wine. Then I will pay and go home.
Předpoklad: V proměnných thirsty a happy jsou logické hodnoty 0 nebo 1. Ostatní názvy jsou názvy funkcí bez vstupních a výstupních parametrů.
 
  Řešení:  
  Příklad použití větvení  
 
if thirsty
   go_to_the_pub;
   if happy
      drink_milk;
   else
      drink_wine;
   end
end
 

 
  • Heslo dne: Kdo nekrokuje větvení, nedozví se, kudy mu ujel vlak.
    Poznámka 1: Větvení umožňuje elegantně odvracet nebezpečí vzniku chyb.
    Poznámka 2: Větvení umožňuje realizovat úplnou diskusi řešení problému.
    Poznámka 3: Elegance spočívá v úplném rozboru s minimálním počtem if příkazů.
 
  Příklad 4A.2:  
  Sestavte funkci na výpočet podílu sinu x a uvedeného x.
Instrukce: chování v okolí nuly je také důležité, Taylorova řada, dodefinování funkce v okolí nuly, krokování.
 
  Řešení:  
 
function [y]=SinX(x)
% Funkce sin(x)/x dodefinovana v bode x=0 na spojitou funkci
% [y]=SinX(x);
% y ... hodnota funkce
% x ... hodnota nezavisle promenne
if abs(x)<=1e-6 % test blizkosti k nule
   y=1-x^2/6; % Tayloruv rozvoj pro x=0
else
   y=sin(x)/x; % normalni a primocary vypocet
end
 
 
  Příklad 4A.3:  
  Sestavte funkci na výpočet minima ze tří hodnot.
Instrukce: dvě větvení uvnitř obou částí hlavního větvení, rozbor, co když nastane rovnost hodnot, krokování.
 
  Řešení:  
 
function [m]=Min3(x,y,z)
% Vypocet minima ze tri hodnot stejneho typu
% [m]=Min3(x,y,z);
% m ... minimalni hodnota
% x,y,z ... vstupni hodnoty
if x<y % zakladni otazka
   if x<z % mozna to je x
      m=x; % urcite to je x
   else
      m=z; % urcite to je z
   end
else
   if y<z % mozna to je y
      m=y; % urcite to je y
   else
      m=z; % urcite to je z
   end
end
 
 
  Příklad 4A.4:  
  Sestavte funkci na výpočet polohy minima/minim ze tří hodnot.
Instrukce: volání funkce Min3, postupné naplňování vektoru poloh minim, krokování.
 
  Řešení:  
 
function [arg,mini]=ArgMin3(x,y,z)
% Vypocet polohy minim(a) ze tri hodnot stejneho typu
% [arg,mini]=ArgMin3(x,y,z);
% arg .... vektor polohy minim(a)
% mini ... minimalni hodnota
% x,y,z .. vstupni hodnoty
arg=[]; % jeste jsme nic nenasli
mini=Min3(x,y,z); % hodnota minima (minim)
if x==mini % mozna to je x
   arg=[arg 1]; % pridat do vektoru arg
end
if y==mini % mozna to je y
   arg=[arg 2]; % pridat do vektoru arg
end
if z==mini % mozna to je z
   arg=[arg 3]; % pridat do vektoru arg
end
 
 
  Příklad 4A.5:  
  Jsou situace, kde systém Matlab pomáhá problém řešit bez větvení s využitím vektorizace a vestavěných funkcí. Tyto funkce mají ale větvení uvnitř, takže se stejně někde větví, akorát my to nemusíme vytvářet. Copak asi dělá funkce:  
 
function [m]=CENZUROVANO(x,y,z)
% CENZUROVANO
% [m]=CENZUROVANO(x,y,z);
% m, x, y, z ...CENZUROVANO
m=min([x y z]); % to je konec
 
 
  Příklad 4A.6:  
  Sestavte funkci na výpočet počtu jízd výtahem. Výtah má omezenou nosnost a jsou známy hmotnosti tří obchodních cestujících, kteří jedou ze suterénu do 11 patra.
Instrukce: přemýšlejte, vytvořte lepší řešení, krokujte.
 
  Řešení:  
 
function [n]=Vytah3(a,b,c,w)
% Vytah a tri pasazeri
% [n]=Vytah3(a,b,c,w);
% n ... pocet jizd vytahem
% a,b,c ... hmotnosti jednotlivych pasazeru
% w ... maximalni nosnost vytahu
if a+b+c<=w % mozna se vejdou vsichni najednou
   n=1; % staci jedna jizda
   return; % koncime a pryc od toho
end
if a>w | b>w | c>w % mozna je mezi nimi Cerny Petr
   n=inf; % nikdy se tam vsichni nedostanou
   return; % koncime a pryc od toho
end
% mozna by se nasla alespon dvojice
if a+b<=w | b+c<=w | a+c<=w
   n=2; % nutne jsou dve jizdy
   return; % koncime a pryc od toho
end
n=3 % je definitivne prokazano, ze kazdy musi jet extra
 
 
 
  • S použitím matlabovské funkce sort lze vytvořit elegantnější verzi výtahu.
 
 
function [n]=JinyVytah3(a,b,c,w)
% Vytah a tri pasazeri s pouzitim trideni
% [n]=JinyVytah3(a,b,c,w);
% n ... pocet jizd vytahem
% a,b,c ... hmotnosti jednotlivych pasazeru
% w ... maximalni nosnost vytahu
h=sort([a b c]); % setridime je podle vzrustajici hmotnosti
if h(1)+h(2)+h(3)<=w % mozna se vejdou vsichni najednou
   n=1; % staci jedna jizda
   return; % koncime a pryc od toho
end
if h(3)>w % mozna je mezi nimi Cerny Petr
   n=inf; % nikdy se tam vsichni nedostanou
   return; % koncime a pryc od toho
end
if h(1)+h(2)<=w % mozna by se vesla alespon nejlehci dvojice
   n=2; % nutne jsou dve jizdy
   return; % koncime a pryc od toho
end
n=3 % je definitivne prokazano, ze kazdy musi jet extra
 
 
  Příklad 4A.7:  
  Sestavte funkci na výpočet řešení linearní rovnice.
Instrukce: Každý problém lze řešit ledabyle. Při programování dejme přednost důslednosti. Funkci řádně otestujte. Funguje i pro nulové a komplexní hodnoty parametrů?
 
  Řešení:  
 
function [x]=Linearni(a,b)
% Reseni linearni rovnice a*x+b=0
% [x]=Linearni(a,b);
% x ... vektor reseni
% a ... linearni clen
% b ... absolutni clen
if a==0 % mozna, ze je degenerovana
   if b~=0 % mozna, ze nema reseni
      x=[] % nema reseni
   else
      x=inf; % ma nekonecne mnoho reseni
   end
else
   x=-b/a; % ma prave jedno reseni
end
 
 
  Příklad 4A.8:  
  Sestavte funkci pro nalezení všech řešení redukované kvadratické rovnice.
Instrukce: Úlohu vyřešme nejprve naivně pouze s použitím středoškolských vzorců a s úplnou diskusí. Jistě oceníte, že funkce automaticky pracuje i s komplexní proměnnou.
 
  Řešení:  
 
function [x]=KvadratRedNaive(p,q)
% Naivni reseni redukovane kvadraticke rovnice x^2+p*x+q=0
% [x]=KvadratRedNaive(p,q);
% x ... vektor vsech reseni
% p ... linearni clen
% q ... absolutni clen
r=p/2; % z rozmaru?
d=r^2-q; % vypocet diskriminantu
if d==0 % mozna, ze ma jen jedno reseni
   x=-r; % ma dvojnasobny koren
else
% 2 ruzne realne nebo komplexni koreny
   x=[-r+sqrt(d) -r-sqrt(d)];
end
 
 
  • Při numerických výpočtech velmi vadí, když rozdíl dvou velkých čísel je v absolutní hodnotě malý, neboť zaokrouhlovací chyby se okamžitě chopí své životní šance. Ten, kdo umí rozšiřovat zlomek s odmocninami, jistě ví, co s tím udělat a proč. Vy ostatní alespoň nalezněte takové p, q, aby vynikl rozdíl mezi KvadratRedNaive a exaktním řešením. Pak oceníte následující funkci:
 
 
function [x]=KvadratRed(p,q)
% Robustni reseni redukovane kvadraticke rovnice x^2+p*x+q=0
% [x]=KvadratRed(p,q);
% x ... vektor vsech reseni
% p ... linearni clen
% q ... absolutni clen
r=p/2; % z rozmaru?
d=r^2-q; % vypocet diskriminantu
if d==0 % mozna, ze ma jen jedno reseni
   x=-r; % ma dvojnasobny koren
else
   v=sqrt(d); % pomocny vypocet
   u=-r+v; % -r+sqrt(d)
   v=-r-v; % -r-sqrt(d)
   if abs(u)>abs(v) % kdo je vetsi ?
      x=[u +q/u]; % odvodte si rozsirovanim zlomku
   else
      x=[q/v v]; % jeste jednou promyslete
   end
end
 
  Příklad 4A.9:  
  Úloha: Sestavte funkci na úplnou diskusi řešení kvadratické rovnice.
Instrukce: volání funkce Linearni a KvadratRed, otestujte, krokujte.
 
  Řešení:  
 
function [x]=Kvadraticka(a,b,c)
% Vsechna reseni kvadraticke rovnice a*x^2+b*x+c=0
% [x]=Kvadraticka(a,b,c);
% x ... vektor vsech reseni
% a ... kvadraticky clen
% b ... linearni clen
% c ... absolutni clen
if a==0 % mozna, ze je to jenom linearni rovnice
   x=Linearni(b,c); % resi to snadno nekdo jiny
else
   x=KvadratRed(b/a,c/a); % vydelenim ziskame redukovany tvar
end
 
  Příklady pro samostatné vypracování  
  Příklad 4B.1:  
  Vylepšete funkci Remen tak, aby kola byla reálných rozměrů.  
 
  Příklad 4B.2:  
  Vylepšete funkci Uhel tak, aby počet minut a sekund byl omezen.  
 
  Příklad 4B.3:  
  Sestavte funkci pro posouzení sestrojitelnosti trojúhelníka.  
 
  Příklad 4B.4:  
  Vylepšete funkci na výpočet plochy trojúhelníka pomocí Heronova vzorce.  
 
  Příklad 4B.5:  
  Vylepšete funkci na určení hloubky vodního toku.  
 
  Příklad 4B.6:  
  Sestavte funkci na nalezení maxima ze tří hodnot včetně polohy.  
 
  Příklad 4B.7:  
  Sestavte funkci pro úplnou diskusi řešení rovnice třetího stupně.  
 
  Příklad 4B.8:  
  Sestavte funkci pro zjištění celkového odporu sériové a paralelní kombinace tří odporů.  
 
  Příklad 4B.9:  
  Sestavte funkci pro výpočet doby společné práce pro maximálně pět osob, které celou dobu pracují společně na jedné věci a nepřekážejí si.  
 
  Příklad 4B.10:  
  Sestavte funkci na nalezení mediánu ze tří hodnot včetně polohy.  
 
  Příklad 4B.11:  
  Sestavte funkci na nalezení geometrického průměru z maximálně pěti hodnot.  
 
  Příklad 4B.12:  
  Sestavte funkci pro nalezení harmonického průměru z maximálně pěti hodnot.  
 
  Seznam použitých příkazů  
  if, return, sort  



© 2000 by Darina Bártová, Jaromír Kukal, Martin Pánek

Testováno v prohlížečích MSIE 5.x a NN 4.x při rozlišení 1024x768x256