Ušetřete

Hlavní navigace

Logo a matematika

Tentokrát si podrobněji řekneme, jaké matematické a logické funkce je možné v programech využívat. Také si ukážeme použití generátoru náhodných čísel (RNG - Random Number Generator), který lze použít v mnoha algoritmech, především ve spojení se želví grafikou.

Obsah

1. Logo a matematika
2. Dostupné matematické a logické funkce
3. Kreslení grafů funkcí
4. Graf funkce zadané formou parametru
5. Složitější příklad: princip harmonické analýzy
6. Generátor náhodných čísel
7. Kreslíme „náhodné“ sněhové vločky
8. Odkazy na další informační zdroje
9. Obsah následující části tohoto seriálu

1. Logo a matematika

V úvodních částech Letní školy programovacího jazyka Logo bylo uvedeno, že Logo bylo vytvořeno s ohledem na to, aby tento programovací jazyk bylo možné používat i pro výuku, zejména na základních školách. Pro mladší „adepty na programátory“ je určena především želví grafika a s ní související základní příkazy pro ovládání želvy. Ovšem i na základních školách se v hodinách matematiky vysvětlují některé poznatky z algebry, geometrie atd. Z tohoto důvodu Logo obsahuje ucelenou řadu matematických a logických funkcí, které lze ve vytvářených programech použít. Samozřejmě se nejedná o specializovaný nástroj typu Octave, Matlab či Mathematica, ovšem běžné potřeby výuky i praxe Logo pokrývá. Navíc však existují i rozsáhlé balíky knihoven, určených zejména pro NetLogo (viz druhá část tohoto seriálu), kterými se tento programovací jazyk může rozšiřovat i o prostředky určené pro numerické a symbolické výpočty atd.

Ze syntaktického hlediska je zápis funkcí možný dvěma způsoby. Buď se v programu nejprve uvede jméno funkce, za nímž následují parametry oddělené bílými znaky (mezerami, tabulátorem). Parametry se nezapisují do závorek ani se neoddělují čárkou, jak je to obvyklé u jazyků, jejichž pradědečkem je Fortran. Druhý způsob, který některá Loga pro složitější funkce, tj. pro funkce s proměnným počtem parametrů zavádí, je založený na LISPovské syntaxi: funkce je i se svými parametry zapsána mezi kulaté závorky a parametry se opět od sebe oddělují pouze bílým znakem, nikoli čárkou. Tento druhý způsob je nutné použít u funkcí, které akceptují předem neznámý počet parametrů. Typickým příkladem je funkce sum (součet řady čísel), kterou je možné volat oběma způsoby. Při použití prvního způsobu lze sečíst pouze dva argumenty (má tedy stejný význam jako operátor +), druhý způsob zápisu funkce nám dovolí použít libovolné množství argumentů, což je patrné z následujícího příkladu (kurzívou je označen výpis interpreteru Loga):

show sum 10 20
30

show sum 10 20 100
30

You don't say what to do with 100 - chybný počet argumentů
show (sum 10 20)
30

show (sum 10 20 100)
130 

2. Dostupné matematické a logické funkce

Matematické a logické funkce můžeme rozdělit do několika kategorií. V následujících tabulkách jsou vypsány aritmetické funkce, logické funkce, goniometrické funkce atd.

Základní aritmetické funkce

Jméno funkce Význam
sum součet dvou čísel nebo (pro LISPovskou syntaxi) libovolně dlouhé řady čísel
difference rozdíl dvou čísel
minus obrací znaménko argumentu
product vynásobení dvou čísel nebo (pro LISPovskou syntaxi) libovolně dlouhé řady čísel
quotient dělení celočíselných či reálných čísel (podle typu dat)
remainder zbytek po dělení
int převod reálného čísla na nejbližší celočíselnou hodnotu
round zaokrouhlení reálného čísla na celočíselnou hodnotu

Pokročilejší funkce

Jméno funkce Význam
sqrt druhá odmocnina zadané číselné hodnoty (platí pouze pro nezáporné parametry)
power výpočet xy, kde x a y jsou hodnoty argumentů
exp výpočet ex, kde e je Eulerova konstanta
log10 výpočet desítkového logaritmu
ln výpočet přirozeného logaritmu (o základu e)

Goniometrické funkce

Jméno funkce Význam
sin výpočet funkce sinus pro úhel zadaný ve stupních
cos výpočet funkce kosinus pro úhel zadaný ve stupních
arctan výpočet funkce arkustangent, výsledek je vrácený ve stupních
(arctan x y) výpočet funkce arkustangent pro hodnotu y/x – obdoba céčkovské funkce atan2()
radsin výpočet funkce sinus pro úhel zadaný v radiánech
radcos výpočet funkce kosinus pro úhel zadaný v radiánech
radarctan výpočet funkce arkustangent, výsledek je vrácený v radiánech

Bitové funkce

Jméno funkce Význam
bitand operace logického součinu prováděná bit po bitu
bitor operace logického součtu prováděná bit po bitu
bitxor operace logické non-ekvivalence prováděná bit po bitu
bitnot negace prováděná bit po bitu
ashift aritmetický posun hodnoty doleva či doprava (podle znaménka druhého parametru)
lshift logický posun hodnoty doleva či doprava (podle znaménka druhého parametru)

Logické funkce

Jméno funkce Význam
and operace logického součinu
or operace logického součtu
not operace logické negace

3. Kreslení grafů funkcí

Předchozí kapitola byla pro většinu čtenářů zcela jistě nudná (ostatně jako většina textů, které se podobají referenční příručce), takže si pojďme na praktických příkladech ukázat, jakým způsobem lze některé výše uvedené funkce vykreslit. Samotný graf funkce je z mnoha ohledů vhodný i pro výuku – lze na něm prakticky ukázat mnohé vlastnosti funkcí, jako je jejich monotónnost, periodicita, lokální minima a maxima, inflexní body atd. Tyto pojmy sice patří až do „vyšší“ matematiky, je však možné je pochopit i intuitivně. V následujícím příkladu je ukázáno, jakým způsobem lze vytvořit program pro vykreslení průběhu jedné periody funkce sinus. Nejprve jsou pomocí procedury osy nakresleny souřadné osy a posléze se v proceduře graf pomocí programové smyčky vykreslí graf zadané funkce (barva vykreslení grafu funkce je odlišná od implicitní barvy použité pro kreslení os).

Pro vlastní vykreslení grafu funkce je použita absolutní grafika, tj. nejsou používány tradiční příkazy pro relativní natočení a posun želvy, ale procedura setpos sloužící pro její absolutní pozicování v rámci globálního souřadného systému. Vzhledem k tomu, že procedura setpos vyžaduje jako svůj argument souřadnice zadané v seznamu, je nutné použít proceduru list pro vytvoření nového seznamu obsahujícího požadovanou dvojici souřadnic:

; vykreslení souřadných os
to osy
    setpencolor 7
    penup
    setpos [-150 0]
    pendown
    right 90
    forward 360
    penup
    setpos [-150 70]
    pendown
    setpos [-150 -70]
end

; vykreslení grafu funkce
to graf
    setpencolor 2
    penup
    setpos [-150 0]
    pendown
    make "x 0
    repeat 360 [
        make "x :x + 1
        make "y 70.0*sin :x
        setpos list (:x - 150 ):y
    ]
end

; samotné vytvoření grafu i se souřadnými osami
to kresli
    clearscreen
    osy
    graf
end

(draw 300 300)
kresli 

logo0901
Obrázek 1: Graf jedné periody funkce sinus

4. Graf funkce zadané formou parametru

Předchozí příklad má několik nectností. Jednou z nich je, že funkce, jejíž průběh se má vykreslit, je pevně „zadrátovaná“ přímo v programovém kódu procedury graf. To není z mnoha ohledů ideální řešení, zejména v případě, že program má sloužit pro výuku a testování vlastností dalších matematických funkcí. Pokusme se tuto nectnost programu odstranit. Můžeme přitom využít faktu, že se v Logu dá pomocí parametrů předávat i programový kód. Pokud je tento kód zapsán formou řetězce, není proveden (spuštěn) ve chvíli volání nějaké procedury, ale až ve chvíli, kdy tento kód předáme například proceduře invoke (nebo apply popř. map, ale o těchto funkcích si povíme někdy příště). Jedno z možných řešení je tedy předávat funkci graf jméno funkce, jejíž průběh se má vykreslit, a ve chvíli, kdy se počítá hodnota proměnné y pak zavolat proceduru invoke s parametrem :funkce. Vše je ukázáno v následujícím programovém kódu:

; vykreslení lokálních souřadných os pro vytvoření průběhu funkce
to osy
    setpencolor 7
    penup
    setpos [-150 0]
    pendown
    right 90
    forward 360
    penup
    setpos [-150 70]
    pendown
    setpos [-150 -70]
end

; vykreslení grafu funkce
to graf2 :funkce :barva
    setpencolor :barva
    penup
    setpos [-150 0]
    pendown
    make "x 0
    repeat 360 [
        make "x :x + 1
        make "y 70.0*invoke :funkce :x
        setpos list (:x - 150 ):y
    ]
end

; samotné vytvoření grafu i se souřadnými osami
to kresli
    clearscreen
    osy
    graf2 "sin 5
    graf2 "cos 6
end

kresli 

logo0902
Obrázek 2: Graf jedné periody funkce sinus a kosinus

Může se stát, že budeme potřebovat vykreslit nějakou složitější funkci, například sin 2× × cos x. Řešení je jednoduché: Logo nerozlišuje mezi interními a uživatelskými procedurami. To znamená, že postačuje vytvořit novou proceduru, která bude akceptovat jeden číselný parametr a bude pomocí procedury output vracet číselnou hodnotu. Jméno této funkce (chování má stejné, jako matematicky chápaná funkce) je možné předat proceduře graf2, což je patrné z následujícího demonstračního příkladu, ve kterém je vytvořena nová uživatelská matematická funkce nazvaná sin2cos, jejíž průběh je vykreslen spolu s průběhem goniometrických funkcí sinus a kosinus:

; vykreslení lokálních souřadných os pro vytvoření průběhu funkce
to osy
    setpencolor 7
    penup
    setpos [-150 0]
    pendown
    right 90
    forward 360
    penup
    setpos [-150 70]
    pendown
    setpos [-150 -70]
end

; vykreslení grafu funkce
to graf2 :funkce :barva
    setpencolor :barva
    penup
    setpos [-150 0]
    pendown
    make "x 0
    repeat 360 [
        make "x :x + 1
        make "y 70.0*invoke :funkce :x
        setpos list (:x - 150 ):y
    ]
end

; nová funkce, jejíž průběh se má vykreslit
to sin2cos :x
    output sin :x*2 * cos :x
end

; samotné vytvoření grafu i se souřadnými osami
to kresli
    clearscreen
    osy
    graf2 "sin 5
    graf2 "cos 6
    graf2 "sin2cos 4
end

kresli 

logo0903
Obrázek 3: Průběh funkcí sinus, kosinus a sin 2× × cos x

5. Složitější příklad: princip harmonické analýzy

Goniometrické funkce se samozřejmě dají použít i ve složitějších aplikacích. Ukažme si program pro vykreslení průběhu periodického signálu složeného z několika sinusových signálů. Poměry kmitočtů sousedních sinusových signálů jsou 1:2. Na tomto příkladu lze vysvětlit například princip harmonické analýzy či syntézy audio signálů. Harmonická analýza je, velmi zjednodušeně řečeno, založena na rozkladu libovolného periodického signálu na sinusové a kosinusové průběhy s poměrem kmitočtů 1:2n; jediné, co se mění, jsou amplitudy těchto průběhů (http://tlapic­ka.net/pokusy_a­nalyza.php). V aplikaci, jejíž zdrojový kód je vypsán níže, je možné samostatně vykreslit jak průběhy tří bázových sinusových funkcí, tak i součet těchto funkcí. Amplitudy jsou předávány jako parametry procedury synteza, povoleny jsou i záporné amplitudy. Aplikaci by šlo rozšířit tak, aby procedura synteza mohla vykreslit signál složený z libovolného počtu sinusových funkcí. K tomu slouží takzvané nepovinné parametry, jejichž princip však bude vysvětlen až v navazujících částech tohoto seriálu.

; vykreslení lokálních souřadných os pro vytvoření průběhu funkce
to osy :posun
    setpencolor 7
    penup
    setpos list -150 (0 + :posun)
    pendown
    setheading 90
    forward 360
    penup
    setpos list -150 (80 + :posun)
    pendown
    setpos list -150 (-80 + :posun)
end

; vykreslení průběhu jednoho signálu specifikovaného barvou a trojicí amplitud
to graf_syntezy :posun :color :a1 :a2 :a3
    setpencolor :color
    penup
    setpos list -150 :posun
    pendown
    make "x 0
    repeat 360 [
        make "x :x + 1
        ; součet všech tří signálů o specifikovaných amplitudách
        make "y :a1*sin :x
        make "y :y+:a2*sin (:x*2)
        make "y :y+:a3*sin (:x*4)
        setpos list :x-150 :y+:posun
    ]
end

; vykreslení průběhů bázových funkcí i výsledného signálu
to synteza :a1 :a2 :a3
    clearscreen
    ht
    osy 280
    osy 100
    osy -80
    osy -260
    graf_syntezy  280 3 :a1 0   0
    graf_syntezy  100 2 0   :a2 0
    graf_syntezy  -80 4 0   0   :a3
    graf_syntezy -260 6 :a1 :a2 :a3
end

(draw 400 400)
synteza 80 40 20

; existuje i možnost zápisu záporné amplitudy
; synteza 60 -40 30 

logo0904
Obrázek 4: Průběh tří sinusových signálů a jejich součtu

6. Generátor náhodných čísel

Při psaní některých typů aplikací, například simulací či počítačových her, se neobejdeme bez takzvaných generátorů náhodných čísel (RNG – Random Number Generators). Ve skutečnosti se jedná o pseudonáhodné generátory (skutečně náhodná čísla vyžadují specializovaný hardware), ale například Berkeley Logo (dostupné i v Linuxu) používá generátor založený na céčkovské knihovně GNU, který i přes svoji pseudonáhodnost vykazuje dobré statistické vlastnosti.

Logo, podobně jako i další programovací jazyky, obsahuje funkci random, která vrací celočíselnou náhodnou hodnotu v rozsahu 0..(x-1), kde x je celočíselný parametr předávaný této funkci. Existuje i druhá možnost zápisu (random min max), při kterém je pomocí parametrů min a max zadán rozsah, ve kterém musí vygenerovaná náhodná hodnota ležet. Vzhledem k tomu, že je (například při ladění programů) vhodné, aby se generovaly stejné sekvence náhodných čísel, je možné pomocí zápisu (rerandom seed) nastavit tzv. semínko generátoru náhodných čísel na zadanou hodnotu seed. Pokud se naopak pouze zavolá procedura rerandom bez parametrů, je generátor náhodných čísel inicializován na hodnotu získanou z časovače a tedy obecně nereprodukova­telnou.

logo0905
Obrázek 5: Průběh jiných tří sinusových signálů a jejich součtu (jeden signál má zápornou amplitudu)

7. Kreslíme „náhodné“ sněhové vločky

V dnešním posledním demonstračním příkladu bude ukázáno, jakým způsobem lze využít generátor (pseudo)náhodných čísel pro vykreslení scény složené z několika sněhových vloček Helge von Kocha generovaných předminule popsaným rekurzivním algoritmem. Každá vykreslená vločka má nastavenou náhodnou velikost v rozmezí 10..110. Také umístění vločky v ploše je náhodné, protože před vykreslením každé vločky je nejprve želva natočena do libovolné pozice (left random 360) a posléze je posunuta o náhodnou hodnotu v rozmezí 20..220 kroků (forward 20+random 200). Aby té náhodnosti nebylo málo, je i barva každé vločky vybrána náhodně z intervalu 0..7 (jedná se o rozsah barev, který je podporovaný v použitém interpreteru Loga Turtle Tracks). Při spuštění programu se zadává celkový počet vloček, které se mají v počítané smyčce vygenerovat:

; vykreslení jedné strany vločky Helge von Kocha
to koch1 :a
    ifelse :a>5 [
        koch1 :a/3
        right 60
        koch1 :a/3
        left 120
        koch1 :a/3
        right 60
        koch1 :a/3
    ] [
        forward :a
    ]
end

; vykreslení sněhové vločky Helge von Kocha
to kochova :a
    repeat 3 [
        koch1 :a
        left  120
    ]
end

; náhodný posun želvy před vykreslením vločky
to nahodny_posun
    penup
    ; alternativní možnost zápisu změny polohy želvy (jiný význam!)
    ; setpos list (-150 + random 300) (-150 + random 300)
    home
    left random 360
    forward 20+random 200
    pendown
end

; vykreslení celé scény s vločkami Helge von Kocha
to scena :opak
    clearscreen
    hideturtle
    repeat :opak [
        ; nastavení barvy pro další kreslení
    setpencolor random 8
        nahodny_posun
        kochova (10+random 100)
        nahodny_posun
    ]
end

(draw 300 300)
scena 30 

logo0906
Obrázek 6: Výsledek běhu předchozího demonstračního příkladu

8. Odkazy na další informační zdroje

  1. Abelson H.:
    Turtle geometry. The Computer as a Medium for Exploring Mathematics,
    The MIT Press, Cambridge Massachusetts, 1981
  2. Clayson James:
    Visual Modeling with Logo
    MIT Press
  3. Muller Jim:
    The Great Logo Adventure
    Young People's Logo Association:
  4. Prusinkiewicz, Przemyslaw a Aristid Lindenmayer:
    The Algorithmic Beauty of Plants
    Springer-Verlag, 1990
  5. Tržilová Dana:
    LOGO a matematika
    JIHOČESKÁ UNIVERZITA V ČESKÝCH BUDĚJOVICÍCH, PEDAGOGICKÁ FAKULTA, 1993
    učební text pro studenty výběrového semináře

9. Obsah následující části tohoto seriálu

V další části seriálu o programovacím jazyce Logo si vysvětlíme pokročilejší operace želví grafiky, pomocí kterých je možné vykreslovat vícebarevné obrazce, použít několik želv současně atd.

Pavel Tišnovský

Pavel Tišnovský

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro Customer Content Services.

Ohodnoťte jako ve škole:
Průměrná známka 2,85

Školení: Linux – Firemní server (třídenní)

  • Poštovní server, DNS a DHCP server, Proxy server.
  • Webový server APACHE, PHP, FTP.
  • Databázový server MySQL, správa phpMyAdmin.
´

Zjistěte více informací o školení>>

       
3 názory Vstoupit do diskuse
poslední názor přidán 25. 8. 2007 20:07

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem