Spisu treści:

Zestawy Mandelbrota i Julii na ESP32: 4 kroki (ze zdjęciami)
Zestawy Mandelbrota i Julii na ESP32: 4 kroki (ze zdjęciami)

Wideo: Zestawy Mandelbrota i Julii na ESP32: 4 kroki (ze zdjęciami)

Wideo: Zestawy Mandelbrota i Julii na ESP32: 4 kroki (ze zdjęciami)
Wideo: Бенуа Мандельброт: Фракталы и искусство изломанности 2024, Lipiec
Anonim
Image
Image
Zestawy Mandelbrota i Julii na ESP32
Zestawy Mandelbrota i Julii na ESP32
Zestawy Mandelbrota i Julii na ESP32
Zestawy Mandelbrota i Julii na ESP32

Na pewno znasz fraktale, z których najsłynniejszym jest zbiór Mandelbrota.

Oto program do zabawy na ESP32. Wybrałem ESP32, ponieważ myślę, że wykona obliczenia szybciej niż standardowe Arduino (wyższa częstotliwość zegara: 240 MHz): około sekundy do półtorej sekundy do obliczeń i wyświetlania.

Kod wyświetla się na ekranie dotykowym 480 x 320 TFT. Oblicza zestawy Mandelbrota i Julii dla kilku wartości parametrów i pozwala powiększać interesujące obszary, aby zobaczyć aspekt fraktalny (tj. obecność tych samych struktur przy każdej zmianie skali). Poziom powiększenia jest ograniczony ze względu na ograniczoną dokładność obliczeń, ale można wykonać pół tuzina powiększenia, zanim obraz się pogorszy.

Przygotuj się na odkrywanie magicznego świata fraktali…

Krok 1: Czym są zestawy Mandelbrot i Julia?

Czym są zestawy Mandelbrot i Julia?
Czym są zestawy Mandelbrot i Julia?
Czym są zestawy Mandelbrot i Julia?
Czym są zestawy Mandelbrot i Julia?
Czym są zestawy Mandelbrot i Julia?
Czym są zestawy Mandelbrot i Julia?

Zbiór Mandelbrota nosi imię Benoita Mandelbrota (1924-2010), francuskiego i amerykańskiego matematyka, który wykonał pionierskie prace w geometrii fraktalnej, zainicjowane pod koniec XIX wieku m.in. przez Peano, Sierpińskiego i Julię.

Czym są obiekty fraktalne?

Nieregularności natury, które mogą wydawać się chaotyczne, jak linia wybrzeża morskiego, kształt chmur, drzewo, są w rzeczywistości wyrazem bardzo złożonej geometrii o zmiennej skali. W tym kontekście pojęcie wymiaru ułamkowego zastępuje zwykły wymiar euklidesowy (który jest zawsze liczbą całkowitą)!

Obiekt fraktalny jest taki, że dowolna jego część jest identyczna z całością (to się nazywa samopodobieństwo): jego struktura jest niezmienna wraz ze zmianą skali.

Termin „fraktal” to neologizm stworzony przez Benoît Mandelbrota w 1974 roku z łacińskiego fractus, co oznacza „złamany”, „nieregularny”. To zarówno rzeczownik, jak i przymiotnik. Wiele zjawisk przyrodniczych - takich jak zarys linii brzegowej lub wygląd kapusty romańskiej (patrz zdjęcie) - ma kształty przybliżone fraktalne.

Benoît Mandelbrot miał nieco nietypową karierę: po nauczaniu na Uniwersytecie w Lille (Francja), objął stanowisko w IBM, gdzie szybko został IBM Fellow, co dało mu dużą swobodę w badaniach naukowych. Na początku lat 80., po odejściu z IBM, został profesorem na Harvardzie, ale osiadł na stałe w Yale.

Jego praca w latach 60. i wczesnych 70. doprowadziła go do opublikowania słynnego artykułu zatytułowanego „Obiekty fraktalne”, w którym wykazał, że obiekty te, uważane przez dużą część społeczności matematycznej za zwykłe ciekawostki, można znaleźć wszędzie w przyrodzie. Podał wiele przykładów z różnych dziedzin, takich jak fizyka, hydrologia, finanse, meteorologia, geografia, geologia, metalurgia….

Czym jest zestaw Mandelbrota?

Na początek załóżmy, że jest to ładny rysunek wygenerowany przez program. A ten program jest dość prosty. Istnieje wiele rysunków generowanych komputerowo i wiele programów komputerowych do ich generowania. Więc co jest takiego specjalnego w tym? Po pierwsze, zbiór Mandelbrota jest podzbiorem planu, zbiorem punktów. Zawiera obszary, ale także gładkie krzywe, włókna, punkty, z których emanują liczne gałęzie i inne rzeczy. Po drugie: jest naprawdę fascynująca i ma bardzo ciekawą historię.

Na początku XX wieku francuscy matematycy Pierre Fatou i Gaston Julia opracowali poddziedzinę matematyki zwaną dynamiką holomorficzną. Interesowały ich poszczególne funkcje działające na liczbach, korzystając z najprostszych dostępnych formuł. Liczby, o których mowa, to liczby zespolone, wielkości reprezentowane przez dwie współrzędne (podobnie jak punkty płaszczyzny) zwane częściami rzeczywistymi i urojonymi. Zostały wynalezione w XVI wieku przez matematyków, aby pomóc w znalezieniu korzeni wielomianów i rozwiązywaniu równań, ale znalazły szerokie i głębokie zastosowanie w matematyce i naukach fizycznych. Możemy dodać 2 liczby zespolone, pomnożyć je lub podzielić i zrobić wiele innych rzeczy. Fatou i Julia badali właściwości pewnych układów dynamicznych, w których liczba zespolona zmienia się zgodnie z prostą regułą powtarzaną w kółko: nie ma tutaj potrzeby stosowania skomplikowanej matematyki (więc możesz zapomnieć o pierwszym obrazie…). Ujawnili bogactwo tych systemów, zdefiniowali zbiory zwane teraz zbiorami Julii i zbadali ich samopodobieństwo, a więc aspekt fraktalny… ale słowo to nie istniało wtedy, ponieważ zostało wymyślone znacznie później, przez… Benoît Mandelbrot!

Po pracy założycieli domena ta popadła w zapomnienie. Kiedy pojawiły się komputery, pomogły one zbadać wiele zjawisk matematycznych wymagających intensywnej pracy komputerowej, w tym dziedzinę otwartą przez Julię i Fatou. Tak więc, kiedy Benoît Mandelbrot zdecydował się wykorzystać komputery IBM w latach 80., aby przedstawić pewien zbiór matematyczny związany z dynamiką holomorficzną uzyskał bardzo atrakcyjny i bardzo intrygujący rysunek (pierwsze zdjęcie poprzedniego działu).

Co reprezentuje zestaw Mandelbrota? Zasadniczo istnieje podstawowy system dynamiczny związany z każdym punktem obrazu. Współrzędne punktu działają jak regulowany parametr. Różne punkty odpowiadają różnym zbiorom Julii i w zależności od ich zachowania możemy zdecydować się pokolorować punkt w określony sposób. Zbiór Mandelbrota to zbiór parametrów, dla których system ma określoną właściwość.

Jak obliczyć zbiory Mandelbrota i Julii?

Musimy trochę bardziej szczegółowo obliczyć te zestawy. Zbiory Mandelbrota i Julii są obliczane przez powtarzaną iterację prostego wzoru, w naszym przypadku z^n+c. z to liczba zespolona, która reprezentuje współrzędne punktu na wyświetlaczu. jest wykładnikiem całkowitym, więc z^n jest równe z pomnożone przez siebie n razy, a c jest stałą.

Dla zbioru Mandelbrota, dla wszystkich punktów w obszarze wyświetlania, inicjujemy z na 0. Stała c jest równa wartości współrzędnych rozpatrywanego punktu i wzór jest iterowany.

Oto zasada: punkt jest częścią zbioru, jeśli wielokrotne zastosowanie tego wzoru nie rozbiega się (tj. nie prowadzi do obliczeń na dużych liczbach). Można matematycznie wykazać, że jeśli wynik ze wzoru przekroczy 2 (w module, ponieważ mówimy o liczbach zespolonych) iteracja będzie rozbieżna. Aby szybko uzyskać ładne kolory, zatrzymujemy iterację, gdy moduł wyniku przekracza 2, a kolor odpowiada numerowi tej konkretnej iteracji. Jeśli liczba iteracji stanie się zbyt duża (czyli jeśli punkt jest częścią zbioru Mandelbrota) zatrzymujemy się po danym progu i kojarzymy z tym punktem kolor czarny.

Zbiór Julii obliczany jest w podobny sposób, ale obliczenia nie są inicjalizowane od 0, ale od wartości współrzędnych rozpatrywanego punktu, a stała c jest wybierana przez użytkownika i pozostaje taka sama dla całego obrazu.

To wszystko, mam nadzieję, że to jasne… Te wyjaśnienia pomagają lepiej zrozumieć resztę instrukcji użytkowania.

Krok 2: Czego potrzebujesz?

Czego potrzebujesz?
Czego potrzebujesz?
Czego potrzebujesz?
Czego potrzebujesz?
Czego potrzebujesz?
Czego potrzebujesz?
Czego potrzebujesz?
Czego potrzebujesz?

Zestawienie materiałów:

  • 1 płyta ESP32
  • 1 wyświetlacz TFT z ekranem dotykowym i rysikiem
  • 1 płytka stykowa i przewody

Otóż to. Całkowity koszt poniżej 10 USD.

ESP32 firmy Espressif to dwurdzeniowy mikrokontroler działający z częstotliwością 240 MHz, co czyni go dobrym kandydatem do szybkich i złożonych, powtarzalnych obliczeń. Ma możliwości WiFi i Bluetooth, których nie używam w tym projekcie.

Zestaw instrukcji ma rozmiar 32 bity. Obliczenia ze zmiennymi 16- i 32-bitowymi są bardzo szybkie, co umożliwia dokładne obliczenia, co jest fundamentalne dla celów powiększania. W tej aplikacji, dla wyświetlacza 320 x 240, obraz składa się z grubsza z 75 000 pikseli, z których każdy jest obliczany w procesie iteracyjnym, który może przebiegać do 100 razy. Może to prowadzić do 7 500 000 obliczeń unitarnych, z których każdy jest potęgą, czyli kilkoma mnożeniami…

Tak więc szybkość obliczeń jest tutaj kluczowa, ale dokładność jest fundamentalna. Im większe powiększenie, tym mniejszy rozmiar wyświetlanej części zestawu. Oznacza to, że każdy z 320 x 240 pikseli obrazu reprezentuje liczbę bardzo zbliżoną do swoich sąsiadów. Wraz ze wzrostem powiększenia ta bliskość wzrasta.

Ale obrazy fraktalne mają tę właściwość, że pozostają niezmienione przez skalowanie. Tak więc drobne szczegóły pojawiają się wszędzie i dla każdego współczynnika skalowania. Główny kształt zestawu Mandelbrota, jak widać na wyświetlaczu na powyższym obrazku, znajduje się gdzie indziej w znacznie mniejszej wersji i zostanie wyświetlony, jeśli zbliżysz się dostatecznie blisko (zobacz na wideo). Ale jeśli różnica współrzędnych między dwoma sąsiednimi pikselami jest zbyt mała, aby umożliwić ESP32 wychwycenie ich różnicy w zachowaniu, z powodu braku dokładności nie można pokazać efektu fraktalnego…

Aby uzyskać dobrą precyzję, kod używa pływaków, które są kodowane w 32 bitach przez ESP32. Umożliwia to do 6 lub 7 poziomów powiększenia. Użycie podwójnej precyzji (64 bity) zwiększyłoby tę głębię powiększenia kosztem wolniejszych obliczeń, a tym samym dłuższych czasów między dwoma obrazami.

Aby uzyskać podwójną precyzję, po prostu zmień wszystkie wystąpienia „float” na „double” w kodzie i uruchom kod. Niedawno stworzyłem wersję na większy wyświetlacz (HVGA 480 x 320 pikseli): 16 bitów pływających zajmuje 3 sekundy, aby wyświetlić obraz, a podwojenie zajmuje od 10 do 20 sekund (od 3 do 6 razy dłużej), ale obsługuje ponad 15 poziomów powiększenia. Trzeci obraz w tym rozdziale pokazuje poziom powiększenia 14 w prawej części zestawu Mandelbrota.

Jak podłączyć wyświetlacz:

Użyłem wyświetlacza SPI, a parametry ustawiam w pliku User_Setup.h (w folderze biblioteki TFT_eSPI):

  • Sterownik: odkomentuj właściwy sterownik wyświetlacza. Mój był #define RPI_ILI9486_DRIVER
  • Numery pinów: przejdź do sekcji ESP32 pliku i wybierz

    • #define TFT_MISO 19
    • #zdefiniuj TFT_MOSI 23
    • #zdefiniuj TFT_SCLK 18
    • #define TFT_CS 15 // pin kontrolny wyboru chipa
    • #define TFT_DC 2 // pin kontrolny polecenia danych
    • #define TFT_RST 4 // Zresetuj pin (może połączyć się z pinem RST)
    • #define TOUCH_CS 22 // pin wyboru chipa (T_CS) ekranu dotykowego
  • Czcionki: nie trzeba ich zmieniać
  • Inne opcje: wybrałem następujące

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

Wszystkie pozostałe wiersze pliku są wykomentowane.

Skalibruj pojemność dotykową wyświetlacza

Jeśli wybór fragmentu ekranu lub przycisku nie jest dokładny lub nawet całkowicie błędny, uruchom szkic kalibracji dotyku z biblioteki TFT_eSPI i skopiuj / wklej do kodu tablicę, którą dostarcza (upewnij się, że użyłeś prawidłowej wartości dla orientacji wyświetlacza, 1 lub 3 dla krajobrazu).

Krok 3: Program ESP32

Program ESP32
Program ESP32
Program ESP32
Program ESP32
Program ESP32
Program ESP32

Kod wyświetla się na ekranie dotykowym 320 x 240 TFT i korzysta z biblioteki TFT_eSPI. Oblicza zestawy Mandelbrota i Julii dla kilku wartości wykładników i pozwala powiększać interesujące obszary, aby zobaczyć aspekt fraktalny (tj. obecność tych samych struktur przy każdej zmianie skali).

Załączony kod to wersja na wyświetlacz 480 x 320. W tej wersji możesz zmienić rozmiar (szerokość i wysokość w pikselach) wyświetlacza. Biblioteka TFT_eSPI definiuje połączenia w pliku konfiguracyjnym (w załączeniu), który należy umieścić w katalogu biblioteki.

Kod zaczyna się od wyświetlenia instrukcji obsługi (patrz zdjęcie i wideo)

Większość ekranu jest zarezerwowana do wyświetlania obrazów, przyciski dotykowe są dostępne po prawej stronie ekranu:

  • R: wykonuje „reset”, tj. mi. wyświetla obraz w maksymalnej skali,
  • U: „cofnij” pozwala cofnąć się do poprzedniego kroku (jeśli powiększony obszar nie jest interesujący, możesz wybrać inny fragment obrazu do powiększenia),
  • M lub J: pozwala przełączyć się z zestawu Mandelbrota na zestaw Julii i odwrotnie.

Etykiety niektórych klawiszy zmieniają się w zależności od kontekstu: wyświetlają funkcję, która zostanie wykonana po naciśnięciu. Więc jeśli aktualnie wyświetlasz zestaw Mandelbrota, klawisz M/J wyświetla J, ponieważ jeśli go naciśniesz, wyświetlisz zestaw Julii (i vice versa).

To samo dotyczy wyboru palety kolorów. Zaczynamy od zielonej palety. Klucz proponuje następną paletę (niebieską). Palety to: czerwony, zielony, niebieski, szary, paleta 1, paleta 2 iz powrotem do czerwonego. Ostatnie dwa to wielokolorowe testy paletowe, które zapewniają większy kontrast, co pozwala lepiej dostrzec niektóre szczegóły.

Klawisz z liczbą pozwala wybrać wykładnik n w pętli od 2 do 7 (i z powrotem do 2). W tym samym duchu wyświetla 3, jeśli obecnie masz 2…

Na koniec, przy wyświetlaniu zbioru Julia, należy wybrać wartość stałej c: klawisz C pozwala to zrobić, dzięki selektorowi (patrz drugie zdjęcie). Wartość tej stałej jest wyświetlana wraz z zestawem.

Kliknięcie w obraz przybliża wybrany punkt. W dotkniętym punkcie wyświetlany jest mały okrąg, a prostokąt podświetla powiększoną strefę zestawu.

Trzecie zdjęcie pokazuje, że czasy obliczeniowe wynoszą od 0,8 do 1,2 sekundy dla 320 x 240 pikseli, dzięki czemu można wygodnie powiększać i wyświetlać. Osiąga 3 sekundy dla 480 x 320 pikseli, ale zapewnia więcej szczegółów.

Krok 4: Wyjaśnienie niektórych zdjęć…

Niektóre zdjęcia wyjaśnione…
Niektóre zdjęcia wyjaśnione…
Niektóre zdjęcia wyjaśnione…
Niektóre zdjęcia wyjaśnione…
Niektóre zdjęcia wyjaśnione…
Niektóre zdjęcia wyjaśnione…

Największym obrazem jest dobrze znany zestaw Mandelbrota. Liczby zespolone użyte na tym obrazie mieszczą się w zakresie od -2,1 do +0,7 na odciętej i od -1,2 do 1,2 na rzędnej. Jeśli powiększysz lewą część tego pierwszego obrazu, prawdopodobnie w końcu dostaniesz drugi, który wyświetla mniejszą wersję oryginalnego zestawu znajdującego się w skrajnej lewej części zestawu. Dla obu tych obrazów wykładnik ('n') jest równy 2: jest to wartość zwykle używana do wyświetlania zbiorów Mandelbrota.

Jeśli zmienisz tę wartość na 3 (wystarczy kliknąć na klawisz z napisem 3), otrzymasz trzeci obraz. Jedną z oczywistych różnic jest współczynnik symetrii: n=2 daje symetrię osiową (tzn. zbiór jest symetryczny względem środkowej osi poziomej), ale przy n=3 obraz staje się niezmienny przy obrocie o 120° (jedna trzecia z 360°, obrót współczynnik symetrii 3). I zachowuje swoje fraktalne właściwości, które możesz sprawdzić, powiększając krawędzie czarnego kształtu.

Czwarty obraz to zbiór Julii uzyskany po wybraniu wartości współczynnika równej 0,414 w odciętej i 0,09 w rzędnej. Czerwona paleta jest wybrana, co widać po zielonym klawiszu po prawej (zielony, to następny kolor do wyboru). Piąty obraz przedstawia ten sam rodzaj zbioru Julii, który jest wyższą częścią urojoną stałej (0,358).

Mam nadzieję, że spodoba ci się granie z tym programem i że będziesz mógł wyświetlać ładne fraktalne obrazy. Nie wahaj się eksplorować zestawów Mandelbrota i Julii i bawić się paletami: pomagają zidentyfikować niektóre szczegóły, które mogą nie być widoczne w przypadku prostych monochromatycznych. Możesz nawet odkryć fraktalne krajobrazy, których nikt przed tobą nie widział…

_

Chcesz odkryć więcej obrazów fraktalnych? Po prostu kliknij tutaj lub poznaj sztukę fraktalną, a nawet fraktal ascii. Może ta instrukcja sprawi, że będziesz chciał tworzyć tak wspaniałe obrazy…

Wykonane w konkursie matematycznym
Wykonane w konkursie matematycznym
Wykonane w konkursie matematycznym
Wykonane w konkursie matematycznym

II nagroda w konkursie Made with Math

Zalecana: