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)
  6. For cyklus  

 
  • Motto: Nutná podmínka profesního růstu programátora je, že ho začnou nudit for cykly, přestože pochopil jejich význam.
  • While cyklus – obecná konstrukce cyklu
    For cyklus – konkrétní cyklus přes všechny prvky řádkového vektoru
    Nejčastější for cyklus – pro hodnoty proměnné od 1 do N
  • Důsledek pro programátora: Úspora času při zápisu některých cyklů.
  • Syntaxe:
 
       for proměnná=vektor
        ..... % tělo
     end
 
 
  • For cyklus má svůj začátek – for proměnná=vektor
    For cyklus má svůj konec – end
    For cyklus má své tělo – libovolné příkazy mezi for a end
    Tělo je opakováno tolikrát, kolik prvků obsahuje vektor
    Hodnota proměnné se postupně mění a je k dispozici pro výpočty v těle cyklu
    Příkazem return – v těle větvení můžeme realizovat předčasný únik z funkce
  • Matlab, žel, neumí počítat cyklus pro indexy vektorů (matic) od nuly. Je nutno se s tím smířit.
  • Nejčastější obecná forma:
 
       for proměnná=1:počet_opakování cyklu
        tělo_cyklu
     end
 
 
  • Příklad for cyklu ze života:
 
       for n=1:10
        dej_si_pivo;
     end
 
 
  • Poznámka: while cyklus, který dělá totéž:
 
       n=1;
     while n<=10
        dej_si_pivo;
        n=n+1;
     end
 
 
  • For cyklus v plné kráse:
 
       tipy=[17 36 11 4 20 6 5];
     for a=tipy
        vsad_si(a);
     end
 

  Příklad 6A.1:  
  Za trest ještě jednou spočteme součet přirozených čísel od 1 do N.
Instrukce: Použijte cyklus for, krokujte.
 
  Řešení:  
 
function [s]=ZaTrestFor(n)
% Soucet prvnich n prirozenych cisel pomoci for cyklu
% [s]=ZaTrestFor(n);
% s ... hodnota souctu
% n ... pocet cisel
s=0; % soucet zacina od nuly
for k=1:n % zacina cyklus
   s=s+k; % pricteme 1,2,3...
end % konci cyklus
 

  Příklad 6A.2:  
  Sestavte funkci pro výpočet faktoriálu malého nezáporného celého čísla.
Instrukce: Součin nesmí začínat od nuly. Proč?
 
  Řešení:  
 
function [f]=Faktorial(n)
% n! neboli faktorial cisla n
% [f]=Faktorial(n);
% f ... hodnota n!
% n ... pocet cisel
f=1; % soucin tezko muze zacinat od nuly
for k=2:n % zacina cyklus a nasobeni jednickou je k nicemu
   f=f*k; % vynasobime 2x,3x,4x,...
end % konci cyklus
 
 
  Příklad 6A.3:  
  Sestavte funkci pro výpočet přirozeného logaritmu faktoriálu nezáporného celého čísla.
Instrukce: Logaritmus součinu je roven tomu, co všichni vědí. Proč je funkce bezpečná i pro velká přirozená čísla?
 
  Řešení:  
 
function [lnf]=LnFaktorial(n)
% Prirozeny logaritmus n!
% [lnf]=LnFaktorial(n);
% lnf ... hodnota ln(n!)
% n ... pocet cisel
lnf=0; % soucet zacina od nuly
for k=2:n % zacina cyklus a pricitani ln 1 je k nicemu
   lnf=lnf+log(k); % pricteme ln 2, ln 3, ln 4,...
end % konci cyklus
 
 
  Příklad 6A.4:  
  Harmonická posloupnost je tvořena převrácenými hodnotami přirozených čísel. Sestavte funkci pro výpočet součtu prvních n členů harmonické posloupnosti.  
  Řešení:  
 
function [h]=Harmonicka(n)
% Soucet prvnich n clenu harmonicke posloupnosti
% [h]=Harmonicka(n);
% h ... hodnota harmonickeho souctu
% n ... pocet clenu rady
h=0; % soucet zacina od nuly
for k=1:n % zacina cyklus
   h=h+1/k; % pricteme 1,1/2,1/3...
end % konci cyklus
 
 
  Příklad 6A.5:  
  Rozdíl mezi součtem prvních n členů harmonické posloupnosti a přirozeným logaritmem počtu členů se limitně blíží Eulerově konstantě pokud se n blíží nekonečnu. Sestavte funkci pro aproximaci Eulerovy konstanty n-tým rozdílem.  
  Řešení:  
 
function [c]=EulerC(n)
% n ty odhad Eulerovy konstanty C
% [c]=EulerC(n);
% h ... hodnota C(n)
% n ... pocet clenu posloupnosti
c=Harmonicka(n)-log(n); % ted uz je to snadne
 
 
  Příklad 6A.6:  
  Sestavte funkci pro výpočet součtu prvních n členů obecné posloupnosti zadané vektorem hodnot.  
  Řešení:  
 
function [s]=Posloupnost(a,n)
% Castecny soucet prvnich n clenu posloupnosti a(1),a(2),...,a(n)
% [s]=Posloupnost(a,n);
% s ... hodnota souctu
% a ... vektor obsahujici jednotlive cleny posloupnosti
% n ... pocet clenu castecneho souctu
delka=size(a,2); % zjisteni delky vektoru a
if n>delka % chceme-li vice clenu nez je k dispozici
   n=delka; % mame smulu
end % konec nedemokratickeho postupu
s=0; % soucet zacina od nuly
for k=1:n % zacina cyklus
   s=s+a(k); % pricteme a(1),a(2),a(3)...
end % konci cyklus
 
  Příklad 6A.7:  
  Sestavte funkci pro výpočet součtu prvních n členů obecné posloupnosti zadané funkčním předpisem.  
  Řešení:  
 
function [s]=SoucetP(jmenoa,n)
% Castecny soucet prvnich n clenu posloupnosti
% dane funkcnim predpisem pro a(k)
% [s]=SoucetP(jmenoa,n);
% s ... hodnota souctu
% jmenoa ... nazev funkce a(k) jako textovy retezec
% n ... pocet clenu castecneho souctu
s=0; % soucet zacina od nuly
for k=1:n % zacina cyklus
   s=s+feval(jmenoa,k); % pricteme a(1),a(2),a(3)...
end % konci cyklus
 
  Příklad 6A.8:  
  Sestavte funkci pro výpočet hodnoty Besselovy funkce J0 jako součtu konvergentní řady.
Instrukce: V literatuře najdeme jistě i zajímavější a užitečnější konvergentní řady pro jiné funkce. Proč není možné funkci aplikovat na vektory či matice?
 
  Řešení:  
 
function [s]=PokusnaJ0(x)
% Besselova funkce J0 jako soucet konvergentni rady
% [s]=PokusnaJ0(x);
% s ... hodnota souctu konvergentni rady
% x ... nezavisle promenna
a=1; % prvni clen rady
s=0; % soucet zacina od nuly
for k=1:10000 % zacina bezpecny cyklus
   s=s+a; % pricteni clenu rady
   a=-(x/2/k)^2*a; % tajemstvi rady pro J0
   if abs(a)<1e-20 % staci to?
      s=s+a; % vylepsit jeste soucet
      return; % koncit vse
   end
end % konci cyklus
s=inf; % nekonverguje to
 
  Příklad 6A.9:  
  Sestavte skalární funkci pro výpočet hodnoty Besselovy funkce J0.
Instrukce: Jde o ukázku realizace skalární funkce, která je prvek po prvku aplikovatelná na libovolný vektor či matici reálných či komplexních čísel.
 
  Řešení:  
 
function [y]=J0(x)
% Besselova funkce J0 jako skalarni funkce
% [y]=J0(x);
% y ... matice J0(x)
% x ... matice x
mm=size(x,1); % pocet radku
nn=size(x,2); % pocet sloupcu
y=zeros(mm,nn);
for m=1:mm % cyklus pro vsechny radky
   for n=1:nn % cyklus pro vsechny sloupce
      y(m,n)=PokusnaJ0(x(m,n)); % prvek po prvku
   end % konec cyklu pro sloupce
end % konec cyklu pro radky
 
  Příklady pro samostatné vypracování  
  Příklad 6B.1:  
  Pomocí funkce NSD sestavte funkci pro výpočet nejmenšího společného dělitele čísel uložených ve vektoru. Vektor použijte k řízení cyklu.  
 
  Příklad 6B.2:  
  Pyramida je stavěna z kostek a bez dutin. Výška pyramidy je H. Základna pyramidy je čtverec o straně H. Sestavte funkci pro spotřebu kostek na její stavbu.  
 
  Příklad 6B.3:  
  Pyramida je stavěna z kostek a bez dutin. Výška pyramidy je H. Základna pyramidy je čtverec o straně H. Určete spotřebu kostek na její stavbu pomocí funkce Posloupnost a vektorizace.  
 
  Příklad 6B.4:  
  Pyramida je stavěna z kostek a bez dutin. Výška pyramidy je H. Základna pyramidy je čtverec o straně H. Určete spotřebu kostek na její stavbu pomocí funkce SoucetP a další funkce.  
 
  Příklad 6B.5:  
  Realizujte aproximace funkcí exp(x), ln(1+x), ln(1-x), sin(x), cos(x), sinh(x), cosh(x), integrální funkce Si(x) – integrální sinus, Ci(x) – integrální cosinus, Ei(x) – integrální exponenciála, Li(x) – integrální logaritmus pomocí konvergentních řad na vhodných intervalech. Zvolte vhodné názvy funkcí, aby nedošlo ke kolizi a porovnejte s vestavěnými funkcemi Matlabu. O neznámé vzorce požádejte asistenta.  
 
  Seznam použitých příkazů  
  for, return  



© 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