Sommario:
- Passaggio 1: cosa sono gli insiemi di Mandelbrot e Julia?
- Passaggio 2: cosa ti serve?
- Passaggio 3: programma ESP32
- Passaggio 4: alcune immagini spiegate…
Video: Mandelbrot e Julia impostano su ESP32: 4 passaggi (con immagini)
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:02
Sicuramente conosci i frattali, il più famoso dei quali è l'insieme di Mandelbrot.
Ecco un programma con cui giocare su ESP32. Ho scelto ESP32 perché penso che farà i calcoli più velocemente di un Arduino standard (frequenza di clock più alta: 240 MHz): da circa un secondo a un secondo e mezzo per il calcolo e la visualizzazione.
Il codice viene visualizzato su un touch screen TFT 480 x 320. Calcola i set di Mandelbrot e Julia per diversi valori di parametro e consente di ingrandire le aree di interesse per vedere l'aspetto frattale (ovvero la presenza delle stesse strutture ad ogni cambio di scala). Il livello di zoom è limitato a causa della scarsa precisione dei calcoli, ma è possibile eseguire una mezza dozzina di zoom prima che l'immagine si deteriori.
Preparati a esplorare il magico mondo dei frattali…
Passaggio 1: cosa sono gli insiemi di Mandelbrot e Julia?
L'insieme di Mandelbrot prende il nome da Benoit Mandelbrot (1924-2010), un matematico francese e americano che fece un lavoro pionieristico nella geometria frattale, iniziato alla fine del XIX secolo da, tra gli altri, Peano, Sierpinski e Julia.
Cosa sono gli oggetti frattali?
Le irregolarità della natura, che possono sembrare caotiche, come la linea della costa del mare, la forma delle nuvole, un albero, sono in realtà l'espressione di una geometria molto complessa in scala mutevole. In questo contesto, la nozione di dimensione frazionaria sostituisce quella della consueta dimensione euclidea (che è sempre un numero intero)!
Un oggetto frattale è tale che ogni sua parte è identica al tutto (questo si chiama autosimilarità): la sua struttura è invariante per cambiamento di scala.
Il termine "frattale" è un neologismo creato da Benoît Mandelbrot nel 1974 dalla radice latina fractus, che significa "rotto", "irregolare". È sia un sostantivo che un aggettivo. Molti fenomeni naturali - come il profilo delle coste o la comparsa del cavolo romanesco (vedi foto) - hanno forme approssimative frattali.
Benoît Mandelbrot ha avuto una carriera un po' atipica: dopo aver insegnato all'Università di Lille (Francia), ha preso una posizione in IBM dove è diventato rapidamente un IBM Fellow, cosa che gli ha dato una grande libertà per i suoi studi scientifici. All'inizio degli anni '80, dopo aver lasciato l'IBM, divenne professore ad Harvard, ma si stabilì definitivamente a Yale.
Il suo lavoro negli anni '60 e nei primi anni '70 lo portò a pubblicare un famoso articolo intitolato "Fractal Objects" in cui mostrava che questi oggetti, considerati da gran parte della comunità matematica come semplici curiosità, si trovavano ovunque in natura. Ha fornito molti esempi in un'ampia varietà di campi come la fisica, l'idrologia, la finanza, la meteorologia, la geografia, la geologia, la metallurgia…
Cos'è l'insieme di Mandelbrot?
Per cominciare, diciamo che è un bel disegno generato da un programma. E questo programma è abbastanza semplice. Esistono molti disegni generati dal computer e molti software per generarli. Allora, cosa c'è di così speciale in questo? Innanzitutto, l'insieme di Mandelbrot è un sottoinsieme del piano, un insieme di punti. Contiene aree ma anche curve lisce, filamenti, punti da cui emanano più rami e altre cose. Secondo: è davvero affascinante e ha una storia molto interessante.
All'inizio del XX secolo, i matematici francesi Pierre Fatou e Gaston Julia svilupparono un sottodominio della matematica chiamato dinamica olomorfa. Erano interessati a particolari funzioni, agendo sui numeri, utilizzando alcune delle formule più semplici disponibili. I numeri in questione sono numeri complessi, quantità rappresentate da due coordinate (proprio come i punti di un piano) chiamate parti reali e immaginarie. Sono stati inventati nel XVI secolo dai matematici per aiutare a trovare le radici dei polinomi e la soluzione delle equazioni, ma hanno trovato applicazioni ampie e profonde nella matematica e nelle scienze fisiche. Possiamo aggiungere 2 numeri complessi, moltiplicarli o dividerli e fare molte altre cose. Fatou e Julia hanno studiato le proprietà di certi sistemi dinamici in cui un numero complesso varia secondo una semplice regola ripetuta più e più volte: qui non c'è bisogno di calcoli complicati (quindi, puoi dimenticare la prima immagine…). Rivelarono la ricchezza di questi sistemi, definirono gli insiemi ora chiamati insiemi di Julia, e ne studiarono l'autosomiglianza, quindi aspetto frattale… ma la parola non esisteva allora perché fu inventata solo molto più tardi, da… Benoît Mandelbrot!
Dopo il lavoro dei fondatori, questo dominio cadde nel dimenticatoio. Quando i computer sono arrivati, hanno aiutato a esplorare molti fenomeni matematici che richiedono un'elaborazione intensiva, incluso il dominio aperto da Julia e Fatou. Così, quando Benoît Mandelbrot decise di utilizzare i computer IBM negli anni '80 per rappresentare un certo insieme matematico relativo alla dinamica olomorfa, ha ottenuto un disegno molto attraente e molto intrigante (prima foto della sezione precedente).
Cosa rappresenta l'insieme di Mandelbrot? In sostanza, ad ogni punto dell'immagine è associato un sistema dinamico sottostante. Le coordinate del punto fungono da parametro regolabile. Diversi punti corrispondono a diversi insiemi di Julia ea seconda del loro comportamento, possiamo decidere di colorare il punto in un modo particolare. L'insieme di Mandelbrot è l'insieme dei parametri per i quali il sistema possiede una certa proprietà.
Come calcolare gli insiemi di Mandelbrot e Julia?
Dobbiamo entrare un po' più nel dettaglio su come calcolare questi set. Gli insiemi di Mandelbrot e Julia sono calcolati dall'iterazione ripetuta di una semplice formula, nel nostro caso z^n+c. z è un numero complesso che rappresenta le coordinate di un punto sul display. è un esponente intero, quindi z^n è uguale a z moltiplicato per se stesso n volte e c è una costante.
Per l'insieme di Mandelbrot, per tutti i punti dell'area di visualizzazione, si inizializza z a 0. Si assume la costante c uguale al valore delle coordinate del punto considerato e si itera la formula.
Ecco la regola: un punto fa parte dell'insieme se l'applicazione ripetuta di questa formula non diverge (cioè non porta a calcoli verso grandi numeri). Si può dimostrare matematicamente che se il risultato della formula supera 2 (in modulo poiché si tratta di numeri complessi) l'iterazione diverge. Quindi, per ottenere rapidamente bei colori, fermiamo l'iterazione quando il modulo del risultato supera 2 e il colore corrisponde al numero di quella particolare iterazione. Se il numero di iterazioni diventa troppo grande (quindi se il punto fa parte dell'insieme di Mandelbrot) ci fermiamo dopo una data soglia e associamo a questo punto il colore nero.
L'insieme di Julia viene calcolato in modo simile ma i calcoli non vengono inizializzati a 0 ma al valore delle coordinate del punto considerato e la costante c viene scelta dall'utente e rimane la stessa per l'intera immagine.
Ecco, spero sia chiaro… Queste spiegazioni aiutano a capire meglio il resto delle istruzioni per l'uso.
Passaggio 2: cosa ti serve?
Distinta base:
- 1 scheda ESP32
- 1 display TFT con touchscreen e stilo
- 1 breadboard e fili
Questo è tutto. Costo totale inferiore a 10 USD.
ESP32 di Espressif è un microcontrollore dual core che funziona a 240 MHz, il che lo rende un buon candidato per l'elaborazione ripetitiva veloce e complessa. Ha capacità WiFi e Bluetooth che non uso in questo progetto.
Il set di istruzioni ha una dimensione di 32 bit. L'elaborazione con variabili a 16 e 32 bit è molto veloce e consente calcoli accurati, fondamentali per lo zoom. In questa applicazione, per un display 320 x 240, un'immagine è composta approssimativamente da 75.000 pixel, ciascuno dei quali viene calcolato utilizzando un processo iterativo che può essere eseguito fino a 100 volte. Questo può portare a 7.500.000 calcoli unitari, ognuno dei quali è un elevamento a potenza, cioè diverse moltiplicazioni…
Quindi la velocità di calcolo è essenziale qui, ma la precisione è fondamentale. Maggiore è lo zoom, minore è la dimensione della porzione del set da visualizzare. Ciò significa che ciascuno dei 320 x 240 pixel dell'immagine rappresenta un numero molto vicino ai suoi vicini. All'aumentare dello zoom, questa vicinanza aumenta.
Ma le immagini frattali hanno questa proprietà di rimanere invariate quando vengono ridimensionate. Quindi piccoli dettagli appaiono ovunque e per qualsiasi fattore di scala. La forma principale del set di Mandelbrot, come si vede sul display nell'immagine sopra, può essere trovata da qualche altra parte in una versione molto più piccola e può essere visualizzata se si ingrandisce abbastanza (vedi nel video). Ma se la differenza di coordinate tra due pixel vicini è troppo piccola per consentire all'ESP32 di rilevare la loro differenza di comportamento, a causa della mancanza di precisione, l'effetto frattale non può essere mostrato…
Per ottenere una buona precisione, il codice utilizza i float, che sono codificati a 32 bit dall'ESP32. Ciò consente fino a 6 o 7 livelli di zoom. L'utilizzo della doppia precisione (64 bit) avrebbe aumentato questa profondità di zoom, a costo di calcoli più lenti, quindi tempi più lunghi tra 2 immagini.
Per renderlo a doppia precisione, cambia tutte le occorrenze di "float" in "double" nel codice ed esegui il codice. Di recente ho realizzato una versione per un display più grande (HVGA 480 x 320 pixel): i float a 16 bit impiegano 3 secondi per visualizzare l'immagine e i doppi impiegano tra 10 e 20 secondi (da 3 a 6 volte di più) ma supportano più di 15 livelli di zoom. La terza immagine in questo capitolo mostra il livello di zoom 14 nella parte più a destra dell'insieme di Mandelbrot.
Come collegare il display:
Ho usato un display SPI e i parametri sono impostati nel file User_Setup.h (nella cartella della libreria TFT_eSPI):
- Driver: decommenta il driver corretto per il tuo display. Il mio era #define RPI_ILI9486_DRIVER
-
Numeri pin: vai alla sezione ESP32 del file e scegli
- #define TFT_MISO 19
- #define TFT_MOSI 23
- #define TFT_SCLK 18
- #define TFT_CS 15 // Pin di controllo selezione chip
- #define TFT_DC 2 // Pin di controllo del comando dati
- #define TFT_RST 4 // Reimposta pin (potrebbe connettersi al pin RST)
- #define TOUCH_CS 22 // Pin di selezione chip (T_CS) del touch screen
- Caratteri: non è necessario cambiarli
-
Altre opzioni: ho selezionato quanto segue
- #define SPI_FREQUENCY 20000000
- #define SPI_READ_FREQUENCY 20000000
- #define SPI_TOUCH_FREQUENCY 2500000
Tutte le altre righe del file sono commentate.
Calibrare la capacità di tocco del display
Se la selezione di una porzione dello schermo o di un pulsante non è accurata, o addirittura totalmente sbagliata, esegui lo sketch di calibrazione del tocco dalla libreria TFT_eSPI e copia/incolla nel codice l'array che fornisce (assicurati di utilizzare il valore corretto per l'orientamento del display, 1 o 3 per il paesaggio).
Passaggio 3: programma ESP32
Il codice viene visualizzato su un touch screen TFT 320 x 240 e utilizza la libreria TFT_eSPI. Calcola gli insiemi di Mandelbrot e Julia per diversi valori di esponente e consente di ingrandire le aree di interesse per vedere l'aspetto frattale (ovvero la presenza delle stesse strutture ad ogni cambio di scala).
Il codice allegato è una versione per display 480 x 320. In questa versione è possibile modificare le dimensioni (larghezza e altezza in pixel) del display. La libreria TFT_eSPI definisce le connessioni in un file di setup (allegato) che deve essere messo nella directory della libreria.
Il codice inizia visualizzando le istruzioni per l'uso (vedi immagine e video)
La maggior parte dello schermo è riservata alla visualizzazione delle immagini, i pulsanti a sfioramento sono disponibili sul lato destro dello schermo:
- R: esegue un "reset", i. e. visualizza l'immagine alla sua scala massima,
- U: "annulla" ti consente di tornare al passaggio precedente (se la regione ingrandita non è interessante, puoi scegliere un'altra parte dell'immagine da ingrandire),
- M o J: permette di passare dall'insieme di Mandelbrot all'insieme di Julia e viceversa.
Le etichette di alcuni tasti cambiano in base al contesto: visualizzano la funzione che verrà eseguita se premuti. Quindi, se attualmente visualizzi l'insieme di Mandelbrot, il tasto M/J visualizza J poiché se lo premi visualizzerai l'insieme di Julia (e viceversa).
Lo stesso vale per la scelta della tavolozza dei colori. Iniziamo con la tavolozza verde. La chiave propone la tavolozza successiva (quella blu). Le tavolozze sono: rosso, verde, blu, grigio, tavolozza 1, tavolozza 2 e ritorno al rosso. Gli ultimi due sono test di pallette multicolori che forniscono più contrasto, permettendo di vedere meglio alcuni dettagli.
La chiave con un numero permette di scegliere l'esponente n, in un ciclo da 2 a 7 (e ritorno a 2). Nello stesso spirito, mostra 3 se sei attualmente a 2…
Infine, quando si visualizza l'insieme di Julia, è necessario scegliere il valore della costante c: il tasto C permette di farlo, grazie ad un selettore (vedi seconda figura). Il valore di questa costante viene visualizzato con il set.
Cliccando sull'immagine si ingrandisce il punto selezionato. Viene visualizzato un piccolo cerchio nel punto toccato e un rettangolo evidenzia la zona ingrandita del set.
La terza immagine mostra che i tempi di calcolo rimangono tra 0,8 e 1,2 secondi per 320 x 240 pixel, il che rende comodo lo zoom e la visualizzazione. Raggiunge 3 secondi per 480 x 320 pixel, ma fornisce maggiori dettagli.
Passaggio 4: alcune immagini spiegate…
L'immagine più grande è il famoso set di Mandelbrot. I numeri complessi utilizzati in questa immagine vanno da -2,1 a +0,7 in ascissa e da -1,2 a 1,2 in ordinata. Se ingrandisci la parte all'estrema sinistra di questa prima immagine, è probabile che alla fine ottieni la seconda, che mostra una versione più piccola del set originale che si trova nella punta più a sinistra del set. Per entrambe queste immagini, l'esponente ('n') è uguale a 2: questo è il valore normalmente utilizzato per visualizzare gli insiemi di Mandelbrot.
Se cambi questo valore in 3 (basta cliccare sul tasto che dice 3), ottieni la terza immagine. Una differenza ovvia è il fattore di simmetria: n=2 dà una simmetria assiale (cioè l'insieme è simmetrico rispetto all'asse orizzontale mediano), ma con n=3 l'immagine diventa invariante per rotazione di 120° (un terzo di 360°, rotazione fattore di simmetria di 3). E mantiene le sue proprietà frattali, che puoi verificare ingrandendo i bordi della forma nera.
La 4a immagine è un insieme di Julia ottenuto dopo aver selezionato un valore del coefficiente pari a 0,414 in ascissa e 0,09 in ordinata. Viene scelta la tavolozza rossa, come si vede dal tasto verde a destra (verde, essendo il prossimo colore da scegliere). La quinta immagine mostra lo stesso tipo di insieme di Julia, che è una parte immaginaria più alta della costante (0.358).
Spero che ti divertirai a giocare con questo programma e che sarai in grado di visualizzare belle immagini frattali. Non esitate ad esplorare i set di Mandelbrot e Julia, e giocate con le tavolozze: aiutano a identificare alcuni dettagli che potrebbero non essere visibili con i semplici monocromi. Potresti persino scoprire alcuni paesaggi frattali che nessuno ha mai visto prima di te…
_
Vuoi scoprire altre immagini frattali? Basta fare clic qui o esplorare l'arte frattale o anche il frattale ascii. Forse questo tutorial ti farà venire voglia di creare immagini così belle…
Secondo Premio al Concorso Made with Math
Consigliato:
Come installare Raspberry PI 4 Headless (VNC) con Rpi-imager e immagini: 7 passaggi (con immagini)
Howto: installazione di Raspberry PI 4 Headless (VNC) con Rpi-imager e immagini: ho intenzione di utilizzare questo Rapsberry PI in una serie di progetti divertenti nel mio blog. Sentiti libero di dare un'occhiata. Volevo tornare a usare il mio Raspberry PI ma non avevo una tastiera o un mouse nella mia nuova posizione. Era un po' che non installavo un Raspberry
Intelligenza artificiale e riconoscimento delle immagini con HuskyLens: 6 passaggi (con immagini)
Intelligenza artificiale e riconoscimento delle immagini con HuskyLens: Ehi, come va, ragazzi! Akarsh qui da CETech. In questo progetto, daremo un'occhiata all'HuskyLens di DFRobot. È un modulo fotocamera basato sull'intelligenza artificiale in grado di eseguire diverse operazioni di intelligenza artificiale come Face Recognitio
Telecomando wireless con modulo NRF24L01 da 2,4 Ghz con Arduino - Nrf24l01 Ricevitore trasmettitore 4 canali / 6 canali per quadricottero - Elicottero Rc - Aereo RC con Arduino: 5 passaggi (con immagini)
Telecomando wireless con modulo NRF24L01 da 2,4 Ghz con Arduino | Nrf24l01 Ricevitore trasmettitore 4 canali / 6 canali per quadricottero | Elicottero Rc | Aereo radiocomandato con Arduino: per far funzionare un'auto radiocomandata | Quadricottero | Drone | Aereo RC | Barca RC, abbiamo sempre bisogno di un ricevitore e trasmettitore, supponiamo che per RC QUADCOPTER abbiamo bisogno di un trasmettitore e ricevitore a 6 canali e quel tipo di TX e RX è troppo costoso, quindi ne faremo uno sul nostro
Termometro da cucina con sonda di temperatura NTP ESP32 con correzione Steinhart-Hart e allarme temperatura.: 7 passaggi (con immagini)
Termometro da cucina con sonda di temperatura NTP ESP32 con correzione Steinhart-Hart e allarme di temperatura. è un Instructable che mostra come aggiungo una sonda di temperatura NTP, piezo b
Come smontare un computer con semplici passaggi e immagini: 13 passaggi (con immagini)
Come smontare un computer con semplici passaggi e immagini: questa è un'istruzione su come smontare un PC. La maggior parte dei componenti di base sono modulari e facilmente smontabili. Tuttavia è importante che tu sia organizzato al riguardo. Questo ti aiuterà a non perdere parti e anche a rendere più facile il rimontaggio