Indholdsfortegnelse:

Mandelbrot og Julia sætter på ESP32: 4 trin (med billeder)
Mandelbrot og Julia sætter på ESP32: 4 trin (med billeder)

Video: Mandelbrot og Julia sætter på ESP32: 4 trin (med billeder)

Video: Mandelbrot og Julia sætter på ESP32: 4 trin (med billeder)
Video: Eye of the Universe - Mandelbrot Fractal Zoom (e1091) (4k 60fps) 2024, Juli
Anonim
Image
Image
Mandelbrot og Julia Sætter på ESP32
Mandelbrot og Julia Sætter på ESP32
Mandelbrot og Julia Sætter på ESP32
Mandelbrot og Julia Sætter på ESP32

Du kender helt sikkert fraktaler, hvoraf den mest berømte er Mandelbrot -sættet.

Her er et program at spille med på ESP32. Jeg valgte ESP32, fordi jeg tror, det vil gøre beregningerne hurtigere end en standard Arduino (højere clockfrekvens: 240 MHz): cirka et sekund til et halvt til beregning og visning.

Koden vises på en 480 x 320 TFT berøringsskærm. Det beregner Mandelbrot og Julia -sæt til flere parameterværdier og giver dig mulighed for at zoome ind på interesseområder for at se det fraktale aspekt (dvs. tilstedeværelsen af de samme strukturer ved hver skalaændring). Zoomniveauet er begrænset på grund af den begrænsede nøjagtighed i beregningerne, men der kan laves en halv snes zoomer, før billedet nedbrydes.

Gør dig klar til at udforske den magiske verden af fraktaler …

Trin 1: Hvad er Mandelbrot og Julia Sets?

Hvad er Mandelbrot og Julia Sets?
Hvad er Mandelbrot og Julia Sets?
Hvad er Mandelbrot og Julia Sets?
Hvad er Mandelbrot og Julia Sets?
Hvad er Mandelbrot og Julia Sets?
Hvad er Mandelbrot og Julia Sets?

Mandelbrot-sættet er opkaldt efter Benoit Mandelbrot (1924-2010), en fransk og amerikansk matematiker, der udførte pionærarbejde i fraktal geometri, initieret i slutningen af 1800-tallet af blandt andre Peano, Sierpinski og Julia.

Hvad er fraktale objekter?

Naturens uregelmæssigheder, som kan virke kaotiske, såsom havets kystlinje, skyernes form, et træ, er faktisk udtryk for en meget kompleks geometri i skiftende skala. I denne sammenhæng erstatter begrebet brøkdimension begrebet den sædvanlige euklidiske dimension (som altid er et helt tal)!

Et fraktalt objekt er sådan, at enhver del af det er identisk med helheden (dette kaldes selvlighed): dets struktur er invariant ved skalaforandringer.

Udtrykket "fraktal" er en neologisme skabt af Benoît Mandelbrot i 1974 fra det latinske rodfraktus, hvilket betyder "brudt", "uregelmæssigt". Det er både et substantiv og et adjektiv. Mange naturfænomener - såsom omridset af kysterne eller udseendet af Romanesco -kål (se billede) - har omtrentlige fraktale former.

Benoît Mandelbrots havde en lidt atypisk karriere: efter undervisning ved universitetet i Lille (Frankrig) tog han stilling hos IBM, hvor han hurtigt blev IBM -stipendiat, hvilket gav ham en stor frihed til sine videnskabelige studier. I begyndelsen af 1980'erne, efter at han forlod IBM, blev han professor ved Harvard, men bosatte sig permanent på Yale.

Hans arbejde i 1960'erne og begyndelsen af 1970'erne fik ham til at udgive en berømt artikel med titlen "Fractal Objects", hvor han viste, at disse objekter, der af en stor del af det matematiske samfund blev betragtet som blot nysgerrigheder, blev fundet overalt i naturen. Han gav mange eksempler på en lang række områder som fysik, hydrologi, finans, meteorologi, geografi, geologi, metallurgi….

Hvad er Mandelbrot -sættet?

Til at begynde med, lad os sige, at det er en flot tegning genereret af et program. Og dette program er ganske enkelt. Der findes mange computergenererede tegninger og mange computersoftware til at generere dem. Så hvad er så specielt ved denne? For det første er Mandelbrot -sættet en delmængde af planen, en samling punkter. Den indeholder områder, men også glatte kurver, filamenter, punkter, hvorfra flere grene stammer, og andre ting. For det andet: det er virkelig fascinerende og har en meget interessant historie.

I begyndelsen af det 20. århundrede udviklede de franske matematikere Pierre Fatou og Gaston Julia et underdomæne af matematik kaldet holomorfe dynamik. De var interesserede i bestemte funktioner, der handler på tal, ved hjælp af nogle af de enkleste formler, der findes. De pågældende tal er komplekse tal, størrelser repræsenteret af to koordinater (ligesom punkterne i et fly) kaldet virkelige og imaginære dele. De blev opfundet i det 16. århundrede af matematikere for at hjælpe med at finde rødderne til polynomer og løsningen af ligninger, men har fundet brede og dybe anvendelser inden for matematik og fysiske videnskaber. Vi kan tilføje 2 komplekse tal, multiplicere eller dividere dem og gøre mange andre ting. Fatou og Julia studerede egenskaberne ved visse dynamiske systemer, hvor et komplekst tal varierer efter en simpel regel, der gentages igen og igen: der er ikke behov for komplicerede matematik her (så du kan glemme det første billede …). De afslørede disse systemers rigdom, definerede de sæt, der nu kaldes Julias sæt, og studerede deres selvlighed, derfor fraktalt aspekt … men ordet fandtes ikke på det tidspunkt, fordi det først blev opfundet meget senere, af … Benoît Mandelbrot!

Efter grundlæggernes arbejde faldt dette domæne i glemmebogen. Da computerne ankom, hjalp de med at udforske en masse matematiske fænomener, der krævede intensiv computing, herunder domænet, der blev åbnet af Julia og Fatou. Så da Benoît Mandelbrot besluttede at bruge IBM -computere i 1980'erne til at repræsentere et bestemt matematisk sæt relateret til holomorfe dynamik, opnåede han en meget attraktiv og meget spændende tegning (første billede af det foregående afsnit).

Hvad repræsenterer Mandelbrot -sættet? Grundlæggende er der et underliggende dynamisk system tilknyttet hvert punkt i billedet. Punktets koordinater fungerer som en justerbar parameter. Forskellige punkter svarer til forskellige sæt Julia og afhængigt af deres adfærd kan vi beslutte at farve punktet på en bestemt måde. Mandelbrot -sættet er det sæt parametre, som systemet har en bestemt egenskab for.

Hvordan beregnes Mandelbrot og Julia sæt?

Vi skal gå lidt mere i detaljer om, hvordan man beregner disse sæt. Mandelbrot og Julia sæt beregnes ved gentagen iteration af en simpel formel, i vores tilfælde z^n+c. z er et komplekst tal, der repræsenterer koordinaterne for et punkt på displayet. er et heltalseksponent, så z^n er lig med z ganget med sig selv n gange, og c er en konstant.

For Mandelbrot -sættet initialiserer vi for alle punkter i visningsområdet z til 0. Konstanten c tages lig med værdien af koordinaterne for det betragtede punkt, og formlen gentages.

Her er reglen: et punkt er en del af sættet, hvis den gentagne anvendelse af denne formel ikke afviger (dvs. ikke fører til beregninger mod store tal). Det kan matematisk vises, at hvis resultatet af formlen overstiger 2 (i modul, da vi taler om komplekse tal), vil iterationen afvige. Så for hurtigt at opnå smukke farver stopper vi iterationen, når modulets resultat overstiger 2, og farven svarer til antallet af den pågældende iteration. Hvis antallet af iterationer bliver for stort (så hvis punktet er en del af Mandelbrot -sættet) stopper vi efter en given tærskel og forbinder den sorte farve med dette punkt.

Julia -sættet beregnes på en lignende måde, men beregningerne initialiseres ikke ved 0, men ved værdien af koordinaterne for det betragtede punkt, og konstanten c vælges af brugeren og forbliver den samme for hele billedet.

Det er det, jeg håber det er klart … Disse forklaringer hjælper med at forstå resten af brugsanvisningen bedre.

Trin 2: Hvad har du brug for?

Hvad har du brug for?
Hvad har du brug for?
Hvad har du brug for?
Hvad har du brug for?
Hvad har du brug for?
Hvad har du brug for?
Hvad har du brug for?
Hvad har du brug for?

Stykliste:

  • 1 ESP32 bord
  • 1 TFT -display med touchscreen og stylus
  • 1 brødbræt og ledninger

Det er det. Samlede omkostninger under 10 USD.

Espressifs ESP32 er en dual -core mikrokontroller, der kører ved 240 MHz, hvilket gør den til en god kandidat til hurtig og kompleks repetitiv computing. Det har WiFi- og Bluetooth -kapacitet, som jeg ikke bruger i dette projekt.

Instruktionssættet er 32 bit i størrelse. Computing med 16 og 32 bit variabler er meget hurtig, hvilket muliggør nøjagtige beregninger, hvilket er grundlæggende for at zoome. I denne applikation, for en 320 x 240 skærm, er et billede groft lavet af 75.000 pixels, som hver beregnes ved hjælp af en iterativ proces, der kan køre op til 100 gange. Dette kan føre til 7, 500, 000 enhedsberegninger, som hver især er en eksponentiering, dvs. flere multiplikationer …

Så beregningshastighed er afgørende her, men nøjagtighed er grundlæggende. Jo mere du zoomer, jo mindre er størrelsen på den del af sættet, der skal vises. Det betyder, at hver af de 320 x 240 pixels i billedet repræsenterer et tal, der er meget tæt på dets naboer. Når zoomen øges, øges denne nærhed.

Men fraktalbilleder har denne egenskab, at de forbliver uændrede ved skalering. Så små detaljer vises overalt og for enhver skaleringsfaktor. Hovedformen på Mandelbrot -sættet, som det ses på displayet på ovenstående billede, kan findes et andet sted i en meget mindre version og vises, hvis du zoomer tæt nok på (se på videoen). Men hvis koordinatforskellen mellem to nabopixel er for lille til, at ESP32 kan opfange deres adfærdsforskel på grund af manglende nøjagtighed, kan fraktaleffekten ikke vises …

For at få god præcision bruger koden floats, som er kodet i 32 bit af ESP32. Dette muliggør op til 6 eller 7 zoomniveauer. Brug af dobbelt præcision (64 bit) ville have øget denne zoomdybde på bekostning af langsommere beregninger og dermed længere tid mellem 2 billeder.

For at gøre det dobbelt præcision, skal du bare ændre alle forekomster af "float" til "double" i koden og køre koden. Jeg har for nylig lavet en version til en større skærm (HVGA 480 x 320 pixels): 16 bits floats tager 3 sekunder at vise billedet, og dobbelt tager mellem 10 og 20 sekunder (3 til 6 gange længere), men understøtter mere end 15 zoomniveauer. Det tredje billede i dette kapitel viser zoomniveau 14 i den højre del af Mandelbrot-sættet.

Sådan tilsluttes skærmen:

Jeg brugte et SPI -display, og parametrene er angivet i filen User_Setup.h (i biblioteksmappen TFT_eSPI):

  • Driver: fjern den korrekte driver til dit display. Min var #define RPI_ILI9486_DRIVER
  • Pin -numre: gå til ESP32 -sektionen af filen og vælg

    • #define TFT_MISO 19
    • #define TFT_MOSI 23
    • #define TFT_SCLK 18
    • #define TFT_CS 15 // Chip select kontrolnål
    • #define TFT_DC 2 // Datakommando kontrolnål
    • #define TFT_RST 4 // Nulstil pin (kan oprette forbindelse til RST -pin)
    • #define TOUCH_CS 22 // Chip select pin (T_CS) på berøringsskærmen
  • Skrifttyper: du behøver ikke ændre dem
  • Andre muligheder: Jeg valgte følgende

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

Alle de andre linjer i filen kommenteres.

Kalibrer displayets berøringskapacitet

Hvis valget af en skærmdel eller en knap ikke er nøjagtigt eller endda helt forkert, skal du køre berøringskalibreringsskitsen fra TFT_eSPI -biblioteket og kopiere / indsætte i koden den matrix, den giver (sørg for at bruge den korrekte værdi til visningsretning, 1 eller 3 for landskab).

Trin 3: ESP32 -program

ESP32 -program
ESP32 -program
ESP32 -program
ESP32 -program
ESP32 -program
ESP32 -program

Koden vises på en 320 x 240 TFT -berøringsskærm og bruger TFT_eSPI -biblioteket. Det beregner Mandelbrot og Julia -sæt for flere eksponentværdier og giver dig mulighed for at zoome ind på interesseområder for at se det fraktale aspekt (dvs. tilstedeværelsen af de samme strukturer ved hver skalaændring).

Den vedhæftede kode er en version til 480 x 320 skærme. I denne version kan du ændre skærmens størrelse (bredde og højde i pixels). TFT_eSPI -biblioteket definerer forbindelserne i en opsætningsfil (vedhæftet), som skal placeres i bibliotekets bibliotek.

Koden starter med at vise betjeningsvejledningen (se billede og video)

Det meste af skærmen er forbeholdt visning af billeder, berøringsknapper er tilgængelige i højre side af skærmen:

  • R: udfører en "nulstilling", dvs. e. viser billedet til sin maksimale skala,
  • U: "fortryd" giver dig mulighed for at gå tilbage til det forrige trin (hvis det zoome område ikke er interessant, kan du vælge en anden del af billedet for at zoome ind),
  • M eller J: giver dig mulighed for at skifte fra Mandelbrots sæt til Julias sæt og omvendt.

Etiketterne på nogle taster ændres i henhold til konteksten: de viser den funktion, der udføres, hvis der trykkes på den. Så hvis du i øjeblikket viser Mandelbrot -sættet, viser M/J -tasten J, da hvis du trykker på det, vises Julias sæt (og omvendt).

Det samme gælder valget af farvepaletten. Vi starter med den grønne palet. Nøglen foreslår den næste palet (den blå). Paletterne er: rød, grøn, blå, grå, palet 1, palet 2 og tilbage til rød. De to sidste er flerfarvede pallettest, der giver mere kontrast, så man bedre kan se nogle detaljer.

Nøglen med et tal giver dig mulighed for at vælge eksponenten n, i en loop fra 2 til 7 (og tilbage til 2). I samme ånd viser det 3, hvis du i øjeblikket er på 2 …

Endelig, når Julia -sættet vises, er det nødvendigt at vælge værdien af konstanten c: C -tasten giver dig mulighed for at gøre dette takket være en vælger (se andet billede). Værdien af denne konstant vises med sættet.

Ved at klikke på billedet zoomer det omkring det valgte punkt. Der vises en lille cirkel ved det berørte punkt, og et rektangel fremhæver den zoomede zone i sættet.

Det tredje billede viser, at computertiderne forbliver mellem 0,8 og 1,2 sekunder for 320 x 240 pixels, hvilket gør det behageligt at zoome og vise. Det når 3 sekunder for 480 x 320 pixels, men giver flere detaljer.

Trin 4: Nogle billeder forklaret …

Nogle billeder forklaret …
Nogle billeder forklaret …
Nogle billeder forklaret …
Nogle billeder forklaret …
Nogle billeder forklaret …
Nogle billeder forklaret …

Det største billede er det velkendte Mandelbrot -sæt. De komplekse tal, der bruges i dette billede, spænder fra -2,1 til +0,7 i abscissa og -1,2 til 1,2 i ordinat. Hvis du zoomer på den meget venstre del af dette første billede, er der stor sandsynlighed for, at du endelig får det andet, som viser en mindre version af det originale sæt, der findes i spidsen til venstre i sættet. For begge disse billeder er eksponenten ('n') lig med 2: det er den værdi, der normalt bruges til at vise Mandelbrot -sæt.

Hvis du ændrer denne værdi til 3 (klik bare på tasten 3), får du det tredje billede. En indlysende forskel er symmetrifaktoren: n = 2 giver en aksial symmetri (dvs. sættet er symmetrisk mod den mediane vandrette akse), men med n = 3 bliver billedet invariant ved rotation på 120 ° (en tredjedel af 360 °, rotation symmetri faktor 3). Og den bevarer sine fraktale egenskaber, som du kan kontrollere ved at zoome på kanterne af den sorte form.

Det fjerde billede er et Julia -sæt opnået efter valg af en koefficientværdi svarende til 0,414 i abscissa og 0,09 i ordinat. Den røde palet vælges, som det ses af den grønne tast til højre (grøn, den næste farve, der skal vælges). Det femte billede viser den samme slags Julia -sæt, som en højere imaginær del af konstanten (0,358).

Jeg håber, du vil nyde at lege med dette program, og at du vil kunne vise flotte fraktalbilleder. Tøv ikke med at udforske Mandelbrot og Julia sæt, og leg med paletterne: de hjælper med at identificere nogle detaljer, der muligvis ikke er synlige med de enkle monokrome. Du kan endda opdage nogle fraktale landskaber, som ingen nogensinde har set før dig …

_

Vil du opdage flere fraktale billeder? Bare klik her eller udforsk fraktalkunst eller endda ascii fraktal. Måske giver denne instruktive dig lyst til at skabe så flotte billeder …

Lavet med matematikkonkurrence
Lavet med matematikkonkurrence
Lavet med matematikkonkurrence
Lavet med matematikkonkurrence

Anden pris i konkurrencen Made with Math

Anbefalede: