Kazalo:

Mandelbrot in Julia sta na ESP32: 4 koraki (s slikami)
Mandelbrot in Julia sta na ESP32: 4 koraki (s slikami)

Video: Mandelbrot in Julia sta na ESP32: 4 koraki (s slikami)

Video: Mandelbrot in Julia sta na ESP32: 4 koraki (s slikami)
Video: T-Watch. Draw Mandelbrot or Julia fractals with an ESP32 and LVGL + TFT_eSPI 2024, Julij
Anonim
Image
Image
Mandelbrot in Julia na ESP32
Mandelbrot in Julia na ESP32
Mandelbrot in Julia na ESP32
Mandelbrot in Julia na ESP32

Zagotovo poznate fraktale, med katerimi je najbolj znan Mandelbrotov niz.

Tu je program za igranje na ESP32. Za ESP32 sem se odločil, ker mislim, da bo izračune opravil hitreje kot standardni Arduino (višja frekvenca ure: 240 MHz): približno sekundo do sekundo in pol za izračun in prikaz.

Koda se prikaže na zaslonu na dotik 480 x 320 TFT. Izračuna Mandelbrotova in Julijina niza za več vrednosti parametrov in vam omogoča, da povečate območja, ki vas zanimajo, da vidite fraktalni vidik (tj. Prisotnost istih struktur pri vsaki spremembi lestvice). Raven povečave je zaradi omejene natančnosti izračunov omejena, vendar je mogoče pred degradacijo slike narediti pol ducata povečave.

Pripravite se na raziskovanje čarobnega sveta fraktalov …

1. korak: Kaj sta kompleta Mandelbrot in Julia?

Kaj sta kompleta Mandelbrot in Julia?
Kaj sta kompleta Mandelbrot in Julia?
Kaj sta kompleta Mandelbrot in Julia?
Kaj sta kompleta Mandelbrot in Julia?
Kaj sta kompleta Mandelbrot in Julia?
Kaj sta kompleta Mandelbrot in Julia?

Komplet Mandelbrot je dobil ime po Benoitu Mandelbrotu (1924-2010), francoskem in ameriškem matematiku, ki je opravil pionirsko delo v fraktalni geometriji, ki so ga konec 19. stoletja začeli med drugim Peano, Sierpinski in Julia.

Kaj so fraktalni predmeti?

Naravne nepravilnosti, ki se morda zdijo kaotične, kot so linija morske obale, oblika oblakov, drevo, so v resnici izraz zelo zapletene geometrije v spreminjajočem se obsegu. V tem kontekstu pojem delne dimenzije nadomešča pojem običajne evklidske dimenzije (ki je vedno celo število)!

Fraktalni objekt je tak, da je kateri koli njegov del enak celoti (temu pravimo samopodoba): njegova struktura je nespremenljiva s spremembo lestvice.

Izraz "fraktal" je neologizem, ki ga je leta 1974 ustvaril Benoît Mandelbrot iz latinskega korena fractus, kar pomeni "zlomljen", "nepravilen". Je tako samostalnik kot pridevnik. Številni naravni pojavi - na primer obris obale ali videz zelja Romanesco (glej sliko) - imajo približne fraktalne oblike.

Benoît Mandelbrot je imel nekoliko netipično kariero: po poučevanju na Univerzi v Lillu (Francija) se je zaposlil v IBM -u, kjer je hitro postal sodelavec IBM -a, kar mu je dalo veliko svobode pri znanstvenem študiju. V začetku osemdesetih let prejšnjega stoletja, potem ko je zapustil IBM, je postal profesor na Harvardu, vendar se je za stalno naselil na Yaleu.

Njegovo delo v šestdesetih in zgodnjih sedemdesetih letih prejšnjega stoletja ga je pripeljalo do objave slavnega članka z naslovom "Fraktalni predmeti", v katerem je pokazal, da te predmete, ki jih velik del matematične skupnosti šteje za zgolj zanimivost, najdemo povsod v naravi. Navedel je veliko primerov na najrazličnejših področjih, kot so fizika, hidrologija, finance, meteorologija, geografija, geologija, metalurgija …

Kaj je komplet Mandelbrot?

Za začetek recimo, da gre za lepo risbo, ki jo ustvari program. Ta program je precej preprost. Obstaja veliko računalniško ustvarjenih risb in veliko računalniške programske opreme za njihovo ustvarjanje. Kaj je torej pri tem posebnega? Prvič, niz Mandelbrot je podmnožica načrta, zbirka točk. Vsebuje območja, pa tudi gladke krivulje, nitke, točke, iz katerih izvira več vej, in drugo. Drugič: res je fascinantno in ima zelo zanimivo zgodovino.

V začetku 20. stoletja sta francoska matematika Pierre Fatou in Gaston Julia razvila podpodročje matematike, imenovano holomorfna dinamika. Zanimale so jih posebne funkcije, ki delujejo na številkah, pri čemer so uporabile nekatere najpreprostejše razpoložljive formule. Zadevne številke so kompleksne številke, količine, predstavljene z dvema koordinatama (tako kot točke ravnine), imenovane resnični in namišljeni deli. Matematiki so jih v 16. stoletju izumili za pomoč pri iskanju korenin polinoma in rešitev enačb, vendar so našli široko in globoko uporabo v matematiki in fizikalnih vedah. Dodamo lahko 2 kompleksni številki, ju pomnožimo ali delimo in počnemo še marsikaj drugega. Fatu in Julia sta preučevala lastnosti nekaterih dinamičnih sistemov, kjer se kompleksno število spreminja glede na preprosto pravilo, ki se vedno znova ponavlja: tukaj ni potrebe po zapleteni matematiki (torej lahko pozabite prvo sliko …). Razkrili so bogastvo teh sistemov, opredelili množice, ki se zdaj imenujejo Julijini nizi, in preučevali njihovo samopodobo, torej fraktalni vidik … toda beseda takrat ni obstajala, ker jo je izumil šele pozneje … Benoît Mandelbrot!

Po delu ustanoviteljev je ta domena padla v pozabo. Ko so prišli računalniki, so pomagali raziskati veliko matematičnih pojavov, ki zahtevajo intenzivno računalništvo, vključno z domeno, ki sta jo odprla Julia in Fatou., dobil je zelo privlačno in zelo zanimivo risbo (prva slika prejšnjega razdelka).

Kaj predstavlja komplet Mandelbrot? V bistvu je za vsako točko slike povezan osnovni dinamični sistem. Koordinate točke delujejo kot nastavljiv parameter. Različne točke ustrezajo različnim sklopom Julije in glede na njihovo vedenje se lahko odločimo, da bomo na poseben način obarvali točko. Mandelbrotov niz je niz parametrov, za katere ima sistem določeno lastnost.

Kako izračunati množice Mandelbrota in Julije?

Poglobiti se moramo v podrobnosti, kako izračunati te množice. Mandelbrotova in Julijina niza sta izračunana s ponavljajočo se iteracijo preproste formule, v našem primeru z^n+c. z je kompleksno število, ki predstavlja koordinate točke na zaslonu. je celoštevni eksponent, zato je z^n enako z, pomnoženo s samim seboj n krat, c pa je konstanta.

Za Mandelbrotov niz za vse točke v območju prikaza inicializiramo z na 0. Konstanta c je enaka vrednosti koordinat obravnavane točke in formula je ponovljena.

Tukaj velja pravilo: točka je del niza, če se ponavljajoča se uporaba te formule ne razhaja (torej ne vodi do izračunov proti velikim številkam). Matematično je mogoče dokazati, da se bo ponovitev, če rezultat formule preseže 2 (po modulu, ker govorimo o kompleksnih številkah), razhajala. Če želimo hitro pridobiti lepe barve, ponovimo postopek, ko modul rezultata preseže 2 in barva ustreza številu te ponovitve. Če število ponovitev postane preveliko (če je točka torej del Mandelbrotovega niza), se ustavimo po danem pragu in tej točki povežemo črno barvo.

Nabor Julia se izračuna na podoben način, vendar se izračuni ne inicializirajo pri 0, temveč pri vrednosti koordinat obravnavane točke in konstanta c izbere uporabnik in ostane enaka za celotno sliko.

To je to, upam, da je jasno … Te razlage pomagajo bolje razumeti preostala navodila za uporabo.

2. korak: Kaj potrebujete?

Kaj potrebujete?
Kaj potrebujete?
Kaj potrebujete?
Kaj potrebujete?
Kaj potrebujete?
Kaj potrebujete?
Kaj potrebujete?
Kaj potrebujete?

Predmet materiala:

  • 1 plošča ESP32
  • 1 zaslon TFT z zaslonom na dotik in pisalom
  • 1 plošča in žice

To je to. Skupni stroški pod 10 USD.

Espressifov ESP32 je dvojedrni mikrokrmilnik, ki deluje na 240 MHz, zaradi česar je dober kandidat za hitro in zapleteno ponavljajoče se računalništvo. Ima zmogljivosti WiFi in Bluetooth, ki jih v tem projektu ne uporabljam.

Komplet navodil je velikosti 32 bitov. Računanje s 16 in 32 bitnimi spremenljivkami je zelo hitro, kar omogoča natančne izračune, kar je bistveno za namen povečave. V tej aplikaciji je za zaslon velikosti 320 x 240 slika približno 75.000 slikovnih pik, od katerih se vsaka izračuna z uporabo ponavljajočega se postopka, ki se lahko izvaja do 100 -krat. To lahko privede do 7 500 000 enotnih izračunov, od katerih je vsak eksponenciacija, to je več množenj …

Hitrost izračuna je torej bistvenega pomena, natančnost pa je bistvena. Bolj ko povečate, manjša je velikost dela nabora za prikaz. To pomeni, da vsaka od 320 x 240 slikovnih pik slike predstavlja številko, ki je zelo blizu njenim sosedom. Ko se povečava poveča, se ta bližina poveča.

Toda fraktalne podobe imajo to lastnost, da s spreminjanjem velikosti ostanejo nespremenjene. Tako se majhne podrobnosti pojavljajo povsod in za kateri koli faktor povečanja. Glavno obliko kompleta Mandelbrot, kot je prikazano na zaslonu na zgornji sliki, lahko najdete drugje v precej manjši različici in jo prikažete, če jo približate dovolj blizu (glejte na videoposnetku). Če pa je koordinatna razlika med dvema sosednjima piksloma premajhna, da bi lahko ESP32 ujel njuno razliko v vedenju, zaradi pomanjkanja natančnosti ni mogoče prikazati fraktalnega učinka …

Za dobro natančnost koda uporablja floate, ki jih ESP32 kodira v 32 bitih. To omogoča do 6 ali 7 stopenj povečave. Z dvojno natančnostjo (64 bitov) bi povečali to globino povečave na ceno počasnejših izračunov in s tem podaljšali čas med dvema slikama.

Za dvojno natančnost preprosto spremenite vse pojavitve "float" v "double" v kodi in zaženite kodo. Pred kratkim sem naredil različico za večji zaslon (HVGA 480 x 320 slikovnih pik): 16 -bitni plavajoči elementi za prikaz slike potrebujejo 3 sekunde, dvojni pa med 10 in 20 sekundami (3 do 6 -krat daljši), vendar podpirajo več kot 15 stopenj povečave. Tretja slika v tem poglavju prikazuje stopnjo povečave 14 v skrajnem desnem delu kompleta Mandelbrot.

Kako priključiti zaslon:

Uporabil sem zaslon SPI, parametri pa so nastavljeni v datoteki User_Setup.h (v mapi knjižnice TFT_eSPI):

  • Gonilnik: odkomentirajte ustrezen gonilnik za vaš zaslon. Moj je bil #define RPI_ILI9486_DRIVER
  • Številke pin: pojdite v razdelek datoteke ESP32 in izberite

    • #define TFT_MISO 19
    • #define TFT_MOSI 23
    • #define TFT_SCLK 18
    • #define TFT_CS 15 // Krmilni zatič za izbiro čipa
    • #define TFT_DC 2 // Kontrolni zatič podatkovnega ukaza
    • #define TFT_RST 4 // Ponastavi pin (lahko se poveže z RST pin)
    • #define TOUCH_CS 22 // Zatič za izbiro čipa (T_CS) zaslona na dotik
  • Pisave: ni jih treba spreminjati
  • Druge možnosti: Izbral sem naslednje

    • #define SPI_FREQUENCY 20000000
    • #define SPI_READ_FREQUENCY 20000000
    • #define SPI_TOUCH_FREQUENCY 2500000

Vse druge vrstice datoteke so komentirane.

Umerite zmogljivost zaslona na dotik

Če izbira zaslona ali gumba ni natančna ali celo popolnoma napačna, zaženite skico za umerjanje na dotik iz knjižnice TFT_eSPI in kopirajte / prilepite v kodo matrike, ki jo ponuja (za orientacijo zaslona uporabite pravilno vrednost, 1 ali 3 za pokrajino).

3. korak: program ESP32

Program ESP32
Program ESP32
Program ESP32
Program ESP32
Program ESP32
Program ESP32

Koda se prikaže na zaslonu na dotik TFT velikosti 320 x 240 in uporablja knjižnico TFT_eSPI. Izračuna Mandelbrotova in Julijina niza za več eksponentnih vrednosti in vam omogoča, da povečate zanimiva področja, da vidite fraktalni vidik (tj. Prisotnost istih struktur pri vsaki spremembi lestvice).

Priložena koda je različica za zaslon 480 x 320. V tej različici lahko spremenite velikost (širino in višino v pikslih) zaslona. Knjižnica TFT_eSPI definira povezave v namestitveni datoteki (priloženo), ki jih je treba shraniti v imenik knjižnice.

Koda se začne s prikazom navodil za uporabo (glejte sliko in video)

Večina zaslona je rezervirana za prikaz slik, gumbi na dotik so na voljo na desni strani zaslona:

  • R: izvede "ponastavitev", tj. e. prikaže sliko v največjem možnem merilu,
  • U: "razveljavi" vam omogoča, da se vrnete na prejšnji korak (če povečana regija ni zanimiva, lahko izberete drug del slike za povečavo),
  • M ali J: omogoča preklop iz Mandelbrotovega niza v Julijin in obratno.

Oznake nekaterih tipk se spreminjajo glede na kontekst: prikazujejo funkcijo, ki bo izvedena, če jo pritisnete. Torej, če trenutno prikazujete Mandelbrotov niz, tipka M/J prikaže J, saj če pritisnete, se prikaže Julijin niz (in obratno).

Enako velja za izbiro barvne palete. Začnemo z zeleno paleto. Ključ predlaga naslednjo paleto (modro). Palete so: rdeča, zelena, modra, siva, paleta 1, paleta 2 in nazaj v rdečo barvo. Zadnja dva sta večbarvni paleti, ki zagotavljata večji kontrast in omogočata boljši pregled nekaterih podrobnosti.

Tipka s številko vam omogoča, da izberete eksponent n v zanki od 2 do 7 (in nazaj do 2). V istem duhu prikaže 3, če ste trenutno pri 2 …

Nazadnje, pri prikazu niza Julia je treba izbrati vrednost konstante c: tipka C vam to omogoča, zahvaljujoč izbirniku (glejte drugo sliko). Vrednost te konstante je prikazana z nastavljenim.

S klikom na sliko se poveča izbrana točka. Na dotaknjeni točki je prikazan majhen krog, pravokotnik pa označuje povečano območje niza.

Tretja slika prikazuje, da računalniški časi ostanejo med 0,8 in 1,2 sekunde za 320 x 240 slikovnih pik, zaradi česar je udobno za povečavo in prikaz. Za 480 x 320 slikovnih pik doseže 3 sekunde, vendar ponuja več podrobnosti.

4. korak: Razložene nekatere slike…

Nekaj razloženih slik …
Nekaj razloženih slik …
Nekaj razloženih slik …
Nekaj razloženih slik …
Nekaj razloženih slik …
Nekaj razloženih slik …

Največja slika je dobro znani Mandelbrotov komplet. Kompleksna števila, uporabljena na tej sliki, se gibljejo od -2,1 do +0,7 v abscisi in -1,2 do 1,2 v ordinati. Če povečate zelo levi del te prve slike, obstaja velika verjetnost, da boste končno dobili drugo, ki prikazuje manjšo različico prvotnega niza, ki je na skrajni levi konici niza. Za obe sliki je eksponent ('n') enak 2: to je vrednost, ki se običajno uporablja za prikaz Mandelbrotovih nizov.

Če to vrednost spremenite v 3 (samo kliknite na tipko 3), dobite tretjo sliko. Ena očitna razlika je faktor simetrije: n = 2 daje osno simetrijo (tj. Množica je simetrična glede na srednjo vodoravno os), vendar z n = 3 slika postane nespremenjena z vrtenjem za 120 ° (tretjina 360 °, rotacija faktor simetrije 3). Ohrani svoje fraktalne lastnosti, kar lahko preverite tako, da povečate robove črne oblike.

Četrta slika je Julijin niz, pridobljen po izbiri vrednosti koeficienta, ki je enak 0,414 v abscisi in 0,09 v ordinati. Izbrana je rdeča paleta, kar je razvidno iz zelene tipke na desni (zelena, ki je naslednja izbrana barva). Peta slika prikazuje isto vrsto Julije, ki je višji namišljeni del konstante (0,358).

Upam, da boste uživali v igranju s tem programom in da boste lahko prikazali lepe fraktalne slike. Ne oklevajte in raziščite komplete Mandelbrot in Julia ter se poigrajte s paletami: pomagata prepoznati nekatere podrobnosti, ki pri preprostih enobarvnih ne bodo vidne. Morda boste celo odkrili nekaj fraktalnih pokrajin, ki jih pred vami še nihče ni videl …

_

Želite odkriti več fraktalnih slik? Samo kliknite tukaj ali raziščite fraktalno umetnost ali celo ascii fraktal. Morda boste zaradi tega pouka želeli ustvariti tako odlične slike …

Narejeno z matematičnim tekmovanjem
Narejeno z matematičnim tekmovanjem
Narejeno z matematičnim tekmovanjem
Narejeno z matematičnim tekmovanjem

Druga nagrada na tekmovanju Made with Math

Priporočena: