Zum Inhalt springen
Startseite » Mandelbrot-Menge berechnen in Excel

Mandelbrot-Menge berechnen in Excel

  • Science

Das Folgende ist nicht als Empfehlung zu verstehen, jede Art von fortgeschrittener Analyse in Excel durchzuführen. Ich war nur neugierig, ob man damit ein Fraktal erzeugen kann (Spoiler: es geht).

Seit einiger Zeit frage ich mich, welche Klassen von numerischen Berechnungen man eigentlich alle mit reinem Excel durchführen kann. Wie sich herausstellt, gibt es einige.

Zweifellos haben alle Data Science Tools, die es gibt, ihre volle Berechtigung. Und natürlich gehen die Möglichkeiten von Python, R oder Julia weit über die von Excel hinaus. Aber darum geht es hier nicht. Man übersieht leicht, dass auch das alte Schlachtross selbst immer mächtiger wird.

Spaß mit Fraktalen

Fraktale waren in den 80er und 90er Jahren sehr populär, als Rechenleistung allgemein verfügbar wurde und viel mehr Menschen als zuvor begannen, sich mit Programmiersprachen und Numerik zu beschäftigen. Heute ist es etwas ruhiger um das Thema geworden. Trotzdem tauchen immer wieder sehr schöne Darstellungen von Fraktalen auf, die sich aber meist auf den ästhetischen Aspekt konzentrieren und nicht auf die Mathematik dahinter.

Es gibt einige Seiten im Internet über Fraktale und Excel, aber soweit ich es gesehen habe, enden diese immer mit der Verwendung von VBA. Genau das möchte ich vermeiden, denn VBA-Skripte sind für mich kein reines Excel. Ich arbeite nach dem Prinzip Wenn es nicht ohne VBA geht, ist Excel nicht das richtige Werkzeug.

Die Mandelbrot-Menge, ganz kurz rekapituliert

Als Beispiel nehmen wir den Urgroßvater aller Fraktale, die Mandelbrot-Menge. Wenn du mehr darüber wissen willst, findest du gute Texte dazu bei Wikipedia (hier auf Englisch und hier auf Deutsch). Im Folgenden setze ich einige Grundkenntnisse über komplexe Zahlen voraus. Du kannst die Erklärungen aber auch überspringen und direkt mit den Dateien experimentieren.

Wir betrachten also die Funktion f(z)=z²+C, die wir iterativ anwenden, d.h. wir erzeugen neue z-Werte durch die Operation zn+1=zn²+C, wobei wir mit z0=0 beginnen. Sowohl z als auch C sind komplexe Zahlen.

Das Diagramm in diesem Artikel zeigt die komplexe Ebene von Werten C. Die entscheidende Frage ist nun, ob die durch die obige Iteration erzeugte Folge zn für einen gegebenen Punkt C konvergiert oder divergiert, d.h. ob ihre Werte moderat bleiben oder ins Unendliche wachsen.

Das Innere des Apfelmännchens ist dann mathematisch gesehen der Konvergenzbereich der oben beschriebenen Folge.

Lambda-Funktionen in Excel

Der Schlüssel zur Umsetzung in Excel liegt in der Verwendung von rekursiven Lambda-Funktionen. Mehr dazu weiter unten.

Beginnen wir zum Aufwärmen mit einigen Hilfsfunktionen. Excel hat keinen komplexen Datentyp. Deshalb müssen wir den Real- und Imaginärteil explizit berechnen. Die Funktionen sind sehr einfach und könnten auch weggelassen werden. Aber sie verbessern die Lesbarkeit des Codes enorm.

Diese Hilfsfunktionen zeigen auch, wie man mit Lambda-Funktionen arbeitet. Definieren wir zunächst den Real- und den Imaginärteil des Quadrats:

ComplexSquareRe
  = LAMBDA(R;I;R*R-I*I)
ComplexSquareIm
  = LAMBDA(R;I;2*R*I)

Wir speichern diese Funktionen in unserer Excel-Tabelle mit dem Namensmanager. Das heißt, der Funktionsname wird als Name und alles inklusive Gleichheitszeichen in die Definition eingetragen. Ein kurzer beschreibender Text ist immer empfehlenswert.

Darauf aufbauend definieren wir die einzelnen Iterationsschritte, ebenfalls unterteilt in Real- und Imaginärteil. Hier wirst du feststellen, dass jeweils eine Komponente der Zahl C in den Funktionen nicht benötigt wird, was man auch wegoptimieren könnte. Auch dies habe ich der Übersichtlichkeit halber weggelassen.

IterStepRe
  = LAMBDA(R;I;CR;CI;
           ComplexSquareRe(R;I)+CR)
IterStepIm
  = LAMBDA(R;I;CR;CI;
           ComplexSquareIm(R;I)+CI)

Schließlich benötigen wir den Absolutwert einer komplexen Zahl, weil wir ihn verwenden wollen, um zu entscheiden, ob eine Reihe konvergiert. Wenn der Absolutwert einen bestimmten Grenzwert überschreitet, gehen wir davon aus, dass die Reihe divergiert.

AbsValue
  = LAMBDA(R;I;WURZEL(R*R+I*I))

Auch hier gibt es Optimierungspotential, wenn wir versuchen, die Effizienz auf die Spitze zu treiben. Die Wurzeloperation (WURZEL in meiner deutschen Einstellung) ist numerisch relativ aufwendig und kann leicht vermieden werden. Vergleiche einfach den Ausdruck unter der Wurzel mit dem Quadrat der Grenze. Dann braucht man keine Wurzel mehr, und das Quadrat der Grenze muss nur einmal berechnet werden.

Rekursive Lambda-Funktionen

Ein paar Überlegungen

Die entscheidende rekursive Funktion ruft sich selbst auf (daher der Name rekursiv). Dabei sind einige Dinge zu beachten:

  • Der Name, unter dem die Funktion im Namensmanager gespeichert ist, muss mit dem Namen übereinstimmen, unter dem die Funktion selbst aufgerufen wird.
  • Die Funktion sollte so gestaltet sein, dass sie ein sicheres Abbruchkriterium enthält – wir werden sehen, wie dies in unserem Beispiel umgesetzt wurde.
Mandel
  = LAMBDA(R;I;CR;CI;n;
    LET(
      nnew; n+1;
      Rnew; IterStepRe(R;I;CR;CI);
      Inew; IterStepIm(R;I;CR;CI);
      Absnew; AbsValue(Rnew;INew);
      WENN(
        ODER(nnew>=MaxIter;
             Absnew>=UpperLimit);
        nnew;
        Mandel(Rnew;Inew;CR;CI;nnew)
      )
    )
  )

Die Sprache scheint keine Rolle zu spielen. Excel hat aus irgendeinem Grund einige Befehle, die sich je nach verwendeter Sprache unterscheiden. Dieses Beispiel wurde in Deutsch geschrieben. Wenn du auf Englisch programmierst, musst du ODER durch OR und WENN durch IF ersetzen:

...
IF(
  OR(nnew>=MaxIter;
     Absnew>=UpperLimit);
...

Die Beispieldateien scheinen sich jedoch an das verwendete Sprachschema anzupassen, einschließlich des Inhalts des Namensmanagers. Es sollte also kein Problem sein, die Beispiele in jeder Sprachversion ohne weitere Anpassungen zu verwenden. Sollte dies dennoch zu Problemen führen, bitte ich um einen Hinweis.

Wie Fraktale in Excel wirklich berechnet werden

Wir geben unserer Funktion fünf Argumente. Die ersten beiden sind der Real- und der Imaginärteil von z. Wir initialisieren sie mit z0=0, wie oben erklärt, wenn wir die Funktion aufrufen. Das dritte und vierte Argument sind der Real- und der Imaginärteil der Zahl C. Das fünfte Argument, n, ist ein Zähler, der die Iterationstiefe überwacht. Wir initialisieren ihn ebenfalls mit 0.

Der Funktionskörper selbst ist durch eine LET-Funktion klar strukturiert. Zuerst wird der Iterationszähler inkrementiert, dann werden Real- und Imaginärteil des neuen Wertes berechnet und schließlich der Absolutwert, um über die Konvergenz entscheiden zu können.

Jetzt kommt der entscheidende Schritt. Das IF-Kriterium entscheidet, ob wir die Iteration beenden oder eine weitere Runde durchführen.

Dazu benötigen wir zwei zusätzliche Parameter, die wir als benannte Zellen im Arbeitsblatt gespeichert haben.

  • MaxIter ist die maximale Iterationstiefe. Wenn dieser Wert erreicht ist, kann mit einiger Sicherheit davon ausgegangen werden, dass die Reihe nicht divergiert, da die Berechnung bis zu diesem Punkt fortgeschritten ist.
  • UpperLimit ist der absolute Grenzwert, der überschritten werden muss, damit wir annehmen, dass die Reihe divergiert. In den Beispieldateien liegt er bei 10.000, was oft schon nach wenigen Iterationen erreicht wird.

In beiden Fällen bricht die Funktion ab und gibt die Iterationstiefe nnew zurück. Tritt keiner der beiden Fälle ein, wird die Iteration mit den neuen Werten fortgesetzt.

Mandelbrotmenge, geexcelt.

Die grafische Darstellung ist also ein Höhendiagramm, das die erreichte Iterationstiefe auf der Ebene von C darstellt. Im Inneren des Apfelmännchens ist MaxIter erreicht, d.h. hier haben wir gemäß unserer Konvention Konvergenz. Außerhalb des Apfelmännchens sind verschiedene Grade der Divergenz farblich gekennzeichnet. Du kannst die Farbkodierung und die Iterationstiefe in der Datei anpassen, um das Aussehen der Darstellung zu ändern.

Und jetzt viel Spaß beim Experimentieren. Hier kannst du Beispieldateien herunterladen.

Die Beispieldateien

Die Dateien enthalten die beschriebenen Funktionen und eine einfache Logik, die eine C-Ebene (mit einstellbaren Maxima und Minima) definiert, in der die Mandel-Funktion in jeder Zelle aufgerufen wird. Schließlich wird ein Graph mit den Funktionswerten erstellt.

DateiBeschreibung
MandelbrotFrac100.xlsxBerechnung auf einem 100×100-Raster. Eigentlich 101. Schnell, aber die Grafik ist recht grob.
MandelbrotFrac255.xlsxBerechnung auf einem 255×255-Gitter. Das ist das Maximum, das der verwendete Diagrammtyp in Excel zulässt. Trotzdem immer noch sehr schnell.

Bitte beachte, dass ich keine Garantie für Codebeispiele, einschließlich der bereitgestellten Dateien, übernehme. Das Bild der Mandelbrotmenge ist Eigentum des Autors.