Inhaltsverzeichnis:

Mandelbrot und Julia Sets auf ESP32 – Gunook
Mandelbrot und Julia Sets auf ESP32 – Gunook

Video: Mandelbrot und Julia Sets auf ESP32 – Gunook

Video: Mandelbrot und Julia Sets auf ESP32 – Gunook
Video: µ-Spec MkII: Коэффициент отражения цветовых образцов - Спектроскоп UVA-NIR (AS7265x) 2024, Juli
Anonim
Image
Image
Mandelbrot- und Julia-Mengen auf ESP32
Mandelbrot- und Julia-Mengen auf ESP32
Mandelbrot- und Julia-Mengen auf ESP32
Mandelbrot- und Julia-Mengen auf ESP32

Sie kennen sicherlich Fraktale, von denen das bekannteste die Mandelbrot-Menge ist.

Hier ist ein Programm zum Spielen auf ESP32. Ich habe mich für den ESP32 entschieden, weil ich denke, dass er die Berechnungen schneller durchführt als ein Standard-Arduino (höhere Taktfrequenz: 240 MHz): etwa eine bis eineinhalb Sekunden für Berechnung und Anzeige.

Der Code wird auf einem 480 x 320 TFT-Touchscreen angezeigt. Es berechnet Mandelbrot- und Julia-Mengen für mehrere Parameterwerte und ermöglicht es Ihnen, interessante Bereiche zu vergrößern, um den fraktalen Aspekt zu sehen (d. h. das Vorhandensein derselben Strukturen bei jeder Skalierungsänderung). Die Zoomstufe ist aufgrund der begrenzten Genauigkeit der Berechnungen begrenzt, aber ein halbes Dutzend Zooms können durchgeführt werden, bevor das Bild verschlechtert wird.

Machen Sie sich bereit, die magische Welt der Fraktale zu erkunden…

Schritt 1: Was sind Mandelbrot- und Julia-Mengen?

Was sind Mandelbrot- und Julia-Mengen?
Was sind Mandelbrot- und Julia-Mengen?
Was sind Mandelbrot- und Julia-Mengen?
Was sind Mandelbrot- und Julia-Mengen?
Was sind Mandelbrot- und Julia-Mengen?
Was sind Mandelbrot- und Julia-Mengen?

Die Mandelbrot-Menge ist nach Benoit Mandelbrot (1924-2010) benannt, einem französischen und amerikanischen Mathematiker, der Pionierarbeit in der fraktalen Geometrie leistete, die Ende des 19. Jahrhunderts unter anderem von Peano, Sierpinski und Julia initiiert wurde.

Was sind fraktale Objekte?

Die Unregelmäßigkeiten der Natur, die chaotisch erscheinen mögen, wie die Linie der Meeresküste, die Form von Wolken, ein Baum, sind in der Tat der Ausdruck einer sehr komplexen Geometrie in wechselnden Maßstäben. In diesem Zusammenhang ersetzt der Begriff der gebrochenen Dimension den der üblichen euklidischen Dimension (die immer eine ganze Zahl ist)!

Ein fraktales Objekt ist so, dass jeder Teil davon mit dem Ganzen identisch ist (dies wird als Selbstähnlichkeit bezeichnet): seine Struktur ist bei Skalenänderungen invariant.

Der Begriff "Fraktal" ist ein Neologismus, der 1974 von Benoît Mandelbrot aus der lateinischen Wurzel fractus geschaffen wurde, was "kaputt", "unregelmäßig" bedeutet. Es ist sowohl ein Nomen als auch ein Adjektiv. Viele Naturphänomene - wie die Umrisse der Küstenlinien oder das Auftreten von Romanesco-Kohl (siehe Bild) - haben ungefähre fraktale Formen.

Benoît Mandelbrot hatte einen etwas untypischen Werdegang: Nach seiner Lehrtätigkeit an der Universität Lille (Frankreich) nahm er eine Stelle bei IBM an, wo er schnell IBM Fellow wurde, was ihm große Freiheiten für sein wissenschaftliches Studium verschaffte. In den frühen 1980er Jahren, nachdem er IBM verlassen hatte, wurde er Professor in Harvard, ließ sich jedoch dauerhaft in Yale nieder.

Seine Arbeit in den 1960er und frühen 1970er Jahren führte ihn zur Veröffentlichung eines berühmten Artikels mit dem Titel "Fractal Objects", in dem er zeigte, dass diese Objekte, die von einem großen Teil der mathematischen Gemeinschaft als bloße Kuriositäten angesehen wurden, überall in der Natur vorkommen. Er gab viele Beispiele in einer Vielzahl von Bereichen wie Physik, Hydrologie, Finanzen, Meteorologie, Geographie, Geologie, Metallurgie….

Was ist die Mandelbrot-Menge?

Nehmen wir zunächst an, dass es sich um eine schöne Zeichnung handelt, die von einem Programm generiert wurde. Und dieses Programm ist ziemlich einfach. Es gibt viele computergenerierte Zeichnungen und viele Computerprogramme, um sie zu erstellen. Was also ist an diesem so besonders? Erstens ist die Mandelbrot-Menge eine Teilmenge des Plans, eine Sammlung von Punkten. Es enthält Bereiche, aber auch glatte Kurven, Filamente, Punkte, von denen mehrere Zweige ausgehen, und andere Dinge. Zweitens: Es ist wirklich faszinierend und hat eine sehr interessante Geschichte.

Zu Beginn des 20. Jahrhunderts entwickelten die französischen Mathematiker Pierre Fatou und Gaston Julia eine Unterdomäne der Mathematik namens holomorphe Dynamik. Sie interessierten sich für bestimmte Funktionen, die auf Zahlen einwirkten und einige der einfachsten verfügbaren Formeln verwendeten. Die fraglichen Zahlen sind komplexe Zahlen, Größen, die durch zwei Koordinaten dargestellt werden (genau wie die Punkte einer Ebene), die als Real- und Imaginärteile bezeichnet werden. Sie wurden im 16. Jahrhundert von Mathematikern erfunden, um die Wurzeln von Polynomen und die Lösung von Gleichungen zu finden, haben aber in Mathematik und Physik weitreichende und tiefgreifende Anwendungen gefunden. Wir können 2 komplexe Zahlen addieren, multiplizieren oder dividieren und viele andere Dinge tun. Fatou und Julia haben die Eigenschaften bestimmter dynamischer Systeme untersucht, in denen eine komplexe Zahl nach einer einfachen Regel variiert, die immer wieder wiederholt wird: Hier ist keine komplizierte Mathematik erforderlich (das erste Bild kannst du also vergessen…). Sie enthüllten den Reichtum dieser Systeme, definierten die Mengen, die heute Julias Mengen genannt werden, und studierten ihre Selbstähnlichkeit, also fraktalen Aspekt… aber das Wort existierte damals noch nicht, weil es erst viel später erfunden wurde, von… Benoît Mandelbrot!

Nach dem Wirken der Gründer geriet diese Domäne in Vergessenheit. Als die Computer auf den Markt kamen, halfen sie dabei, viele mathematische Phänomene zu erforschen, die eine intensive Computerarbeit erforderten, einschließlich der von Julia und Fatou eröffneten Domäne, erhielt er eine sehr attraktive und sehr faszinierende Zeichnung (erstes Bild des vorherigen Abschnitts).

Was repräsentiert die Mandelbrot-Menge? Grundsätzlich ist jedem Punkt des Bildes ein zugrundeliegendes dynamisches System zugeordnet. Als einstellbarer Parameter dienen die Koordinaten des Punktes. Verschiedene Punkte entsprechen unterschiedlichen Gruppen von Julia und abhängig von ihrem Verhalten können wir entscheiden, den Punkt auf eine bestimmte Weise zu färben. Die Mandelbrot-Menge ist die Menge von Parametern, für die das System eine bestimmte Eigenschaft hat.

Wie berechnet man Mandelbrot- und Julia-Mengen?

Wir müssen etwas genauer darauf eingehen, wie diese Mengen berechnet werden. Mandelbrot- und Julia-Mengen werden durch die wiederholte Iteration einer einfachen Formel berechnet, in unserem Fall z^n+c. z ist eine komplexe Zahl, die die Koordinaten eines Punkts auf der Anzeige darstellt. ist ein ganzzahliger Exponent, also ist z^n gleich z n-mal mit sich selbst multipliziert, und c ist eine Konstante.

Für die Mandelbrot-Menge initialisieren wir für alle Punkte im Anzeigebereich z mit 0. Die Konstante c wird gleich dem Wert der Koordinaten des betrachteten Punktes genommen und die Formel wird iteriert.

Hier gilt die Regel: Ein Punkt gehört zur Menge, wenn die wiederholte Anwendung dieser Formel nicht divergiert (d. h. nicht zu großen Zahlen führt). Es kann mathematisch gezeigt werden, dass die Iteration divergiert, wenn das Ergebnis der Formel 2 überschreitet (im Modul, da wir über komplexe Zahlen sprechen). Um schnell schöne Farben zu erhalten, stoppen wir die Iteration, wenn der Modul des Ergebnisses 2 überschreitet und die Farbe der Nummer dieser bestimmten Iteration entspricht. Wenn die Anzahl der Iterationen zu groß wird (also wenn der Punkt Teil der Mandelbrot-Menge ist), stoppen wir nach einem bestimmten Schwellenwert und ordnen diesem Punkt die schwarze Farbe zu.

Die Julia-Menge wird auf ähnliche Weise berechnet, aber die Berechnungen werden nicht mit 0 initialisiert, sondern mit dem Wert der Koordinaten des betrachteten Punktes und die Konstante c wird vom Benutzer gewählt und bleibt für das gesamte Bild gleich.

Das war's, ich hoffe es ist klar… Diese Erklärungen helfen, die restliche Gebrauchsanweisung besser zu verstehen.

Schritt 2: Was brauchen Sie?

Was brauchst du?
Was brauchst du?
Was brauchst du?
Was brauchst du?
Was brauchst du?
Was brauchst du?
Was brauchst du?
Was brauchst du?

Stückliste:

  • 1 ESP32-Karte
  • 1 TFT-Display mit Touchscreen und Eingabestift
  • 1 Steckbrett und Drähte

Das ist es. Gesamtkosten unter 10 USD.

ESP32 von Espressif ist ein Dual-Core-Mikrocontroller mit 240 MHz, was ihn zu einem guten Kandidaten für schnelles und komplexes repetitives Rechnen macht. Es hat WiFi- und Bluetooth-Kapazitäten, die ich in diesem Projekt nicht verwende.

Der Befehlssatz ist 32 Bit groß. Die Berechnung mit 16- und 32-Bit-Variablen ist sehr schnell, was genaue Berechnungen ermöglicht, die für Zoomzwecke von grundlegender Bedeutung sind. Bei dieser Anwendung besteht für eine 320 x 240-Anzeige ein Bild grob aus 75.000 Pixeln, von denen jedes unter Verwendung eines iterativen Prozesses berechnet wird, der bis zu 100 Mal durchlaufen kann. Dies kann zu 7.500.000 unitären Berechnungen führen, von denen jede eine Potenzierung ist, d.h. mehrere Multiplikationen…

Die Rechengeschwindigkeit ist hier also unerlässlich, aber die Genauigkeit ist von grundlegender Bedeutung. Je weiter Sie zoomen, desto kleiner ist der anzuzeigende Teil des Satzes. Dies bedeutet, dass jedes der 320 x 240 Pixel des Bildes eine Zahl darstellt, die seinen Nachbarn sehr nahe kommt. Mit zunehmendem Zoom nimmt diese Nähe zu.

Aber fraktale Bilder haben die Eigenschaft, dass sie durch die Skalierung unverändert bleiben. So erscheinen überall und für jeden Skalierungsfaktor kleine Details. Die Hauptform der Mandelbrot-Menge, wie sie auf der Anzeige auf dem obigen Bild zu sehen ist, ist an anderer Stelle in einer viel kleineren Version zu finden und wird angezeigt, wenn Sie nah genug heranzoomen (siehe Video). Aber wenn die Koordinatendifferenz zwischen zwei benachbarten Pixeln zu klein ist, um es dem ESP32 zu ermöglichen, ihren Verhaltensunterschied zu erfassen, kann der fraktale Effekt aufgrund mangelnder Genauigkeit nicht gezeigt werden…

Um eine gute Genauigkeit zu erzielen, verwendet der Code Floats, die vom ESP32 in 32 Bit codiert werden. Dies ermöglicht bis zu 6 oder 7 Zoomstufen. Die Verwendung von doppelter Genauigkeit (64 Bit) hätte diese Zoomtiefe auf Kosten langsamerer Berechnungen und somit längerer Zeiten zwischen 2 Bildern erhöht.

Um eine doppelte Genauigkeit zu erreichen, ändern Sie einfach alle Vorkommen von "float" in "double" im Code und führen Sie den Code aus. Ich habe vor kurzem eine Version für ein größeres Display erstellt (HVGA 480 x 320 Pixel): 16 Bit Floats brauchen 3 Sekunden, um das Bild anzuzeigen, und Doubles brauchen zwischen 10 und 20 Sekunden (3 bis 6 mal länger), unterstützen aber mehr als 15 Zoomstufen. Das dritte Bild in diesem Kapitel zeigt die Zoomstufe 14 ganz rechts in der Mandelbrot-Menge.

So schließen Sie das Display an:

Ich habe eine SPI-Anzeige verwendet und die Parameter werden in der Datei User_Setup.h (im TFT_eSPI-Bibliotheksordner) festgelegt:

  • Treiber: Entkommentieren Sie den richtigen Treiber für Ihr Display. Meins war #define RPI_ILI9486_DRIVER
  • PIN-Nummern: Gehen Sie zum ESP32-Abschnitt der Datei und wählen Sie

    • #define TFT_MISO 19
    • #define TFT_MOSI 23
    • #define TFT_SCLK 18
    • #define TFT_CS 15 // Chipauswahl-Steuerstift
    • #define TFT_DC 2 // Data Command Steuerpin
    • #define TFT_RST 4 // Reset-Pin (könnte mit RST-Pin verbinden)
    • #define TOUCH_CS 22 // Chipauswahl-Pin (T_CS) des Touchscreens
  • Schriftarten: keine Notwendigkeit, sie zu ändern
  • Andere Optionen: Ich habe folgendes ausgewählt

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

Alle anderen Zeilen der Datei sind auskommentiert.

Kalibrieren Sie die Berührungskapazität des Displays

Wenn die Auswahl eines Bildschirmteils oder einer Schaltfläche nicht genau oder sogar völlig falsch ist, führen Sie die Touch-Kalibrierungsskizze aus der TFT_eSPI-Bibliothek aus und kopieren / fügen Sie das bereitgestellte Array in den Code ein (achten Sie darauf, den richtigen Wert für die Anzeigeausrichtung zu verwenden, 1 oder 3 für Querformat).

Schritt 3: ESP32-Programm

ESP32-Programm
ESP32-Programm
ESP32-Programm
ESP32-Programm
ESP32-Programm
ESP32-Programm

Der Code wird auf einem 320 x 240 TFT-Touchscreen angezeigt und verwendet die TFT_eSPI-Bibliothek. Es berechnet Mandelbrot- und Julia-Mengen für mehrere Exponentenwerte und ermöglicht es Ihnen, interessante Bereiche zu vergrößern, um den fraktalen Aspekt zu sehen (d. h. das Vorhandensein derselben Strukturen bei jeder Skalierungsänderung).

Der angehängte Code ist eine Version für 480 x 320 Anzeige. In dieser Version können Sie die Größe (Breite und Höhe in Pixel) des Displays ändern. Die TFT_eSPI-Bibliothek definiert die Verbindungen in einer Setup-Datei (angehängt), die im Verzeichnis der Bibliothek abgelegt werden muss.

Der Code beginnt mit der Anzeige der Bedienungsanleitung (siehe Bild und Video)

Der größte Teil des Bildschirms ist für die Anzeige von Bildern reserviert, Touch-Buttons sind auf der rechten Seite des Bildschirms verfügbar:

  • R: führt einen "Reset" durch, d.h. e. zeigt das Bild im maximalen Maßstab an,
  • U: Mit "Rückgängig" können Sie zum vorherigen Schritt zurückkehren (wenn der gezoomte Bereich nicht interessant ist, können Sie einen anderen Teil des Bildes zum Vergrößern auswählen),
  • M oder J: ermöglicht das Umschalten von Mandelbrots Menge zu Julias Menge und umgekehrt.

Die Beschriftung einiger Tasten ändert sich je nach Kontext: Sie zeigen die Funktion an, die ausgeführt wird, wenn sie gedrückt wird. Wenn Sie also derzeit die Mandelbrot-Menge anzeigen, zeigt die M/J-Taste J an, da Sie, wenn Sie sie drücken, Julias Menge anzeigen (und umgekehrt).

Gleiches gilt für die Wahl der Farbpalette. Wir beginnen mit der grünen Palette. Die Taste schlägt die nächste Palette (die blaue) vor. Die Paletten sind: Rot, Grün, Blau, Grau, Palette 1, Palette 2 und zurück zu Rot. Die letzten beiden sind mehrfarbige Palettentests, die mehr Kontrast bieten und es ermöglichen, einige Details besser zu sehen.

Die Taste mit einer Zahl ermöglicht es Ihnen, den Exponenten n in einer Schleife von 2 bis 7 (und zurück zu 2) zu wählen. Im gleichen Sinne zeigt es 3 an, wenn Sie derzeit bei 2 sind…

Schließlich muss bei der Anzeige der Julia-Menge der Wert der Konstanten c gewählt werden: Die C-Taste ermöglicht dies dank eines Selektors (siehe zweites Bild). Der Wert dieser Konstanten wird mit dem Satz angezeigt.

Durch Klicken auf das Bild wird um den ausgewählten Punkt gezoomt. Am berührten Punkt wird ein kleiner Kreis angezeigt und ein Rechteck hebt den gezoomten Bereich des Sets hervor.

Das 3. Bild zeigt, dass die Rechenzeiten bei 320 x 240 Pixeln zwischen 0,8 und 1,2 Sekunden bleiben, was das Zoomen und Anzeigen angenehm macht. Es erreicht 3 Sekunden für 480 x 320 Pixel, liefert aber mehr Details.

Schritt 4: Einige Bilder erklärt…

Einige Bilder erklärt…
Einige Bilder erklärt…
Einige Bilder erklärt…
Einige Bilder erklärt…
Einige Bilder erklärt…
Einige Bilder erklärt…

Das größte Bild ist die bekannte Mandelbrot-Menge. Die in diesem Bild verwendeten komplexen Zahlen reichen von -2,1 bis +0,7 auf der Abszisse und von -1,2 bis 1,2 auf der Ordinate. Wenn Sie in den linken Teil dieses ersten Bildes zoomen, erhalten Sie wahrscheinlich endlich das zweite Bild, das eine kleinere Version des Originalsatzes zeigt, der sich ganz links im Satz befindet. Für diese beiden Bilder ist der Exponent ('n') gleich 2: Dies ist der Wert, der normalerweise verwendet wird, um Mandelbrot-Mengen anzuzeigen.

Wenn Sie diesen Wert auf 3 ändern (klicken Sie einfach auf die Taste mit der Aufschrift 3), erhalten Sie das dritte Bild. Ein offensichtlicher Unterschied ist der Symmetriefaktor: n=2 ergibt eine axiale Symmetrie (dh die Menge ist symmetrisch zur mittleren horizontalen Achse), aber bei n=3 wird das Bild durch Drehung um 120° invariant (ein Drittel von 360°, Drehung Symmetriefaktor von 3). Und es behält seine fraktalen Eigenschaften bei, die Sie überprüfen können, indem Sie an den Rändern der schwarzen Form zoomen.

Das vierte Bild ist ein Julia-Satz, der nach Auswahl eines Koeffizientenwertes von 0,414 auf der Abszisse und 0,09 auf der Ordinate erhalten wurde. Die rote Palette wird gewählt, wie an der grünen Taste rechts zu sehen ist (grün, die nächste zu wählende Farbe). Das fünfte Bild zeigt die gleiche Art von Julia-Menge, die einen höheren Imaginärteil der Konstanten (0,358) darstellt.

Ich wünsche Ihnen viel Spaß beim Spielen mit diesem Programm und dass Sie schöne Fraktalbilder anzeigen können. Zögern Sie nicht, die Mandelbrot- und Julia-Mengen zu erkunden und mit den Paletten zu spielen: Sie helfen dabei, einige Details zu identifizieren, die mit den einfachen monochromen möglicherweise nicht sichtbar sind. Vielleicht entdecken Sie sogar fraktale Landschaften, die noch nie jemand vor Ihnen gesehen hat…

_

Möchten Sie mehr Fraktalbilder entdecken? Klicken Sie einfach hier oder erkunden Sie die Fraktalkunst oder sogar das ASCII-Fraktal. Vielleicht wird dieses instructable Sie dazu bringen, so tolle Bilder zu erstellen …

Made with Math Contest
Made with Math Contest
Made with Math Contest
Made with Math Contest

Zweiter Preis beim Made with Math Contest

Empfohlen: