Premium

Získejte všechny články
jen za 89 Kč/měsíc

Cesta do hlubin fraktálovy duše IX

Kromě dalších obrázků se v tomto pokračování fraktální série podíváme na to, jak kalkulačky (některé) vlastně počítají funkci sinus. Podrobné studium tohoto algoritmu doporučuje devět z deseti guru jako ideální lehké čtení k vodě.

Dnes vám ukážu pár obrázků Juliovy množiny vytvořených pomocí goniometrických a hyperbolických funkcí namísto tradiční funkce kvadratické.

Galeje

Každý středoškolák ví, že sínus je "protilehlá ku přeponě", popřípadě y-ová souřadnice bodu rotujícího po kružnici, takže by se mohlo zdát, že pro kalkulačku to bude snadné sousto. Ale úplně triviální to není. Počítač nemůže jen tak popadnout úhloměr, vysmahnout příslušný trojúhelník a pravítkem změřit jeho strany.

Jak to tedy taková průměrně blbá kalkulačka zvládne?

Jednak si může pár hodnot předpočítat napevno (koneckonců možných úhlů je jen 360°), uložit je do paměti a zbytek odhadnout pomocí interpolace (ať lineární či nelineární), a jednak si může vypomoci rozvojem sínu do mocninných řad a prostě spočítat prvních pár členů (kolik? - to záleží na požadované přesnosti). Pokud vás zajímají jen určité speciální hodnoty, můžete nasadit standardní matematické triky a pokusit se hodnoty funkce sínus spočítat z různých goniometrických formulek.

Algoritmus, který vám chci představit, funguje trochu jinak. Jmenuje se CORDIC a v jeho dnešní podobě ho na svět uvedl jeden z inženýrů americké firmy Convair, Jack Volder, když v roce 1956 pracoval na zařízení umožňujícím rychlé měření rotace pro použití v avionice.

CORDIC má dvě základní ingredience.

Tou první je známá taktika ze školácké hry, ve které si váš spolužák myslí číslo a vy se snažíte ho uhodnout - přičemž váš protihráč odpovídá pouze "výš" nebo "níž". Je lehce ověřitelným faktem, že nejlepší strategií je půlit dohodnutý interval a přidávat nebo ubírat podle situace (na tomto principu je mimochodem založena i jedna z metod na hledání kořenů nelineárních rovnic - půlení intervalu).

Předpokládejme, že dohodnutý interval je 1:128 (aby se to dobře půlilo) a protihráč - říkejme mu Kuba - si myslí "37". Nejlepší první otázka je "64?" (tedy 128/2), kdy polovina možností leží "níž" a polovina "výš". Kuba odpoví "níž". Rozpůlíme tedy spodní interval (64/2=32) a náš druhý pokus bude "32?". Kuba řekne "výš", opět rozpůlíme interval (32/2=16) a těch 16 přihodíme ke spodní hranici (nebo odečteme od horní): "48?". Na Kubovo "níž" opět rozpůlíme interval (16/2=8) a dotážeme se "40?". Kuba nás dalším "níž" pošle do intervalu (32,40) a za chvíli jsme doma. Můžete samozřejmě střílet od boku a navrhovat i jiná "chytrá řešení", ale statisticky vzato vám půlení zaručí v průměru (tedy při mnoha opakováních) nejrychlejší úspěch.

Druhou ingrediencí je již zmíněná skutečnost, že sínus daného úhlu t je y-ová souřadnice odpovídajícího bodu na jednotkové kružnici (a protože s ním budeme mohutně rotovat, můžete si ho představit jako jednotkový vektor). Jako počáteční odhad si vezmeme vektor (1,0) a pokusíme se ho sérií otázek "níž nebo výš" dostrkat do pozice, kdy bude jeho úhel dostatečně přesně aproximovat zadanou hodnotu t. Tak jako jsme při hádání čísla přidávali nebo ubírali pevnou sekvenci (64,32,16,8,4,2,1), zde budeme při "hádání" úhlu t rotovat vektor po nebo proti směru hodinových ručiček o "pevnou" sekvenci úhlů u[i] (přesně vám ji prozradím za chvilku), která se v každém kroku bude zmenšovat zhruba o polovinu.

Celé kouzlo spočívá v tom, že během tohoto procesu si budeme "pamatovat" nejen náš momentální úhel, který jsme pomocí těchto "pevných" rotací vytvořili, ale také příslušný "narotovaný" vektor, který si označíme v[i]={x[i],y[i]}. Jakmile náš úhel dosáhne požadované přesnosti (tj. jakmile uhodneme Kubovo číslo), pošleme na výstup y-ovou složku tohoto vektoru a máme sínus úhlu t.

+++++++++

Nejprve si připomeneme rotační matici, odpovídající (zatím nespecifikovanému) úhlu u[i]

R[i] = {{cos(u[i]),-sin(u[i])},{sin(u[i]),cos(u[i])}}

Protože se ale chceme vyhnout použití sínu a kosínu (ty přece počítáme), vytkneme z celé matice kosínus a dostaneme

R[i] = {{1,-tan(u[i])},{tan(u[i]),1}} * cos(u[i])

Počítání posloupnosti vektorů bude probíhat podle tradičního schematu

{x[i+1],y[i+1]} = R[i]. {x[i],y[i]}

Aby se nám to dobře počítalo, budeme v i-tém kroku rotovat o úhel splňující

tan(u[i]) = 1/2^i

To znamená, že příslušná matice bude (až na ten kosínus) vypadat takto

R[i] = {{1,-1/2^i},{1/2^i,1}}

a počítačům se s ní bude dobře počítat, protože tak jako se lidem dobře dělí mocninami deseti (jsme zvyklí na desítkovou soustavu), počítačům se dobře dělí mocninami dvojky (počítají binárně).

Když si ty rotované vektory rozepíšeme do složek, dostaneme poměrně snesitelné iterační schema, obsahující pouze algebraické operace (všechny goniometrické funkce jsme už vyhubili)

x[i+1] = x[i] - p[i]*y[i]/2^i
y[i+1] = y[i] + p[i]*x[i]/2^i

kde hodnota p[i] je 1 nebo -1, podle toho zda jsme "níž" nebo "výš" než zadaný úhel t. To p[i] nám de facto říká, zda máme ten úhel u[i] přičíst nebo odečíst (tj. zda ten úhel bereme v kladném či záporném smyslu).

Abyste si udělali obrázek, jak velké ty "pevné" rotace jsou, tady je první pětice úhlů

u[0] = arctan(1/2^0) = arctan(1) = 0.785 radiánů (tj. 45°)
u[1] = arctan(1/2^1) = arctan(1/2) = 0.464 (26.56°)
u[2] = arctan(1/2^2) = arctan(1/4) = 0.245 (14.04°)
u[3]= arctan(1/2^3) = arctan(1/8) = 0.124 (7.12°)
u[4]= arctan(1/2^4) = arctan(1/16) = 0.062 (3.57°)

Vidíte, že s výjimkou úvodu ty úhly prakticky půlíme - to je proto, že pro malé hodnoty přibližně platí tan(x)~x. Kdybychom je půlili natvrdo, tak už by nesplňovaly ty definiční tangensové rovnice a nám by se nepodařilo z těch iteračních formulek vyštípat goniometrické funkce.

Možná vám neuniklo, že v původní formulce pro matici R[i] jsem zapomněl na ten vytknutý cos(u[i]). On není pro rotaci podstatný - je to pouze skalární faktor, který v každém kroku násobí celou matici a protože máme konstantní sekvenci úhlů (mění se jen jejich znaménko), můžeme si všechny ty kosíny vynásobit předem (kosínus je vůči znaménku imunní: cos(u) = cos(-u)) a touto konstantou nakonec pronásobit výsledek.

Abych to shrnul: v tom "školáckém příkladu" jsme se snažili vyjádřit "hádané číslo" pomocí zmenšujících se mocnin dvojky (jako kdybychom hledali jeho binární rozvoj). Podobně se při algoritmu CORDIC snažíme "slepit" zadaný úhel t pomocí pevných úhlů u[i] a tím dostat iterační schema, které je jednoduché a hardwarově výhodné (protože používá mocniny dvojky). Zhruba platí, že na každé desetinné číslo výsledku musíme udělat jednu iteraci.

Pokud si s tím chcete hrát, tady najdete příklad ve formátu pdf.

+++++++++

Galerie

Nejprve pár kapradin z goniometrického zátiší.

(tohle byl detail předchozího obrázku, abyste viděli jak jsou ty "provázky" jemné)

 Vidíte, že na rozdíl od polynomiálních funkcí, jejichž Juliova množina byla omezená, jsou tyto výtvory donekonečna se opakujícím "nátiskem" téhož vzorku, což je způsobeno periodicitou goniometrických a hyperbolických funkcí.

+++++++++

Předchozí díly série "Cesta do hlubin fraktálovy duše"

Autor: Jan Řeháček | pátek 9.8.2019 9:09 | karma článku: 19,14 | přečteno: 655x
  • Další články autora

Jan Řeháček

Jaro: das ist nur die erste Phase

Jaro má v našem parku tři fáze, které jsem výstižně pojmenoval: první, druhá a třetí. Toto je svědectví o první z nich. Můžeme s ním nesouhlasit, můžeme proti němu protestovat, ale to je asi tak vše, co s tím můžeme dělat, Járo.

9.4.2024 v 9:09 | Karma: 16,66 | Přečteno: 415x | Diskuse| Fotoblogy

Jan Řeháček

A je po Velikonocích. A nejen po nich.

Globální kotlík zavěšený nad ohněm inkluze a diversity pomalu vytlačuje národní státy, vyrůstající ze sdíleného kulturního podhoubí. Tomuto trendu se nově přizpůsobuje i řada českých svátků s jejichž novelizací vás chci seznámit.

1.4.2024 v 9:09 | Karma: 21,15 | Přečteno: 457x | Diskuse| Společnost

Jan Řeháček

Impresionisté na hladině

Když se na podzim objevily barvy na stromech, všiml jsem si, že se občas zrcadlí v našem potoce či rybníčku. Tak jsem na ně zamířil objektiv a vyšly z toho roztěkané výtvarné kreace, za které by se nemusel stydět ani Claude Monet.

9.3.2024 v 9:09 | Karma: 22,50 | Přečteno: 321x | Diskuse| Fotoblogy

Jan Řeháček

AI Art: co už umí a co ještě ne

Loni jsem trochu experimentoval s malířskými schopnostmi tehdy nastupující generativní AI Art. Letos, za dlouhých zimních večerů jsem si na to vzpomněl a napadlo mne podívat se, jak moc za ten rok AI pokročila. Nu, posuďte sami.

15.2.2024 v 9:09 | Karma: 17,90 | Přečteno: 370x | Diskuse| Ostatní

Jan Řeháček

Není větvička jako větvička

Stromy a jejich rozeklaná větvoví jsou sochařská díla. V létě to ale nepoznáte, protože přírodní majstrštyky zakrývá koruna. Jakmile ale podzim povolá svá vojska zpět do zálohy, ladná elegance dřevěných křivek vystoupí do popředí.

9.2.2024 v 9:09 | Karma: 19,45 | Přečteno: 434x | Diskuse| Fotoblogy

Jan Řeháček

Co rok dal

Začátek nového roku je tradičně příležitostí k ohlédnutí za rokem starým, takže jsem prohrábl archív a vylovil z něho pár fotografií z našeho parku, které si nenalezly cestu do některého z předchozích tématických blogů.

9.1.2024 v 9:09 | Karma: 17,23 | Přečteno: 229x | Diskuse| Fotoblogy

Jan Řeháček

Politické školení mužstva: Pyšná princezna

Roto končit! Pozor! (vejde útvarový politruk) Soudruzi vojáci, kapitál se potácí. Ale sám se nám na smetiště dějin nevypotácí. My mu musíme co, soudruzi? No? Nikdo? No, my mu musíme pomoci, vy hlavy hovězí!

31.12.2023 v 9:09 | Karma: 25,82 | Přečteno: 908x | Diskuse| Poezie a próza

Jan Řeháček

Ten podzim se nám hezky vybarvil

Každý podzim je v našem parku trochu jiný. Stromy, které by loni přešminkovaly i šestnáctku před prvním rande, jsou letos pobledlé jako Rusalka. A ty, které se zprvu barevně upejpaly, se najednou utrhly z řetězu. Jak řezníkův pes.

9.12.2023 v 9:09 | Karma: 19,07 | Přečteno: 322x | Diskuse| Fotoblogy

Jan Řeháček

Paroháčů je letos dost

Srnka je v našem parku jako houska na krámě. Zato setkání s jelenem si člověk musí považovat. Letos jsem ale náhodou objevil, kde se srocují: na záložním travnatém parkovišti, kterému se říká Gil's Hill, těsně před západem slunce.

9.11.2023 v 9:09 | Karma: 19,30 | Přečteno: 346x | Diskuse| Fotoblogy

Jan Řeháček

Chřadnoucí prales - pod vodou i nad ní

O korálovém útesu se říká, že je to "dešťový prales" oceánu. Biodiversita, kterou reprezentuje je ohromující. Totéž platí i o jeho suchozemském ekvivalentu. Bohužel, oba ekologické systémy se dostávají na seznam ohrožených druhů.

27.10.2023 v 9:09 | Karma: 14,26 | Přečteno: 261x | Diskuse| Životní prostředí a ekologie

Jan Řeháček

Letní kvítí

Primární sezónou květů je sice jaro, ale ani léto není v našem parku z pohledu barev úplná nuda. Tady je malá fotovonička složená z příspěvků místní flory. Aneb kdo nekvete s námi, kvete proti nám.

9.10.2023 v 9:09 | Karma: 17,88 | Přečteno: 191x | Diskuse| Fotoblogy

Jan Řeháček

Plody léta

Léto je časem zrání a ani v našem parku tomu není jinak. Zajímavé plody nabízí říše rostlinná i živočišná. Tady je malý průřez letošní nabídkou: asijské maliny, kuriózní houby a malí mývalové. Ceny jsou mírné: léto létá zdarma.

9.9.2023 v 9:09 | Karma: 16,17 | Přečteno: 308x | Diskuse| Fotoblogy

Jan Řeháček

Kvetoucí fuga (Beethoven)

V Beethovenově Misse Solemnis nalezneme spoustu skrytých drahokamů, které zde leží prakticky nepovšimnuty, protože celková hudební struktura této Mše je na první poslech naprosto neprůstřelná. Jedním z nich je fuga v závěru Creda.

27.8.2023 v 9:09 | Karma: 14,39 | Přečteno: 321x | Diskuse| Kultura

Jan Řeháček

Sovy a supi

V našem parku také poletuje spousta zajímavých ptáků. Tak jsem jich pár vyfotil. Sovy jsou sice nočními živočichy, ale na jaře se občas dají zastihnout i za denního světla. A za pár šupů k nim přihodím ještě pár supů. Ať nežeru.

9.8.2023 v 9:09 | Karma: 20,92 | Přečteno: 341x | Diskuse| Fotoblogy

Jan Řeháček

Vlčí západy

Při procházkách naším parkem občas fotím západy slunce z vyvýšeného travnatého parkoviště zvaného Gil's Hill. Říkám jim Vlčí západy. Jednak proto, že mají zhusta barvu vlčích máků a jednak proto, že náš park se jmenuje Vlčí past.

9.7.2023 v 9:09 | Karma: 16,96 | Přečteno: 344x | Diskuse| Fotoblogy

Jan Řeháček

Za devatero fotkami: Malebné peklo

Já to tušil, že jednou skončím v pekle. Jen jsem si představoval, že vstup bude mít z nějaké islandské sopky. Houbeles! Jeho vchod se nalézá poblíž vesničky Medkovy Kopce nedaleko Hlinska. "Lasciate ogne speranza, voi ch'intrate".

21.6.2023 v 9:09 | Karma: 19,13 | Přečteno: 368x | Diskuse| Fotoblogy

Jan Řeháček

Sedm divů jara

Po dlouhém barevném půstu zimní šedi působí návrat jarní kavalerie jako zjevení. V našem parku v tomto období kvete několik dřevin, s jejichž uměleckými kreacemi bych vás v tomto blogu rád seznámil. Matička příroda dokáže kouzlit.

9.6.2023 v 9:09 | Karma: 16,12 | Přečteno: 233x | Diskuse| Fotoblogy

Jan Řeháček

strž

V dnešním pokračování poetického cyklu "Bez básně a Hany" se nedozvíme jakou krevní skupinu mají nejraději novozélandští upíři a zda je tuna pampeliškového chmýří těžší než sbírka maturitních příkladů z matematiky.

29.5.2023 v 9:09 | Karma: 14,28 | Přečteno: 296x | Diskuse| Poezie a próza

Jan Řeháček

Devět zastavení času

Příroda se mění pomalu, ale jistě. Den ze dne nic nepostřehnete, ale když se na známá místa vrátíte za pár týdnů, naleznete desítky drobných změn. Tak jsem se na třech místech našeho parku devětkrát zastavil, abych je zachytil.

9.5.2023 v 9:09 | Karma: 16,36 | Přečteno: 295x | Diskuse| Fotoblogy

Jan Řeháček

Cesta do hlubin duše (Beethoven)

Lidská duše je odvěkou hádankou, na které si vylámaly zuby celé generace psychologů, teologů a filosofů. Tajuplný komplex uvnitř každého z nás. Pro mne je definicí lidské duše Beethovenův 14. smyčcový kvartet cis moll, op. 131.

30.4.2023 v 9:09 | Karma: 14,42 | Přečteno: 289x | Diskuse| Kultura
  • Počet článků 402
  • Celková karma 19,53
  • Průměrná čtenost 920x
Devátý nejhorší kuchař na světě, odpůrce politické překorektnělosti, začínající marťan, neúnavný konzument točeného kyslíku a jazykový dobrodruh ab incunabulis. Člen Analytického piva a Gustavu pro jazyk český. Správce Vojensko-českého slovníku.