Innehållsförteckning:

Mandelbrot och Julia sätter på ESP32: 4 steg (med bilder)
Mandelbrot och Julia sätter på ESP32: 4 steg (med bilder)

Video: Mandelbrot och Julia sätter på ESP32: 4 steg (med bilder)

Video: Mandelbrot och Julia sätter på ESP32: 4 steg (med bilder)
Video: The Hardest Trip - Mandelbrot Fractal Zoom 2024, Juli
Anonim
Image
Image
Mandelbrot och Julia Sets på ESP32
Mandelbrot och Julia Sets på ESP32
Mandelbrot och Julia Sets på ESP32
Mandelbrot och Julia Sets på ESP32

Du känner säkert fraktaler, varav den mest kända är Mandelbrot -uppsättningen.

Här är ett program att spela med på ESP32. Jag valde ESP32 eftersom jag tror att det kommer att göra beräkningarna snabbare än en vanlig Arduino (högre klockfrekvens: 240 MHz): ungefär en sekund till en och en halv för beräkning och visning.

Koden visas på en 480 x 320 TFT pekskärm. Den beräknar Mandelbrot och Julia -inställningarna för flera parametervärden och låter dig zooma in på intressanta områden för att se fraktalaspekten (det vill säga närvaron av samma strukturer vid varje skalaändring). Zoomnivån är begränsad på grund av den begränsade noggrannheten i beräkningarna, men ett halvt dussin zoomningar kan göras innan bilden försämras.

Gör dig redo att utforska den magiska världen av fraktaler …

Steg 1: Vad är Mandelbrot och Julia Sets?

Vad är Mandelbrot och Julia Sets?
Vad är Mandelbrot och Julia Sets?
Vad är Mandelbrot och Julia Sets?
Vad är Mandelbrot och Julia Sets?
Vad är Mandelbrot och Julia Sets?
Vad är Mandelbrot och Julia Sets?

Mandelbrot-uppsättningen är uppkallad efter Benoit Mandelbrot (1924-2010), en fransk och amerikansk matematiker som gjorde pionjärarbete i fraktal geometri, initierad i slutet av 1800-talet av bland andra Peano, Sierpinski och Julia.

Vad är fraktala föremål?

Naturens oegentligheter, som kan verka kaotiska, till exempel havets kustlinje, molnens form, ett träd, är faktiskt uttryck för en mycket komplex geometri i förändrad skala. I detta sammanhang ersätter begreppet fraktionell dimension den vanliga euklidiska dimensionen (som alltid är ett heltal)!

Ett fraktalt objekt är sådant att varje del av det är identiskt med helheten (detta kallas självlikhet): dess struktur är invariant genom skalförändringar.

Termen "fraktal" är en neologism skapad av Benoît Mandelbrot 1974 från det latinska rotfraktuset, vilket betyder "trasig", "oregelbunden". Det är både ett substantiv och ett adjektiv. Många naturfenomen - till exempel konturerna av kustlinjerna eller utseendet på Romanesco -kål (se bild) - har ungefärliga fraktalformer.

Benoît Mandelbrot hade en lite atypisk karriär: efter att ha undervisat vid universitetet i Lille (Frankrike) tog han en position på IBM där han snabbt blev IBM -stipendiat, vilket gav honom en stor frihet för sina vetenskapliga studier. I början av 1980 -talet, efter att han lämnat IBM, blev han professor vid Harvard, men bosatte sig permanent på Yale.

Hans arbete under 1960 -talet och början av 1970 -talet ledde till att han publicerade en berömd artikel med titeln "Fractal Objects" där han visade att dessa objekt, som av en stor del av det matematiska samhället betraktades som rena kuriosa, hittades överallt i naturen. Han gav många exempel inom en mängd olika områden som fysik, hydrologi, ekonomi, meteorologi, geografi, geologi, metallurgi….

Vad är Mandelbrot -setet?

Till att börja med, låt oss säga att det är en fin ritning som genereras av ett program. Och det här programmet är ganska enkelt. Det finns många datorgenererade ritningar och många datorprogram för att generera dem. Så vad är så speciellt med den här? För det första är Mandelbrot -uppsättningen en delmängd av planen, en samling poäng. Den innehåller områden men också släta kurvor, trådar, punkter från vilka flera grenar kommer och annat. För det andra: det är verkligen fascinerande och har en mycket intressant historia.

I början av 1900-talet utvecklade franska matematikerna Pierre Fatou och Gaston Julia en underdomän för matematik som kallas holomorf dynamik. De var intresserade av särskilda funktioner, som agerar på siffror, med några av de enklaste formlerna som finns tillgängliga. Siffrorna i fråga är komplexa tal, kvantiteter representerade av två koordinater (precis som punkterna i ett plan) som kallas verkliga och inbillade delar. De uppfanns på 1500 -talet av matematiker för att hjälpa till att hitta rötterna till polynom och ekvationslösning men har hittat breda och djupa tillämpningar inom matematik och fysik. Vi kan lägga till 2 komplexa tal, multiplicera eller dela dem och göra många andra saker. Fatou och Julia studerade egenskaperna hos vissa dynamiska system där ett komplext tal varierar enligt en enkel regel som upprepas om och om igen: inget behov av komplicerade matematik här (så du kan glömma den första bilden …). De avslöjade rikedomen i dessa system, definierade de uppsättningar som nu kallas Julias uppsättningar och studerade deras självlikhet, därför fraktal aspekt … men ordet fanns inte vid den tiden eftersom det först uppfanns mycket senare, av … Benoît Mandelbrot!

Efter grundarnas arbete föll denna domän i glömska. När datorerna kom hjälpte de till att utforska många matematiska fenomen som krävde intensiv beräkning, inklusive domänen som öppnades av Julia och Fatou. Så när Benoît Mandelbrot beslutade att använda IBM -datorer på 1980 -talet för att representera en viss matematisk uppsättning relaterad till holomorfisk dynamik, fick han en mycket attraktiv och mycket spännande teckning (första bilden från föregående avsnitt).

Vad representerar Mandelbrot -uppsättningen? I grund och botten finns det ett underliggande dynamiskt system associerat till varje punkt i bilden. Punktens koordinater fungerar som en justerbar parameter. Olika punkter motsvarar olika uppsättningar av Julia och beroende på deras beteende kan vi bestämma oss för att färga punkten på ett visst sätt. Mandelbrot -uppsättningen är den uppsättning parametrar för vilka systemet har en viss egenskap.

Hur beräknar man Mandelbrot och Julia -uppsättningar?

Vi måste gå in lite mer detaljerat på hur vi beräknar dessa uppsättningar. Mandelbrot- och Julia -uppsättningarna beräknas genom upprepad iteration av en enkel formel, i vårt fall z^n+c. z är ett komplext tal som representerar koordinaterna för en punkt på displayen. är en heltalsexponent, så z^n är lika med z multiplicerat med sig själv n gånger, och c är en konstant.

För Mandelbrot -uppsättningen, för alla punkter i visningsområdet, initierar vi z till 0. Konstanten c tas lika med värdet på koordinaterna för den övervägda punkten och formeln itereras.

Här är regeln: en punkt är en del av uppsättningen om den upprepade tillämpningen av denna formel inte avviker (dvs inte leder till beräkningar mot stora antal). Det kan matematiskt visas att om resultatet av formeln överstiger 2 (i modul eftersom vi talar om komplexa tal) kommer iterationen att avvika. Så för att snabbt få vackra färger stoppar vi iterationen när resultatmodulen överstiger 2 och färgen motsvarar antalet just den iterationen. Om antalet iterationer blir för stort (så om punkten är en del av Mandelbrot -uppsättningen) stannar vi efter en given tröskel och associerar den svarta färgen till denna punkt.

Julia -uppsättningen beräknas på ett liknande sätt men beräkningarna initieras inte med 0 utan vid värdet av koordinaterna för den övervägda punkten och konstanten c väljs av användaren och förblir densamma för hela bilden.

Det är det, jag hoppas att det är klart … Dessa förklaringar hjälper till att bättre förstå resten av bruksanvisningen.

Steg 2: Vad behöver du?

Vad behöver du?
Vad behöver du?
Vad behöver du?
Vad behöver du?
Vad behöver du?
Vad behöver du?
Vad behöver du?
Vad behöver du?

Materialräkning:

  • 1 ESP32 -kort
  • 1 TFT -display med pekskärm och penna
  • 1 brödbräda och trådar

Det är allt. Total kostnad under 10 USD.

Espressifs ESP32 är en dubbelkärnig mikrokontroller som körs på 240 MHz, vilket gör den till en bra kandidat för snabb och komplex repetitiv beräkning. Den har WiFi- och Bluetooth -kapacitet som jag inte använder i det här projektet.

Instruktionssatsen är 32 bitar stor. Beräkning med 16 och 32 bitars variabler är mycket snabbt vilket möjliggör exakta beräkningar, vilket är grundläggande för zoomning. I den här applikationen, för en 320 x 240 -skärm, är en bild ungefär gjord av 75 000 pixlar, var och en beräknas med hjälp av en iterativ process som kan köras upp till 100 gånger. Detta kan leda till 7, 500, 000 enhetsberäkningar, som var och en är en exponentiering, dvs flera multiplikationer …

Så beräkningshastighet är avgörande här, men noggrannhet är grundläggande. Ju mer du zoomar, desto mindre blir storleken på den del av uppsättningen som ska visas. Det betyder att var och en av bildens 320 x 240 pixlar representerar ett tal som ligger mycket nära sina grannar. När zoomen ökar ökar denna närhet.

Men fraktalbilder har den egenskapen att de förblir oförändrade genom skalning. Så små detaljer dyker upp överallt och för någon skalningsfaktor. Huvudformen på Mandelbrot -setet, som visas på displayen på bilden ovan, kan hittas någon annanstans i en mycket mindre version och visas om du zoomar tillräckligt nära (se på videon). Men om koordinatskillnaden mellan två grannpixlar är för liten för att ESP32 ska kunna fånga sin skillnad i beteende, på grund av bristande noggrannhet, kan fraktaleffekten inte visas …

För att få bra precision använder koden flottörer, som kodas i 32 bitar av ESP32. Detta möjliggör upp till 6 eller 7 zoomnivåer. Användning av dubbel precision (64 bitar) skulle ha ökat detta zoomdjup, på bekostnad av långsammare beräkningar, alltså längre tider mellan 2 bilder.

För att göra det dubbel precision, ändra bara alla förekomster av "float" till "double" i koden och kör koden. Jag har nyligen gjort en version för en större skärm (HVGA 480 x 320 pixlar): 16 bitars float tar 3 sekunder att visa bilden, och dubbel tar mellan 10 och 20 sekunder (3 till 6 gånger längre) men stöder mer än 15 zoomnivåer. Den tredje bilden i detta kapitel visar zoomnivån 14 längst till höger i Mandelbrot-uppsättningen.

Så här ansluter du skärmen:

Jag använde en SPI -skärm och parametrarna ställs in i filen User_Setup.h (i biblioteksmappen TFT_eSPI):

  • Driver: avmarkera rätt drivrutin för din bildskärm. Min var #define RPI_ILI9486_DRIVER
  • Pin -nummer: gå till avsnittet ESP32 i filen och välj

    • #define TFT_MISO 19
    • #define TFT_MOSI 23
    • #define TFT_SCLK 18
    • #define TFT_CS 15 // Chip select control pin
    • #define TFT_DC 2 // Datakommando kontrollnål
    • #define TFT_RST 4 // Återställ stift (kan ansluta till RST -stift)
    • #define TOUCH_CS 22 // Chip select pin (T_CS) på pekskärmen
  • Teckensnitt: du behöver inte ändra dem
  • Andra alternativ: Jag valde följande

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

Alla andra rader i filen kommenteras.

Kalibrera skärmens beröringskapacitet

Om valet av en skärmdel eller en knapp inte är korrekt eller till och med helt fel, kör beröringskalibreringsskissen från TFT_eSPI -biblioteket och kopiera / klistra in i koden den matris som den tillhandahåller (var noga med att använda rätt värde för visningsorientering, 1 eller 3 för liggande).

Steg 3: ESP32 -program

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

Koden visas på en 320 x 240 TFT pekskärm och använder TFT_eSPI -biblioteket. Den beräknar Mandelbrot och Julia -uppsättningar för flera exponentvärden och låter dig zooma in på intressanta områden för att se fraktalaspekten (dvs. närvaron av samma strukturer vid varje skalaändring).

Den bifogade koden är en version för 480 x 320 skärmar. I den här versionen kan du ändra skärmens storlek (bredd och höjd i pixlar). TFT_eSPI -biblioteket definierar anslutningarna i en installationsfil (bifogad) som måste placeras i bibliotekets katalog.

Koden börjar med att visa bruksanvisningen (se bild och video)

Det mesta av skärmen är reserverat för visning av bilder, peksknapparna finns på höger sida av skärmen:

  • R: utför en "reset", dvs. e. visar bilden till sin maximala skala,
  • U: "ångra" låter dig gå tillbaka till föregående steg (om det zoomade området inte är intressant kan du välja en annan del av bilden för att zooma in),
  • M eller J: låter dig växla från Mandelbrots uppsättning till Julias uppsättning och vice versa.

Etiketterna på vissa tangenter ändras beroende på sammanhanget: de visar den funktion som kommer att utföras om den trycks ned. Så om du för närvarande visar Mandelbrot -uppsättningen, visar M/J -tangenten J eftersom om du trycker på den kommer du att visa Julias uppsättning (och vice versa).

Detsamma gäller valet av färgpalett. Vi börjar med den gröna paletten. Nyckeln föreslår nästa palett (den blå). Paletterna är: rött, grönt, blått, grått, palett 1, palett 2 och tillbaka till rött. De två sista är mångfärgade pallettester som ger mer kontrast, så att du bättre kan se vissa detaljer.

Nyckeln med ett tal låter dig välja exponenten n, i en loop från 2 till 7 (och tillbaka till 2). I samma anda visar det 3 om du för närvarande är vid 2 …

Slutligen, när Julia -uppsättningen visas, är det nödvändigt att välja värdet för konstanten c: C -tangenten låter dig göra detta tack vare en väljare (se andra bilden). Värdet på denna konstant visas med uppsättningen.

Genom att klicka på bilden zoomas runt den valda punkten. En liten cirkel visas vid den berörda punkten och en rektangel markerar uppsättningens zoomade zon.

Den tredje bilden visar att datortiderna ligger mellan 0,8 och 1,2 sekunder för 320 x 240 pixlar, vilket gör det bekvämt att zooma och visa. Den når 3 sekunder för 480 x 320 pixlar, men ger mer information.

Steg 4: Några bilder förklarade …

Några bilder förklarade …
Några bilder förklarade …
Några bilder förklarade …
Några bilder förklarade …
Några bilder förklarade …
Några bilder förklarade …

Den största bilden är den välkända Mandelbrot -uppsättningen. De komplexa talen som används i denna bild sträcker sig från -2,1 till +0,7 i abscissa och -1,2 till 1,2 i ordinat. Om du zoomar in på den vänstra delen av den här första bilden, är chansen stor att du äntligen får den andra, som visar en mindre version av den ursprungliga uppsättningen som finns längst till vänster på uppsättningen. För båda dessa bilder är exponenten ('n') lika med 2: det är det värde som normalt används för att visa Mandelbrot -uppsättningar.

Om du ändrar detta värde till 3 (klicka bara på tangenten 3) får du den tredje bilden. En uppenbar skillnad är symmetrifaktorn: n = 2 ger en axiell symmetri (dvs. uppsättningen är symmetrisk mot medianens horisontella axel), men med n = 3 blir bilden invariant genom rotation på 120 ° (en tredjedel av 360 °, rotation symmetri faktor 3). Och den behåller sina fraktala egenskaper, som du kan verifiera genom att zooma på kanterna på den svarta formen.

Den fjärde bilden är en Julia -uppsättning som erhållits efter att ha valt ett koefficientvärde lika med 0,414 i abscissa och 0,09 i ordinat. Den röda paletten väljs, vilket kan ses av den gröna knappen till höger (grön, nästa färg som ska väljas). Den femte bilden visar samma typ av Julia -uppsättning, som en högre imaginär del av konstanten (0,358).

Jag hoppas att du kommer att tycka om att spela med det här programmet och att du kommer att kunna visa fina fraktalbilder. Tveka inte att utforska Mandelbrot och Julia -uppsättningarna och lek med paletterna: de hjälper till att identifiera vissa detaljer som kanske inte syns med de enkla svartvita. Du kanske till och med upptäcker några fraktala landskap som ingen någonsin har sett före dig …

_

Vill du upptäcka fler fraktalbilder? Klicka bara här eller utforska fraktalkonst eller till och med ascii fraktal. Kanske kan den här instruerbara få dig att vilja skapa så fantastiska bilder …

Gjord med Math Contest
Gjord med Math Contest
Gjord med Math Contest
Gjord med Math Contest

Andra pris i tävlingen Made with Math

Rekommenderad: