Inhoudsopgave:

Mandelbrot en Julia stellen op ESP32 in: 4 stappen (met afbeeldingen)
Mandelbrot en Julia stellen op ESP32 in: 4 stappen (met afbeeldingen)

Video: Mandelbrot en Julia stellen op ESP32 in: 4 stappen (met afbeeldingen)

Video: Mandelbrot en Julia stellen op ESP32 in: 4 stappen (met afbeeldingen)
Video: Hardest Mandelbrot Absolute Julia Zoom 2024, November
Anonim
Image
Image
Mandelbrot en Julia zetten op ESP32
Mandelbrot en Julia zetten op ESP32
Mandelbrot en Julia stellen op ESP32 in
Mandelbrot en Julia stellen op ESP32 in

Je kent zeker fractals, waarvan de meest bekende de Mandelbrot-set is.

Hier is een programma om mee te spelen op ESP32. Ik koos voor de ESP32 omdat ik denk dat hij de berekeningen sneller zal doen dan een standaard Arduino (hogere klokfrequentie: 240 MHz): ongeveer een seconde tot anderhalve seconde voor berekening en weergave.

De code wordt weergegeven op een 480 x 320 TFT-touchscreen. Het berekent Mandelbrot- en Julia-sets voor verschillende parameterwaarden en stelt u in staat in te zoomen op interessegebieden om het fractale aspect te zien (d.w.z. de aanwezigheid van dezelfde structuren bij elke schaalverandering). Het zoomniveau is beperkt vanwege de beperkte nauwkeurigheid van de berekeningen, maar een half dozijn zooms kunnen worden gemaakt voordat het beeld verslechtert.

Maak je klaar om de magische wereld van fractals te verkennen…

Stap 1: Wat zijn Mandelbrot- en Julia-sets?

Wat zijn Mandelbrot- en Julia-sets?
Wat zijn Mandelbrot- en Julia-sets?
Wat zijn Mandelbrot- en Julia-sets?
Wat zijn Mandelbrot- en Julia-sets?
Wat zijn Mandelbrot- en Julia-sets?
Wat zijn Mandelbrot- en Julia-sets?

De Mandelbrot-set is vernoemd naar Benoit Mandelbrot (1924-2010), een Franse en Amerikaanse wiskundige die baanbrekend werk verrichtte in de fractale meetkunde, aan het eind van de 19e eeuw geïnitieerd door onder meer Peano, Sierpinski en Julia.

Wat zijn fractale objecten?

De onregelmatigheden van de natuur, die misschien chaotisch lijken, zoals de lijn van de zeekust, de vorm van wolken, een boom, zijn in feite de uitdrukking van een zeer complexe geometrie op veranderende schaal. In deze context vervangt het begrip fractionele dimensie dat van de gebruikelijke Euclidische dimensie (die altijd een geheel getal is)!

Een fractaal object is zodanig dat elk deel ervan identiek is aan het geheel (dit wordt zelfgelijkenis genoemd): de structuur ervan is invariant door schaalverandering.

De term "fractal" is een neologisme gecreëerd door Benoît Mandelbrot in 1974 van de Latijnse wortel fractus, wat "gebroken", "onregelmatig" betekent. Het is zowel een zelfstandig naamwoord als een bijvoeglijk naamwoord. Veel natuurlijke fenomenen - zoals de omtrek van de kustlijnen of het uiterlijk van Romanesco-kool (zie afbeelding) - hebben bij benadering fractale vormen.

Benoît Mandelbrot had een ietwat atypische carrière: na lesgeven aan de Universiteit van Lille (Frankrijk), nam hij een functie bij IBM waar hij al snel een IBM Fellow werd, wat hem een grote vrijheid gaf voor zijn wetenschappelijke studies. In het begin van de jaren tachtig, nadat hij IBM had verlaten, werd hij professor aan Harvard, maar vestigde zich definitief aan Yale.

Zijn werk in de jaren zestig en het begin van de jaren zeventig bracht hem ertoe een beroemd artikel met de titel "Fractal Objects" te publiceren, waarin hij aantoonde dat deze objecten, die door een groot deel van de wiskundige gemeenschap als louter curiositeiten werden beschouwd, overal in de natuur werden gevonden. Hij gaf veel voorbeelden in een breed scala van gebieden zoals natuurkunde, hydrologie, financiën, meteorologie, geografie, geologie, metallurgie….

Wat is de Mandelbrot-set?

Laten we om te beginnen zeggen dat het een mooie tekening is die door een programma is gegenereerd. En dit programma is vrij eenvoudig. Er bestaan veel computer-gegenereerde tekeningen en veel computersoftware om ze te genereren. Dus wat is er zo speciaal aan deze? Ten eerste is de Mandelbrot-verzameling een deelverzameling van het plan, een verzameling punten. Het bevat gebieden maar ook vloeiende rondingen, filamenten, punten waaruit meerdere takken voortkomen en andere dingen. Ten tweede: het is echt fascinerend en heeft een zeer interessante geschiedenis.

Aan het begin van de 20e eeuw ontwikkelden de Franse wiskundigen Pierre Fatou en Gaston Julia een subdomein van wiskunde dat holomorfe dynamiek wordt genoemd. Ze waren geïnteresseerd in bepaalde functies, handelend op getallen, met behulp van enkele van de eenvoudigste beschikbare formules. De getallen in kwestie zijn complexe getallen, grootheden die worden weergegeven door twee coördinaten (net als de punten van een vlak) die reële en imaginaire delen worden genoemd. Ze werden in de 16e eeuw uitgevonden door wiskundigen om de wortels van veeltermen en de oplossing van vergelijkingen te helpen vinden, maar hebben brede en diepe toepassingen gevonden in de wiskunde en de natuurwetenschappen. We kunnen 2 complexe getallen optellen, vermenigvuldigen of delen, en nog veel meer. Fatou en Julia bestudeerden de eigenschappen van bepaalde dynamische systemen waar een complex getal varieert volgens een eenvoudige regel die steeds opnieuw wordt herhaald: hier is geen ingewikkelde wiskunde nodig (je kunt dus de eerste afbeelding vergeten…). Ze onthulden de rijkdom van deze systemen, definieerden de verzamelingen die nu Julia's verzamelingen worden genoemd, en bestudeerden hun zelfgelijkenis, dus het fractale aspect… maar het woord bestond toen nog niet omdat het pas veel later werd uitgevonden, door… Benoît Mandelbrot!

Na het werk van de oprichters raakte dit domein in de vergetelheid. Toen de computers arriveerden, hielpen ze bij het verkennen van een groot aantal wiskundige fenomenen waarvoor intensief computergebruik nodig was, waaronder het domein dat werd geopend door Julia en Fatou. Toen Benoît Mandelbrot in de jaren tachtig besloot IBM-computers te gebruiken om een bepaalde wiskundige set met betrekking tot holomorfe dynamiek weer te geven, bemachtigde hij een zeer aantrekkelijke en zeer intrigerende tekening (eerste foto van de vorige sectie).

Wat stelt de Mandelbrot-verzameling voor? In principe is er een onderliggend dynamisch systeem dat aan elk punt van het beeld is gekoppeld. De coördinaten van het punt fungeren als een instelbare parameter. Verschillende punten komen overeen met verschillende sets van Julia en afhankelijk van hun gedrag kunnen we besluiten om het punt op een bepaalde manier te kleuren. De Mandelbrot-set is de set parameters waarvoor het systeem een bepaalde eigenschap heeft.

Hoe Mandelbrot en Julia sets te berekenen?

We moeten wat meer in detail treden over het berekenen van deze sets. Mandelbrot- en Juliaverzamelingen worden berekend door herhaalde iteratie van een eenvoudige formule, in ons geval z^n+c. z is een complex getal dat de coördinaten van een punt op het scherm voorstelt. is een integer exponent, dus z^n is gelijk aan z vermenigvuldigd met zichzelf n keer, en c is een constante.

Voor de Mandelbrot-verzameling, voor alle punten in het weergavegebied, initialiseren we z op 0. De constante c wordt gelijk gesteld aan de waarde van de coördinaten van het beschouwde punt en de formule wordt herhaald.

Hier is de regel: een punt maakt deel uit van de verzameling als de herhaalde toepassing van deze formule niet divergeert (d.w.z. niet leidt tot berekeningen naar grote getallen). Het kan wiskundig worden aangetoond dat als het resultaat van de formule groter is dan 2 (in modulus omdat we het over complexe getallen hebben), de iteratie zal divergeren. Dus om snel mooie kleuren te krijgen, stoppen we de iteratie wanneer de modulus van het resultaat groter is dan 2 en de kleur overeenkomt met het nummer van die specifieke iteratie. Als het aantal iteraties te groot wordt (dus als het punt deel uitmaakt van de Mandelbrot-verzameling) stoppen we na een bepaalde drempel en associëren we de zwarte kleur met dit punt.

De Julia-set wordt op een vergelijkbare manier berekend, maar de berekeningen worden niet geïnitialiseerd op 0 maar op de waarde van de coördinaten van het beschouwde punt en de constante c wordt gekozen door de gebruiker en blijft hetzelfde voor de hele afbeelding.

Dat is het, ik hoop dat het duidelijk is… Deze uitleg helpt om de rest van de gebruiksaanwijzing beter te begrijpen.

Stap 2: Wat heb je nodig?

Wat heb je nodig?
Wat heb je nodig?
Wat heb je nodig?
Wat heb je nodig?
Wat heb je nodig?
Wat heb je nodig?
Wat heb je nodig?
Wat heb je nodig?

Stuk materiaal:

  • 1 ESP32-kaart
  • 1 TFT-display met touchscreen en stylus
  • 1 breadboard en draden

Dat is het. Totale kosten onder de 10 USD.

Espressif's ESP32 is een dual-core microcontroller die draait op 240 MHz, waardoor het een goede kandidaat is voor snel en complex repetitief computergebruik. Het heeft WiFi- en Bluetooth-capaciteiten die ik in dit project niet gebruik.

De instructieset is 32 bits groot. Computing met 16- en 32-bits variabelen is erg snel, wat nauwkeurige berekeningen mogelijk maakt, wat van fundamenteel belang is voor zoomdoeleinden. In deze toepassing wordt voor een scherm van 320 x 240 een afbeelding ruwweg gemaakt van 75.000 pixels, die elk worden berekend met behulp van een iteratief proces dat tot 100 keer kan lopen. Dit kan leiden tot 7.500.000 unitaire berekeningen, die elk een machtsverheffing zijn, d.w.z. meerdere vermenigvuldigingen…

Dus rekensnelheid is hier essentieel, maar nauwkeurigheid is van fundamenteel belang. Hoe meer u zoomt, hoe kleiner het deel van de set dat moet worden weergegeven. Dit betekent dat elk van de 320 x 240 pixels van de afbeelding een getal vertegenwoordigt dat heel dicht bij zijn buren ligt. Naarmate de zoom toeneemt, neemt deze nabijheid toe.

Maar fractal-afbeeldingen hebben de eigenschap dat ze onveranderd blijven door te schalen. Dus kleine details verschijnen overal en voor elke schaalfactor. De hoofdvorm van de Mandelbrot-set, zoals te zien op het display op de bovenstaande afbeelding, is ergens anders te vinden in een veel kleinere versie, en kan worden weergegeven als je dicht genoeg inzoomt (zie op de video). Maar als het coördinaatverschil tussen twee naburige pixels te klein is om de ESP32 in staat te stellen hun verschil in gedrag te vangen, vanwege een gebrek aan nauwkeurigheid, kan het fractale effect niet worden weergegeven…

Om een goede precisie te krijgen, gebruikt de code floats, die door de ESP32 in 32 bits worden gecodeerd. Dit maakt tot 6 of 7 zoomniveaus mogelijk. Het gebruik van dubbele precisie (64 bits) zou deze zoomdiepte hebben vergroot, ten koste van langzamere berekeningen, dus langere tijden tussen 2 afbeeldingen.

Om het dubbele precisie te maken, verandert u gewoon alle voorkomens van "float" in "double" in de code en voert u de code uit. Ik heb onlangs een versie gemaakt voor een groter scherm (HVGA 480 x 320 pixels): 16 bits floats nemen 3 seconden in beslag om het beeld weer te geven, en doubles duren tussen de 10 en 20 seconden (3 tot 6 keer langer) maar ondersteunen meer dan 15 zoomniveaus. De derde afbeelding in dit hoofdstuk toont het zoomniveau 14 in het meest rechtse deel van de Mandelbrot-set.

Hoe het beeldscherm aan te sluiten:

Ik heb een SPI-display gebruikt en de parameters zijn ingesteld in het User_Setup.h-bestand (in de TFT_eSPI-bibliotheekmap):

  • Stuurprogramma: verwijder de opmerking over het juiste stuurprogramma voor uw beeldscherm. De mijne was #define RPI_ILI9486_DRIVER
  • Pinnummers: ga naar het ESP32-gedeelte van het bestand en kies

    • #define TFT_MISO 19
    • #define TFT_MOSI 23
    • #define TFT_SCLK 18
    • #define TFT_CS 15 // Chipselectie-besturingspin
    • #define TFT_DC 2 // Data Command-besturingspin
    • #define TFT_RST 4 // Reset pin (kan verbinding maken met RST pin)
    • #define TOUCH_CS 22 // Chipselectiepen (T_CS) van aanraakscherm
  • Lettertypen: u hoeft ze niet te wijzigen
  • Andere opties: Ik heb het volgende geselecteerd:

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

Alle andere regels van het bestand worden uitgecommentarieerd.

Kalibreer de aanraakcapaciteit van het display

Als de selectie van een schermgedeelte of een knop niet nauwkeurig of zelfs helemaal verkeerd is, voert u de aanraakkalibratieschets uit de TFT_eSPI-bibliotheek uit en kopieert / plakt u in de code de array die het biedt (zorg ervoor dat u de juiste waarde gebruikt voor de weergaveoriëntatie, 1 of 3 voor liggend).

Stap 3: ESP32-programma

ESP32-programma
ESP32-programma
ESP32-programma
ESP32-programma
ESP32-programma
ESP32-programma

De code wordt weergegeven op een 320 x 240 TFT-touchscreen en maakt gebruik van de TFT_eSPI-bibliotheek. Het berekent Mandelbrot- en Julia-sets voor verschillende exponentwaarden en stelt u in staat in te zoomen op interessegebieden om het fractale aspect te zien (d.w.z. de aanwezigheid van dezelfde structuren bij elke schaalverandering).

De bijgevoegde code is een versie voor 480 x 320 display. In deze versie kunt u de grootte (breedte en hoogte in pixels) van het scherm wijzigen. De TFT_eSPI-bibliotheek definieert de verbindingen in een setup-bestand (bijgevoegd) dat in de directory van de bibliotheek moet worden geplaatst.

De code begint met het weergeven van de gebruiksaanwijzing (zie afbeelding en video)

Het grootste deel van het scherm is gereserveerd voor het weergeven van afbeeldingen, aan de rechterkant van het scherm zijn aanraakknoppen beschikbaar:

  • R: voert een "reset" uit, i. e. geeft het beeld op de maximale schaal weer,
  • U: "ongedaan maken" stelt u in staat terug te gaan naar de vorige stap (als het ingezoomde gebied niet interessant is, kunt u een ander deel van de afbeelding kiezen om in te zoomen),
  • M of J: hiermee kun je overschakelen van de set van Mandelbrot naar de set van Julia en vice versa.

De labels van sommige toetsen veranderen afhankelijk van de context: ze geven de functie weer die wordt uitgevoerd als op wordt gedrukt. Dus als u momenteel de Mandelbrot-set weergeeft, geeft de M/J-toets J weer, want als u erop drukt, wordt de set van Julia weergegeven (en vice versa).

Hetzelfde geldt voor de keuze van het kleurenpalet. We beginnen met het groene palet. De toets stelt het volgende palet voor (de blauwe). De paletten zijn: rood, groen, blauw, grijs, palette 1, palette 2 en terug naar rood. De laatste twee zijn veelkleurige palettesten die meer contrast bieden, waardoor sommige details beter kunnen worden gezien.

Met de sleutel met een getal kun je de exponent n kiezen, in een lus van 2 naar 7 (en terug naar 2). In dezelfde geest wordt 3 weergegeven als u momenteel op 2 bent …

Ten slotte is het bij het weergeven van de Julia-verzameling noodzakelijk om de waarde van de constante c te kiezen: met de C-toets kunt u dit doen, dankzij een selector (zie tweede afbeelding). De waarde van deze constante wordt weergegeven met de set.

Door op de afbeelding te klikken zoomt u rond het geselecteerde punt. Een kleine cirkel wordt weergegeven op het aangeraakte punt en een rechthoek markeert de ingezoomde zone van de set.

De 3e foto laat zien dat de rekentijd tussen de 0,8 en 1,2 seconden blijft voor 320 x 240 pixels, wat het zoomen en weergeven comfortabel maakt. Het bereikt 3 seconden voor 480 x 320 pixels, maar biedt meer details.

Stap 4: Enkele foto's uitgelegd…

Enkele foto's uitgelegd…
Enkele foto's uitgelegd…
Enkele foto's uitgelegd…
Enkele foto's uitgelegd…
Enkele foto's uitgelegd…
Enkele foto's uitgelegd…

De grootste foto is de bekende Mandelbrot-set. De complexe getallen die in deze afbeelding worden gebruikt, variëren van -2,1 tot +0,7 op de abscis en -1,2 tot 1,2 op de ordinaat. Als je inzoomt op het uiterst linkse deel van deze eerste afbeelding, is de kans groot dat je uiteindelijk de tweede krijgt, die een kleinere versie van de originele set in de meest linkse punt van de set weergeeft. Voor beide afbeeldingen is de exponent ('n') gelijk aan 2: dat is de waarde die normaal wordt gebruikt om Mandelbrot-sets weer te geven.

Als u deze waarde verandert in 3 (klik gewoon op de toets met de tekst 3), dan krijgt u de derde afbeelding. Een duidelijk verschil is de symmetriefactor: n=2 geeft een axiale symmetrie (dwz de verzameling is symmetrisch ten opzichte van de horizontale middenas), maar met n=3 wordt het beeld invariant bij een rotatie van 120° (een derde van 360°, rotatie symmetriefactor van 3). En het behoudt zijn fractale eigenschappen, die je kunt verifiëren door in te zoomen op de randen van de zwarte vorm.

De 4e afbeelding is een Julia-verzameling die is verkregen na het selecteren van een coëfficiëntwaarde die gelijk is aan 0,414 op de abscis en 0,09 op de ordinaat. Het rode palet is gekozen, zoals te zien is aan de groene toets aan de rechterkant (groen, de volgende kleur die moet worden gekozen). De vijfde afbeelding toont dezelfde soort Julia-verzameling, die een hoger denkbeeldig deel van de constante heeft (0,358).

Ik hoop dat je veel plezier zult beleven aan het spelen met dit programma en dat je in staat zult zijn om mooie fractal-afbeeldingen weer te geven. Aarzel niet om de sets van Mandelbrot en Julia te verkennen en met de paletten te spelen: ze helpen bij het identificeren van enkele details die misschien niet zichtbaar zijn met de eenvoudige monochrome. Misschien ontdek je zelfs fractale landschappen die nog nooit iemand voor jou heeft gezien…

_

Wil je meer fractal-afbeeldingen ontdekken? Klik hier of verken fractal kunst of zelfs ascii fractal. Misschien wil deze instructable je zulke geweldige afbeeldingen maken …

Gemaakt met wiskundewedstrijd
Gemaakt met wiskundewedstrijd
Gemaakt met wiskundewedstrijd
Gemaakt met wiskundewedstrijd

Tweede prijs in de Made with Math-wedstrijd

Aanbevolen: