Premium

Získejte všechny články
jen za 49 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: 669x

Nominujte autora do ankety Bloger roku

Další články autora

Jan Řeháček

Zelený puč

Mláďata mají své osobité kouzlo. A to platí nejen o zvířatech, ale i o nových listech, které si stromy v našem parku v uplynulých týdnech pořídily.

9.5.2026 v 9:09 | Karma: 10,45 | Přečteno: 112x | Diskuse | Fotoblogy

Jan Řeháček

Washingtonští jestřábi (a jiní ptáci)

V našem parku poletuje spousta zajímavých ptáků. Zde je malá přehlídka opeřenců, kteří se mi nachomýtli před objektiv od minulého ptačího blogu (tj. za posledních cca 18 měsíců).

9.4.2026 v 9:09 | Karma: 13,62 | Přečteno: 183x | Diskuse | Fotoblogy

Jan Řeháček

Hormuzský problém vyřešen

Každé české vládě je jasné, že pokud litr benzínu stojí více než litr piva, je nutno začít jednat. Po měsíci přešlapování se proto premiér rozhodl podpořit akce spojenců a vyslat do oblasti podpůrnou jednotku na obranu tankerů.

1.4.2026 v 9:09 | Karma: 28,66 | Přečteno: 2210x | Diskuse | Politika

Jan Řeháček

Potok jménem Claude Monet

Koncem října se rád toulám podél našich potoků či rybníčku a pozoruji, jak se v nich krásně zrcadlí podzimní barvy. Malíř impresionista by se při takové procházce tetelil blahem.

9.3.2026 v 9:09 | Karma: 18,18 | Přečteno: 243x | Diskuse | Fotoblogy

Jan Řeháček

Tento způsob zimy zdá se mi poněkud nešťastným

Až do 31. ledna probíhala zima v našem parku celkem v pohodě. Tu a tam sněhová přeháňka a teploty kolem nuly nebo lehce nad ní. A pak přišla Sibiř.

9.2.2026 v 9:09 | Karma: 15,37 | Přečteno: 227x | Diskuse | Fotoblogy

Nejčtenější

Pavel se s Babišem neshodl. Prezident trvá na účasti na summitu NATO, hrozí žalobou

Prezident Petr Pavel přijal na Hradě premiéra Andreje Babiše (8. května 2026)
8. května 2026  5:15,  aktualizováno  14:10

Jednání prezidenta Petra Pavla s premiérem a předsedou ANO Andrejem Babišem o zastoupení Česka na...

O kolik lze překročit rychlost za volantem v roce 2026? Tabulka tolerancí a pokut pro řidiče

Upozornění na měření rychlosti v ulici A. Dvořáka nechybí, avšak řidiči...
8. května 2026  17:43

Při rozhodování o postihu za překročení limitu přihlížejí policisté zejména k naměřené rychlosti....

Blíží se další výluka, metro C tři dny nepojede. Jak se dostat z Kobylis na Pankrác?

Stanice metra Budějovická
7. května 2026  6:58

Kdo si na prodloužený květnový víkend naplánoval rychlou cestu přes centrum metrem, bude muset...

Skrytý ráj kousek za Prahou. „Tajná“ zahrada přetéká květy a lidé o ní skoro nevědí

Arboretum Všenory je méně známou alternativou k velkým zahradám typu Průhonice....
6. května 2026  7:30

Lepší než Průhonice? Voňavými kvítky čerstvě obdařené lýkovce, koberce plaménků, ale i nespočet...

Levnější doprava pro lidi nad 70 let? Další pražská radnice spustila Senior taxi

ilustrační snímek
9. května 2026  12:23

Od začátku května mohou senioři z Praha 14 využívat novou službu Senior taxi. Lidé nad 70 let...

Do řeky Moravy unikla neznámá látka. Hasiči monitorují místo pomocí dronu

Hasiči Zlínského kraje zasahují u úniku neznámé látky do řeky Moravy u...
12. května 2026  22:22,  aktualizováno  22:22

Do řeky Morava nad Bělovským jezem u Otrokovic unikla v úterý odpoledne neznámá látka. Hasiči na...

Kobylisy

Kobylisy
vydáno 12. května 2026  22:15

První doopravdy metrobus vyjede v létě na upravenou trasu linky 145 ta spojí sídliště Čimice,...

Mezi mostem Legií a Karlovým mostem

Mezi mostem Legií a Karlovým mostem
vydáno 12. května 2026  22:15

Tenis a plující auto na Vltavě.

Zloděj v černém ukradl z baziliky lebku svaté Zdislavy nevyčíslitelné hodnoty

Lebka svaté Zdislavy uložená v Jablonném v Podještědí. (1. května 2026)
12. května 2026  21:52

Neznámý pachatel odcizil v úterý večer z baziliky v Jablonném v Podještědí lebku svaté Zdislavy....

Je vám přes čtyřicet? Soutěžíme o přírodní doplněk stravy MenoVit Balance
Je vám přes čtyřicet? Soutěžíme o přírodní doplněk stravy MenoVit Balance

Období po čtyřicítce přináší řadu změn, které mohou ovlivnit fyzickou i psychickou pohodu. Dopřejte si proto přírodní podporu v čase, kdy ji vaše...

  • Počet článků 437
  • Celková karma 17,72
  • Průměrná čtenost 901x
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.
Nastavte si velikost písma, podle vašich preferencí.