Sisällysluettelo:

Mandelbrot ja Julia asettavat ESP32: 4 vaihetta (kuvilla)
Mandelbrot ja Julia asettavat ESP32: 4 vaihetta (kuvilla)

Video: Mandelbrot ja Julia asettavat ESP32: 4 vaihetta (kuvilla)

Video: Mandelbrot ja Julia asettavat ESP32: 4 vaihetta (kuvilla)
Video: Quadratic Julia Sets of the Real Numbers (Fractal) 2024, Heinäkuu
Anonim
Image
Image
Mandelbrot ja Julia asettavat ESP32: n
Mandelbrot ja Julia asettavat ESP32: n
Mandelbrot ja Julia asettavat ESP32: n
Mandelbrot ja Julia asettavat ESP32: n

Tiedät varmasti fraktaaleja, joista tunnetuin on Mandelbrot -sarja.

Tässä on ohjelma, jolla voi pelata ESP32: lla. Valitsin ESP32: n, koska luulen, että se suorittaa laskelmat nopeammin kuin tavallinen Arduino (korkeampi kellotaajuus: 240 MHz): noin sekunnista toiseen ja puoleen laskentaa ja näyttöä varten.

Koodi näkyy 480 x 320 TFT -kosketusnäytöllä. Se laskee Mandelbrot- ja Julia -joukot useille parametriarvoille ja mahdollistaa lähentämisen kiinnostaville alueille, jotta näet fraktaalisen näkökulman (eli samojen rakenteiden esiintymisen jokaisessa asteikon muutoksessa). Zoomaustaso on rajallinen laskelmien tarkkuuden vuoksi, mutta puoli tusinaa zoomausta voidaan tehdä ennen kuin kuva huononee.

Valmistaudu tutkimaan fraktaalien maagista maailmaa…

Vaihe 1: Mitä Mandelbrot- ja Julia -sarjat ovat?

Mitä ovat Mandelbrot- ja Julia -sarjat?
Mitä ovat Mandelbrot- ja Julia -sarjat?
Mitä ovat Mandelbrot- ja Julia -sarjat?
Mitä ovat Mandelbrot- ja Julia -sarjat?
Mitä Mandelbrot ja Julia ovat?
Mitä Mandelbrot ja Julia ovat?

Mandelbrot-sarja on nimetty Benoit Mandelbrotin (1924-2010), ranskalaisen ja amerikkalaisen matemaatikon mukaan, joka teki pioneeritöitä fraktaaligeometriassa ja jonka aloitti 1800-luvun lopussa mm. Peano, Sierpinski ja Julia.

Mitä ovat fraktaaliesineet?

Luonnon epäsäännöllisyydet, jotka saattavat vaikuttaa kaoottisilta, kuten rantaviiva, pilvien muoto, puu, ovat itse asiassa hyvin monimutkaisen geometrian ilmentymä muuttuvassa mittakaavassa. Tässä yhteydessä murto -ulottuvuuden käsite korvaa tavanomaisen euklidisen ulottuvuuden (joka on aina kokonaisluku)!

Fraktaaliobjekti on sellainen, että mikä tahansa sen osa on identtinen kokonaisuuden kanssa (tätä kutsutaan itse-samankaltaisuudeksi): sen rakenne on muuttumaton mittakaavan muutoksen vuoksi.

Termi "fraktaali" on neologismi, jonka Benoît Mandelbrot loi vuonna 1974 latinalaisesta juurijuurista, joka tarkoittaa "rikki", "epäsäännöllinen". Se on sekä substantiivi että adjektiivi. Monilla luonnonilmiöillä - kuten rantaviivojen ääriviivoilla tai romanesco -kaalin ulkonäöllä (katso kuva) - on likimääräisiä fraktaalimuotoja.

Benoît Mandelbrotilla oli hieman epätyypillinen ura: opettamisen jälkeen Lillen yliopistossa (Ranska) hän otti tehtävän IBM: ssä, josta tuli nopeasti IBM -jäsen, mikä antoi hänelle suuren vapauden tieteellisiin opintoihinsa. 1980 -luvun alussa, kun hän lähti IBM: stä, hänestä tuli Harvardin professori, mutta hän asettui pysyvästi Yalessa.

Hänen työnsä 1960 -luvulla ja 1970 -luvun alussa johti hänet julkaisemaan kuuluisan artikkelin nimeltä "Fraktaaliesineet", jossa hän osoitti, että nämä esineet, joita suuri osa matemaattisesta yhteisöstä pitää pelkkinä uteliaisuuksina, löytyivät kaikkialta luonnosta. Hän antoi paljon esimerkkejä monilla eri aloilla, kuten fysiikassa, hydrologiassa, rahoituksessa, meteorologiassa, maantieteessä, geologiassa, metallurgiassa….

Mikä on Mandelbrot -sarja?

Sanotaan aluksi, että se on mukava piirustus, jonka ohjelma on luonut. Ja tämä ohjelma on melko yksinkertainen: on olemassa monia tietokoneella luotuja piirustuksia ja monia tietokoneohjelmistoja niiden luomiseksi. Joten mikä tässä on niin erikoista? Ensinnäkin Mandelbrot -joukko on suunnitelman osajoukko, pisteiden kokoelma. Se sisältää alueita, mutta myös sileitä kaaria, filamentteja, pisteitä, joista useita oksia tulee, ja muita asioita. Toiseksi: se on todella kiehtovaa ja sillä on erittäin mielenkiintoinen historia.

1900-luvun alussa ranskalaiset matemaatikot Pierre Fatou ja Gaston Julia kehittivät matematiikan alialueen, jota kutsutaan holomorfiseksi dynamiikaksi. He olivat kiinnostuneita tietyistä toiminnoista, jotka toimivat numeroiden perusteella käyttämällä joitain yksinkertaisimpia käytettävissä olevia kaavoja. Kyseiset numerot ovat kompleksilukuja, suuret, joita edustavat kaksi koordinaattia (aivan kuten tason pisteitä), joita kutsutaan todellisiksi ja kuvitteellisiksi osiksi. Matemaatikot keksivät ne 1500 -luvulla auttamaan polynomien juurien ja yhtälöiden ratkaisun löytämisessä, mutta ovat löytäneet laajoja ja syviä sovelluksia matematiikassa ja fysiikassa. Fatou ja Julia tutkivat tiettyjen dynaamisten järjestelmien ominaisuuksia, joissa kompleksiluku vaihtelee yksinkertaisen säännön mukaisesti, joka toistetaan yhä uudelleen: (joten voit unohtaa ensimmäisen kuvan …). He paljastivat näiden järjestelmien rikkauden, määrittivät sarjat, joita nyt kutsutaan Julian sarjoiksi, ja tutkivat niiden samankaltaisuutta, siis fraktaalista näkökulmaa … mutta sanaa ei ollut olemassa tuolloin, koska se keksittiin vasta paljon myöhemmin,… Benoît Mandelbrot!

Perustajien työn jälkeen tämä alue jäi unohduksiin. Kun tietokoneet saapuivat, ne auttoivat tutkimaan monia matemaattisia ilmiöitä, jotka vaativat intensiivistä tietojenkäsittelyä, mukaan lukien Julian ja Fatoun avaama verkkotunnus., hän sai erittäin houkuttelevan ja erittäin mielenkiintoisen piirustuksen (ensimmäinen kuva edellisestä osasta).

Mitä Mandelbrot -sarja edustaa? Pohjimmiltaan jokaiseen kuvan pisteeseen liittyy taustalla oleva dynaaminen järjestelmä. Pisteen koordinaatit toimivat säädettävänä parametrina. Eri pisteet vastaavat eri Julian sarjoja, ja niiden käyttäytymisestä riippuen voimme päättää värittää pisteen tietyllä tavalla. Mandelbrot -joukko on joukko parametreja, joille järjestelmällä on tietty ominaisuus.

Kuinka laskea Mandelbrot- ja Julia -joukot?

Meidän on perehdyttävä hieman tarkemmin näiden joukkojen laskemiseen. Mandelbrot- ja Julia -joukot lasketaan toistamalla yksinkertainen kaava, meidän tapauksessamme z^n+c. z on kompleksiluku, joka edustaa näytön pisteen koordinaatteja. on kokonaisluku eksponentti, joten z^n on yhtä kuin z kerrottuna itsellään n kertaa ja c on vakio.

Mandelbrot -joukon kaikkien näyttöalueen pisteiden osalta alustetaan z arvoksi 0. Vakio c lasketaan yhtä suureksi kuin tarkasteltavan pisteen koordinaatit ja kaava toistetaan.

Tässä on sääntö: piste on osa joukkoa, jos tämän kaavan toistuva käyttö ei poiketa toisistaan (eli ei johda laskelmiin suuria lukuja kohti). Voidaan matemaattisesti osoittaa, että jos kaavan tulos ylittää 2 (moduulissa, koska puhumme kompleksiluvuista), iteraatio eroaa. Joten saadaksemme nopeasti kauniita värejä, pysäytämme iteroinnin, kun tuloksen moduuli ylittää 2 ja väri vastaa kyseisen iteroinnin määrää. Jos iterointien määrä tulee liian suureksi (jos piste on osa Mandelbrot -joukkoa), pysähdymme tietyn kynnyksen jälkeen ja liitämme mustan värin tähän pisteeseen.

Julia -joukko lasketaan samalla tavalla, mutta laskelmia ei alusteta nollasta, vaan tarkasteltavan pisteen koordinaattien arvosta ja käyttäjä valitsee vakion c ja pysyy samana koko kuvan osalta.

Siinä kaikki, toivottavasti asia on selvä… Nämä selitykset auttavat ymmärtämään paremmin muita käyttöohjeita.

Vaihe 2: Mitä tarvitset?

Mitä tarvitset?
Mitä tarvitset?
Mitä tarvitset?
Mitä tarvitset?
Mitä tarvitset?
Mitä tarvitset?
Mitä tarvitset?
Mitä tarvitset?

Materiaaliluettelo:

  • 1 ESP32 -kortti
  • 1 TFT -näyttö kosketusnäytöllä ja kynällä
  • 1 leipälauta ja johdot

Se siitä. Kokonaiskustannukset alle 10 USD.

Espressifin ESP32 on kahden ytimen mikrokontrolleri, joka toimii taajuudella 240 MHz, mikä tekee siitä hyvän ehdokkaan nopeaan ja monimutkaiseen toistuvaan tietojenkäsittelyyn. Siinä on WiFi- ja Bluetooth -ominaisuuksia, joita en käytä tässä projektissa.

Ohjesarja on kooltaan 32 bittiä. 16- ja 32 -bittisten muuttujien tietojenkäsittely on erittäin nopeaa, mikä mahdollistaa tarkat laskelmat, mikä on olennaista zoomaustarkoituksessa. Tässä sovelluksessa 320 x 240 näytön kuva koostuu noin 75 000 pikselistä, joista jokainen lasketaan iteratiivisella prosessilla, joka voi kestää jopa 100 kertaa. Tämä voi johtaa 7 500 000 yksikkölaskelmaan, joista jokainen on eksponentia, eli useita kertoja …

Joten laskentanopeus on tässä välttämätöntä, mutta tarkkuus on perustavaa laatua. Mitä enemmän zoomaat, sitä pienempi näytettävän sarjan osa on. Tämä tarkoittaa, että jokainen kuvan 320 x 240 pikseliä edustaa numeroa, joka on hyvin lähellä sen naapureita. Zoomin kasvaessa tämä läheisyys kasvaa.

Mutta fraktaalikuvilla on tämä ominaisuus, että ne pysyvät muuttumattomina skaalaamalla. Pienet yksityiskohdat näkyvät siis kaikkialla ja kaikissa skaalaustekijöissä. Yllä olevan kuvan näytössä näkyvä Mandelbrot -sarjan päämuoto löytyy jostain muualta paljon pienemmässä versiossa, ja se näytetään, jos zoomaat tarpeeksi lähelle (katso video). Mutta jos kahden naapuripikselin välinen koordinaattiero on liian pieni, jotta ESP32 voi havaita niiden käyttäytymiseron epätäsmällisyyden vuoksi, fraktaalivaikutusta ei voida näyttää …

Hyvän tarkkuuden saavuttamiseksi koodi käyttää kellukkeita, jotka ESP32 on koodannut 32 bittiin. Tämä mahdollistaa jopa 6 tai 7 zoomaustasoa. Kaksinkertaisen tarkkuuden (64 bittiä) käyttäminen olisi lisännyt tätä zoomaussyvyyttä hitaampien laskelmien kustannuksella, mikä pidentää kahden kuvan välistä aikaa.

Jotta se olisi kaksinkertainen tarkkuus, vaihda vain kaikki "float" -tapahtumat koodiksi "double" ja suorita koodi. Tein äskettäin version suuremmalle näytölle (HVGA 480 x 320 pikseliä): 16 bitin kellukkeet vievät 3 sekuntia kuvan näyttämiseen ja kaksinkertaiset 10-20 sekuntia (3-6 kertaa pidempään), mutta tukevat yli 15 zoomaustasoa. Tämän luvun kolmannessa kuvassa näkyy zoomaustaso 14 Mandelbrot-sarjan oikeassa reunassa.

Näytön liittäminen:

Käytin SPI -näyttöä ja parametrit asetetaan User_Setup.h -tiedostoon (TFT_eSPI -kirjastokansioon):

  • Ohjain: poista näytön ohjaimen komento. Minun oli #define RPI_ILI9486_DRIVER
  • Pin -numerot: siirry tiedoston ESP32 -osioon ja valitse

    • #define TFT_MISO 19
    • #define TFT_MOSI 23
    • #define TFT_SCLK 18
    • #define TFT_CS 15 // Sirunvalintanappi
    • #define TFT_DC 2 // Tietokomentojen ohjaustappi
    • #define TFT_RST 4 // Nollaa nasta (voi muodostaa yhteyden RST -nastaan)
    • #define TOUCH_CS 22 // Kosketusnäytön sirunvalintanasta (T_CS)
  • Fontit: niitä ei tarvitse muuttaa
  • Muut vaihtoehdot: Valitsin seuraavan

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

Kaikki muut tiedoston rivit kommentoidaan.

Kalibroi näytön kosketuskapasiteetti

Jos näyttöosan tai painikkeen valinta ei ole tarkka tai jopa täysin väärä, suorita kosketuskalibrointiluonnos TFT_eSPI -kirjastosta ja kopioi / liitä sen antama taulukko koodiin (muista käyttää oikeaa näytön suuntaa, 1 tai 3 vaakasuunnassa).

Vaihe 3: ESP32 -ohjelma

ESP32 -ohjelma
ESP32 -ohjelma
ESP32 -ohjelma
ESP32 -ohjelma
ESP32 -ohjelma
ESP32 -ohjelma

Koodi näkyy 320 x 240 TFT -kosketusnäytöllä ja käyttää TFT_eSPI -kirjastoa. Se laskee Mandelbrot- ja Julia -joukot useille eksponentti -arvoille ja mahdollistaa lähentämisen kiinnostaviin alueisiin, jotta näet fraktaalipinnan (eli samojen rakenteiden läsnäolon jokaisessa asteikon muutoksessa).

Liitteenä oleva koodi on versio 480 x 320 -näytölle. Tässä versiossa voit muuttaa näytön kokoa (leveys ja korkeus pikseleinä). TFT_eSPI -kirjasto määrittää yhteydet asennustiedostossa (liitteenä), joka on tallennettava kirjaston hakemistoon.

Koodi alkaa näyttämällä käyttöohjeet (katso kuva ja video)

Suurin osa näytöstä on varattu kuvien näyttämiseen, kosketuspainikkeet ovat käytettävissä näytön oikeassa reunassa:

  • R: suorittaa "nollaus", ts. e. näyttää kuvan suurimmalla skaalalla,
  • U: "Kumoa" antaa sinun palata edelliseen vaiheeseen (jos zoomattu alue ei ole mielenkiintoinen, voit valita toisen kuvan osan lähentääksesi),
  • M tai J: voit vaihtaa Mandelbrotin sarjasta Julian settiin ja päinvastoin.

Joidenkin näppäinten tarrat muuttuvat kontekstin mukaan: ne näyttävät toiminnon, joka suoritetaan painettaessa. Joten jos näytössä on tällä hetkellä Mandelbrot -sarja, M/J -näppäimessä näkyy J, koska jos painat sitä, näet Julian sarjan (ja päinvastoin).

Sama koskee väripaletin valintaa. Aloitamme vihreällä paletilla. Näppäin ehdottaa seuraavaa palettia (sininen). Paletit ovat: punainen, vihreä, sininen, harmaa, paletti 1, paletti 2 ja takaisin punaiseksi. Kaksi viimeistä ovat monivärisiä palettitestit, jotka tarjoavat enemmän kontrastia ja mahdollistavat joidenkin yksityiskohtien paremman näkemisen.

Numerolla varustetun näppäimen avulla voit valita eksponentin n silmukassa 2-7 (ja takaisin 2). Samassa hengessä se näyttää 3, jos olet tällä hetkellä 2…

Lopuksi, kun näytetään Julia -sarja, on valittava vakion c arvo: C -näppäimen avulla voit tehdä tämän valitsimen avulla (katso toinen kuva). Tämän vakion arvo näytetään sarjan kanssa.

Kuvan klikkaaminen zoomaa valitun pisteen ympärille. Kosketuspisteessä näkyy pieni ympyrä ja suorakulmio korostaa sarjan zoomattua aluetta.

Kolmas kuva osoittaa, että laskenta -ajat pysyvät välillä 0,8 - 1,2 sekuntia 320 x 240 pikselillä, mikä tekee zoomaamisesta ja näyttämisestä mukavaa. Se saavuttaa 3 sekuntia 480 x 320 pikselin tarkkuudella, mutta antaa lisätietoja.

Vaihe 4: Joitakin kuvia selitetään…

Joitakin kuvia selitetty…
Joitakin kuvia selitetty…
Joitakin kuvia selitetty…
Joitakin kuvia selitetty…
Joitakin kuvia selitetty…
Joitakin kuvia selitetty…

Suurin kuva on tunnettu Mandelbrot -sarja. Tässä kuvassa käytetyt kompleksiluvut vaihtelevat -2,1 -+0,7 abscissassa ja -1,2 -1,2 ordinaatissa. Jos zoomat tämän ensimmäisen kuvan vasenta osaa, saat todennäköisesti vihdoin toisen kuvan, joka näyttää pienemmän version alkuperäisestä sarjasta, joka löytyy sarjan vasemmasta kärjestä. Molemmissa kuvissa eksponentti ('n') on 2: tämä on arvo, jota normaalisti käytetään Mandelbrot -joukkojen näyttämiseen.

Jos muutat tämän arvon arvoksi 3 (napsauta vain näppäintä 3), saat kolmannen kuvan. Yksi ilmeinen ero on symmetriakerroin: n = 2 antaa aksiaalisen symmetrian (eli sarja on symmetrinen vaakasuoraa keskiakselia vasten), mutta kun n = 3, kuva muuttuu muuttumattomana kääntämällä 120 ° (kolmasosa 360 °, kierto symmetriakerroin 3). Ja se säilyttää fraktaaliominaisuutensa, jotka voit tarkistaa zoomaamalla mustan muodon reunoja.

Neljäs kuva on Julia -sarja, joka on saatu, kun kerroinarvo on valittu 0,414 abscisassa ja 0,09 ordinaatissa. Punainen paletti on valittu, kuten näkyy oikealla olevalla vihreällä näppäimellä (vihreä, seuraavaksi valittava väri). Viidennessä kuvassa näkyy samanlainen Julia -sarja, joka on vakion korkeampi kuvitteellinen osa (0,358).

Toivottavasti nautit pelaamisesta tällä ohjelmalla ja pystyt näyttämään hienoja fraktaalikuvia. Älä epäröi tutkia Mandelbrot- ja Julia -sarjoja ja leikkiä paletilla: ne auttavat tunnistamaan joitain yksityiskohtia, jotka eivät ehkä näy yksinkertaisissa yksivärisissä. Saatat jopa löytää joitain fraktaalimaisemia, joita kukaan ei ole koskaan ennen nähnyt…

_

Haluatko löytää lisää fraktaalikuvia? Napsauta vain tätä tai tutustu fraktaalitaiteeseen tai jopa ascii -fraktaaliin. Ehkä tämä opettavainen saa sinut haluamaan luoda niin hienoja kuvia …

Valmistettu matematiikkakilpailulla
Valmistettu matematiikkakilpailulla
Valmistettu matematiikkakilpailulla
Valmistettu matematiikkakilpailulla

Made with Math -kilpailun toinen palkinto

Suositeltava: