Innholdsfortegnelse:

Mandelbrot og Julia setter på ESP32: 4 trinn (med bilder)
Mandelbrot og Julia setter på ESP32: 4 trinn (med bilder)

Video: Mandelbrot og Julia setter på ESP32: 4 trinn (med bilder)

Video: Mandelbrot og Julia setter på ESP32: 4 trinn (med bilder)
Video: Julia Set III Bounded Iterations 2024, Juli
Anonim
Image
Image
Mandelbrot og Julia Setter på ESP32
Mandelbrot og Julia Setter på ESP32
Mandelbrot og Julia Setter på ESP32
Mandelbrot og Julia Setter på ESP32

Du kjenner sikkert fraktaler, den mest kjente av dem er Mandelbrot -settet.

Her er et program å spille med på ESP32. Jeg valgte ESP32 fordi jeg tror det vil gjøre beregningene raskere enn en standard Arduino (høyere klokkefrekvens: 240 MHz): omtrent et sekund til et og et halvt for beregning og visning.

Koden vises på en 480 x 320 TFT berøringsskjerm. Den beregner Mandelbrot og Julia -settene for flere parameterverdier, og lar deg zoome inn på områder av interesse for å se fraktalaspektet (dvs. tilstedeværelsen av de samme strukturene ved hver skalaendring). Zoomnivået er begrenset på grunn av den begrensede nøyaktigheten til beregningene, men et halvt dusin zoomer kan gjøres før bildet forringes.

Gjør deg klar til å utforske den magiske verden av fraktaler …

Trinn 1: Hva er Mandelbrot og Julia Sets?

Hva er Mandelbrot og Julia Sets?
Hva er Mandelbrot og Julia Sets?
Hva er Mandelbrot og Julia Sets?
Hva er Mandelbrot og Julia Sets?
Hva er Mandelbrot og Julia Sets?
Hva er Mandelbrot og Julia Sets?

Mandelbrot-settet er oppkalt etter Benoit Mandelbrot (1924-2010), en fransk og amerikansk matematiker som utførte pionerarbeid innen fraktal geometri, initiert på slutten av 1800-tallet av blant andre Peano, Sierpinski og Julia.

Hva er fraktale objekter?

Naturens uregelmessigheter, som kan virke kaotiske, for eksempel havets kystlinje, skyens form, et tre, er faktisk uttrykk for en veldig kompleks geometri i endret skala. I denne sammenhengen erstatter forestillingen om brøkdimensjon begrepet om den vanlige euklidiske dimensjonen (som alltid er et helt tall)!

Et fraktalobjekt er slik at enhver del av det er identisk med helheten (dette kalles selvlikhet): strukturen er invariant ved skalaendring.

Begrepet "fraktal" er en neologisme opprettet av Benoît Mandelbrot i 1974 fra det latinske rotfraktuset, som betyr "ødelagt", "uregelmessig". Det er både et substantiv og et adjektiv. Mange naturfenomener - som omrisset av kystlinjene eller utseendet til romanskokål (se bildet) - har omtrentlige fraktalformer.

Benoît Mandelbrot hadde en litt atypisk karriere: etter å ha undervist ved universitetet i Lille (Frankrike), tok han stilling ved IBM hvor han raskt ble en IBM -stipendiat, noe som ga ham stor frihet for sine vitenskapelige studier. På begynnelsen av 1980 -tallet, etter at han forlot IBM, ble han professor ved Harvard, men bosatte seg permanent på Yale.

Hans arbeid på 1960- og begynnelsen av 1970 -tallet førte til at han publiserte en berømt artikkel med tittelen "Fractal Objects" der han viste at disse objektene, som av en stor del av det matematiske samfunnet ble betraktet som bare kuriositeter, ble funnet overalt i naturen. Han ga mange eksempler på en lang rekke områder som fysikk, hydrologi, finans, meteorologi, geografi, geologi, metallurgi….

Hva er Mandelbrot -settet?

For å begynne, la oss si at det er en fin tegning generert av et program. Og dette programmet er ganske enkelt. Det finnes mange datagenererte tegninger og mange dataprogrammer for å generere dem. Så hva er så spesielt med denne? For det første er Mandelbrot -settet et delsett av planen, en samling poeng. Den inneholder områder, men også glatte kurver, filamenter, punkter som flere grener kommer fra, og andre ting. For det andre: det er virkelig fascinerende og har en veldig interessant historie.

På begynnelsen av 1900-tallet utviklet franske matematikere Pierre Fatou og Gaston Julia et underdomene av matematikk kalt holomorfe dynamikk. De var interessert i bestemte funksjoner, som handler på tall, ved å bruke noen av de enkleste formlene som er tilgjengelige. Tallene det er snakk om er komplekse tall, mengder representert med to koordinater (akkurat som punktene i et fly) som kalles virkelige og imaginære deler. De ble oppfunnet på 1500 -tallet av matematikere for å finne røttene til polynomer og løsningen av ligninger, men har funnet brede og dype anvendelser innen matematikk og fysikk. Vi kan legge til 2 komplekse tall, multiplisere eller dele dem, og gjøre mange andre ting. Fatou og Julia studerte egenskapene til visse dynamiske systemer der et komplekst tall varierer i henhold til en enkel regel gjentatt om og om igjen: ikke behov for kompliserte matematikk her (så du kan glemme det første bildet …). De avslørte rikdommen til disse systemene, definerte settene som nå kalles Julias sett, og studerte deres selvlikhet, derfor fraktal aspekt … men ordet eksisterte ikke på den tiden fordi det ble oppfunnet mye senere, av … Benoît Mandelbrot!

Etter grunnleggernes arbeid falt dette domenet i glemmeboken. Da datamaskinene ankom, hjalp de til med å utforske mange matematiske fenomen som krever intens databehandling, inkludert domenet åpnet av Julia og Fatou. Så da Benoît Mandelbrot bestemte seg for å bruke IBM -datamaskiner på 1980 -tallet for å representere et visst matematisk sett relatert til holomorfisk dynamikk, han fikk en veldig attraktiv og veldig spennende tegning (første bilde av forrige seksjon).

Hva representerer Mandelbrot -settet? I utgangspunktet er det et underliggende dynamisk system knyttet til hvert punkt i bildet. Koordinatene til punktet fungerer som en justerbar parameter. Ulike punkter tilsvarer forskjellige sett med Julia, og avhengig av deres oppførsel kan vi bestemme oss for å farge punktet på en bestemt måte. Mandelbrot -settet er settet med parametere som systemet har en bestemt egenskap for.

Hvordan beregne Mandelbrot og Julia sett?

Vi må gå litt mer i detalj om hvordan vi skal beregne disse settene. Mandelbrot og Julia -settene beregnes ved gjentatt iterasjon av en enkel formel, i vårt tilfelle z^n+c. z er et komplekst tall som representerer koordinatene til et punkt på displayet. er et heltall eksponent, så z^n er lik z multiplisert med seg selv n ganger, og c er en konstant.

For Mandelbrot -settet, for alle punkter i visningsområdet, initialiserer vi z til 0. Konstanten c blir tatt lik verdien av koordinatene til det betraktede punktet og formelen blir iterert.

Her er regelen: et punkt er en del av settet hvis gjentatt anvendelse av denne formelen ikke avviker (dvs. ikke fører til beregninger mot store tall). Det kan matematisk vises at hvis resultatet av formelen overstiger 2 (i modul siden vi snakker om komplekse tall), vil iterasjonen avvike. Så for raskt å oppnå vakre farger, stopper vi iterasjonen når modulens resultat er over 2 og fargen tilsvarer antallet den aktuelle iterasjonen. Hvis antallet iterasjoner blir for stort (så hvis punktet er en del av Mandelbrot -settet) stopper vi etter en gitt terskel og knytter den svarte fargen til dette punktet.

Julia -settet beregnes på en lignende måte, men beregningene initialiseres ikke med 0, men ved verdien av koordinatene til det vurderte punktet og konstanten c velges av brukeren og forblir den samme for hele bildet.

Det er det, jeg håper det er klart … Disse forklaringene hjelper deg å forstå resten av bruksanvisningen bedre.

Trinn 2: Hva trenger du?

Hva trenger du?
Hva trenger du?
Hva trenger du?
Hva trenger du?
Hva trenger du?
Hva trenger du?
Hva trenger du?
Hva trenger du?

Materialregning:

  • 1 ESP32 -kort
  • 1 TFT -skjerm med berøringsskjerm og pekepenn
  • 1 brødbrett og ledninger

Det er det. Total kostnad under 10 USD.

Espressifs ESP32 er en dual -core mikrokontroller som kjører på 240 MHz, noe som gjør den til en god kandidat for rask og kompleks repetitiv databehandling. Den har WiFi og Bluetooth -kapasiteter som jeg ikke bruker i dette prosjektet.

Instruksjonssettet er 32 bits stort. Beregning med 16 og 32 biters variabler er veldig rask, noe som muliggjør nøyaktige beregninger, noe som er grunnleggende for å zoome. I denne applikasjonen, for en 320 x 240 skjerm, er et bilde grovt laget av 75 000 piksler, som hver er beregnet ved hjelp av en iterativ prosess som kan kjøre opptil 100 ganger. Dette kan føre til 7, 500, 000 enhetsberegninger, som hver er en eksponentiering, dvs. flere multiplikasjoner …

Så beregningshastighet er viktig her, men nøyaktighet er grunnleggende. Jo mer du zoomer, jo mindre blir størrelsen på delen av settet som skal vises. Dette betyr at hver av de 320 x 240 pikslene i bildet representerer et tall som er svært nær sine naboer. Når zoomen øker, øker denne nærheten.

Men fraktalbilder har denne egenskapen at de forblir uendret ved skalering. Så små detaljer vises overalt og for enhver skaleringsfaktor. Hovedformen på Mandelbrot -settet, som vist på displayet på bildet ovenfor, kan finnes et annet sted i en mye mindre versjon, og vises hvis du zoomer nær nok (se på videoen). Men hvis koordinatforskjellen mellom to nabopiksler er for liten til at ESP32 kan fange forskjellen i atferd, på grunn av mangel på nøyaktighet, kan fraktaleffekten ikke vises …

For å få god presisjon bruker koden flyter, som er kodet i 32 biter av ESP32. Dette muliggjør opptil 6 eller 7 zoomenivåer. Bruk av dobbel presisjon (64 bits) ville ha økt denne zooming dybden, på bekostning av tregere beregninger, og dermed lengre tider mellom 2 bilder.

For å gjøre det dobbel presisjon, bare endre alle forekomster av "float" til "double" i koden og kjør koden. Jeg har nylig laget en versjon for en større skjerm (HVGA 480 x 320 piksler): 16 bits flyter tar 3 sekunder å vise bildet, og dobbel tar mellom 10 og 20 sekunder (3 til 6 ganger lengre), men støtter mer enn 15 zoomnivåer. Det tredje bildet i dette kapitlet viser zoomnivået 14 i høyre del av Mandelbrot-settet.

Slik kobler du til skjermen:

Jeg brukte en SPI -skjerm, og parameterne er angitt i filen User_Setup.h (i TFT_eSPI bibliotekmappen):

  • Driver: ikke kommenter riktig driver for skjermen. Min var #define RPI_ILI9486_DRIVER
  • Pin -numre: gå til ESP32 -delen av filen og velg

    • #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 // Tilbakestill pin (kan kobles til RST -pin)
    • #define TOUCH_CS 22 // Chip select pin (T_CS) på berøringsskjermen
  • Skrifter: du trenger ikke å endre dem
  • Andre alternativer: Jeg valgte følgende

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

Alle de andre linjene i filen kommenteres.

Kalibrer berøringskapasiteten til skjermen

Hvis valget av en skjermdel eller en knapp ikke er nøyaktig, eller til og med helt feil, kan du kjøre berøringskalibreringsskissen fra TFT_eSPI -biblioteket og kopiere / lime inn i koden matrisen den gir (sørg for å bruke riktig verdi for visningsretning, 1 eller 3 for landskap).

Trinn 3: ESP32 -program

ESP32 -programmet
ESP32 -programmet
ESP32 -programmet
ESP32 -programmet
ESP32 -programmet
ESP32 -programmet

Koden vises på en 320 x 240 TFT berøringsskjerm, og bruker TFT_eSPI -biblioteket. Den beregner Mandelbrot og Julia -settene for flere eksponentverdier, og lar deg zoome inn på områder av interesse for å se det fraktale aspektet (dvs. tilstedeværelsen av de samme strukturene ved hver skalaendring).

Den vedlagte koden er en versjon for 480 x 320 skjerm. I denne versjonen kan du endre størrelsen (bredde og høyde i piksler) på skjermen. TFT_eSPI -biblioteket definerer tilkoblingene i en oppsettfil (vedlagt) som må legges i bibliotekets katalog.

Koden starter med å vise bruksanvisningen (se bilde og video)

Det meste av skjermen er reservert for visning av bilder, berøringsknapper er tilgjengelige på høyre side av skjermen:

  • R: utfører en "reset", dvs. e. viser bildet til maksimal skala,
  • U: "angre" lar deg gå tilbake til forrige trinn (hvis det zoome området ikke er interessant, kan du velge en annen del av bildet for å zoome inn),
  • M eller J: lar deg bytte fra Mandelbrots sett til Julias sett og omvendt.

Etikettene på noen taster endres i henhold til konteksten: de viser funksjonen som vil bli utført hvis den trykkes. Så hvis du for øyeblikket viser Mandelbrot -settet, viser M/J -tasten J siden hvis du trykker på det, vil du vise Julias sett (og omvendt).

Det samme gjelder valget av fargepaletten. Vi starter med den grønne paletten. Nøkkelen foreslår den neste paletten (den blå). Palettene er: rød, grønn, blå, grå, palett 1, palett 2 og tilbake til rød. De to siste er flerfargede pallett -tester som gir mer kontrast, slik at du bedre kan se noen detaljer.

Nøkkelen med et tall lar deg velge eksponenten n, i en sløyfe fra 2 til 7 (og tilbake til 2). I samme ånd viser den 3 hvis du for øyeblikket er 2 …

Til slutt, når du viser Julia -settet, er det nødvendig å velge verdien til konstanten c: C -tasten lar deg gjøre dette, takket være en velger (se det andre bildet). Verdien av denne konstanten vises med settet.

Klikk på bildet zoomer rundt det valgte punktet. En liten sirkel vises på det berørte punktet, og et rektangel fremhever den zoome sonen til settet.

Det tredje bildet viser at datatiden forblir mellom 0,8 og 1,2 sekunder for 320 x 240 piksler, noe som gjør det behagelig å zoome og vise. Den når 3 sekunder for 480 x 320 piksler, men gir flere detaljer.

Trinn 4: Noen bilder forklart …

Noen bilder forklart …
Noen bilder forklart …
Noen bilder forklart …
Noen bilder forklart …
Noen bilder forklart …
Noen bilder forklart …

Det største bildet er det velkjente Mandelbrot -settet. De komplekse tallene som brukes i dette bildet varierer fra -2,1 til +0,7 i abscissa, og -1,2 til 1,2 i ordinat. Hvis du zoomer helt til venstre på dette første bildet, er det sannsynlig at du endelig får det andre, som viser en mindre versjon av det originale settet som finnes i spissen til venstre i settet. For begge disse bildene er eksponenten ('n') lik 2: det er verdien som vanligvis brukes til å vise Mandelbrot -sett.

Hvis du endrer denne verdien til 3 (bare klikk på tasten som sier 3), får du det tredje bildet. En åpenbar forskjell er symmetri -faktoren: n = 2 gir en aksial symmetri (dvs. settet er symmetrisk mot median horisontal akse), men med n = 3 blir bildet invariant ved rotasjon på 120 ° (en tredjedel av 360 °, rotasjon symmetri faktor 3). Og den beholder sine fraktale egenskaper, som du kan bekrefte ved å zoome på kantene på den svarte formen.

Det fjerde bildet er et Julia -sett oppnådd etter å ha valgt en koeffisientverdi lik 0,414 i abscissa og 0,09 i ordinat. Den røde paletten er valgt, som den grønne tasten til høyre kan se (grønn, den neste fargen som skal velges). Det femte bildet viser den samme typen Julia, som en høyere imaginær del av konstanten (0,358).

Jeg håper du vil like å leke med dette programmet, og at du vil kunne vise fine fraktalbilder. Ikke nøl med å utforske Mandelbrot og Julia -settene, og lek med palettene: de hjelper til med å identifisere noen detaljer som kanskje ikke er synlige med de enkle monokrome. Du kan til og med oppdage noen fraktale landskap som ingen har sett før deg …

_

Vil du oppdage flere fraktalbilder? Bare klikk her eller utforsk fraktalkunst eller til og med ascii fraktal. Kanskje denne instruksjonsfulle gir deg lyst til å lage så flotte bilder …

Laget med Math Contest
Laget med Math Contest
Laget med Math Contest
Laget med Math Contest

Andre pris i konkurransen Made with Math

Anbefalt: