|
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
|
|
|
|
|
|
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
|
|
|