Bri's worldelectronics, programming and more

english

Fraktale: Mandelbrot- und Juliamenge

This browser does not support canvas.
Realteil Imaginärteil
C start
C end
Iterationstiefe

(Der Bildausschnitt kann mit der Maus ausgewählt werden: linke Maustaste drücken und Rechteck aufziehen, dann Maustaste loslassen.)

Fraktale Online zeichnen

Mandelbrot- und Juliamengen berechnen und zeichnen

Da ihr diese Seite gefunden habt, habt ihr bestimmt schon etwas von Fraktalen, Mandelbrot- und vielleicht auch Juliamengen gehört. Die genauen mathematischen Erklärungen überlasse ich Wikipedia, denn dort ist alles bis ins kleinste Detail beschrieben. Ich möchte hier die praktischen Seiten erklären: wie berechnet und zeichnet man diese Bilder.

Die Formel

Das schöne bei Fraktalen ist, dass die mathematischen Formeln, mit denen diese Bilder gezeichnet werden, oft sehr einfach sind. Das Bild der Mandelbrotmenge, das ihr hier seht, wird mit dieser einfachen Formel berechnet:

      z = z2 + c 

Es ist eine rekursive Formel. Das heißt, man beginnt mit einem Startwert z1 und berechnet in jedem Schritt einen neuen Wert aus dem alten Wert:

      z1 = 0
      z2 = z12 + c
      z3 = z22 + c
      usw. 

Komplexe Zahlen

Ihr werdet euch bestimmt schon Fragen, wie denn aus einer Zahl, die man immer wieder quadriert und wo man noch eine Konstante c dazu addiert, so ein Bild entstehen soll. Die Lösung des Rätsels ist, das wir nicht die normalen reellen Zahlen für die Berechnung verwenden, sondern komplexe Zahlen.

Komplexe Zahlen sind eine Erweiterung der reellen Zahlen. Stellen wir uns mal vor, ihr sollt die Quadratwurzel einer Zahl berechnen. Zum Beispiel:

      √9 = 3 

Das war ja noch einfach und jeder kennt es aus der Schule. Was passiert aber, wenn wir die Wurzel aus einer negativen Zahl ziehen müssen? Zum Beispiel: √−9. Hier kommen die komplexen Zahlen ins Spiel. Man definiert jetzt einfach folgendes:

      i2 = −1
      i = √−1 

Das heißt, irgendeine Zahl i quadriert ist per Definition −1. Mit dieser Definition können wir jetzt die Quadratwurzel aus negativen Zahlen ziehen:

      √−9 = √(−1 ⋅ 9)
          = √−1 ⋅ √9   mit i = √−1
          = i ⋅ √9
          = i ⋅ 3
      √−9 = 3i 

Das Ergebnis ist also 3i. Eine komplexe Zahl besteht nun aus diesem Teil, den man Imaginärteil nennt und einem zweiten Teil, den man Realteil nennt. Allgemein sieht eine komplexe Zahl z also so aus:

      z = Realteil zr + Imaginärteil zii 

Die Rechenregeln sind für komplexe Zahlen die gleichen wie bei reellen Zahlen. Man muss nur im Kopf behalten, dass i2 = −1 ist. Mit komplexen Zahlen ist es zum Beispiel auch möglich, für alle Nullstellen eines Polynoms eine Lösung zu berechnen.

Die Berechnung der Formel z = z2 + c

Wir haben jetzt also gelernt, dass eine komplexe Zahl z aus Real- und Imaginärteil besteht. Nun werden wir das in unsere Formel einsetzen. Die Konstante c in der Formel ist auch eine komplexe Zahl: c = cr + cii.

      z = z2 + c   mit z = zr + zii
      z = (zr + zii)2 + c 
      z = zr2 + 2 ⋅ zr ⋅ zii + (zii)2 + c   mit i2 = −1  
      z = zr2 + 2 ⋅ zr ⋅ zii - zi2 + c 

sortiert nach Real- und Imaginärteil und mit c = cr + cii:

      z = zr2 - zi2 + cr + (2 ⋅ zr ⋅ zi + ci) ⋅ i  

Nach der Trennung des Imaginär- und des Realteils ergeben sich folgende zwei Formeln, eine für den Realteil und eine für den Imaginärteil:

      zr = zr2 - zi2 + cr
      zi = 2 ⋅ zr ⋅ zi + ci 

Berechnungschritte oder Iterationen

Ihr werdet bestimmt schon langsam ungeduldig und wollt nun endlich wissen, wie denn nun dieses Bild entsteht. Bis jetzt haben wir uns nichts als irgendwelche Berechnungen angeschaut. Also wie schon am Anfang gesagt nehmen wir einen Startwert und führen die obigen Berechnungen damit aus und erhalten mit jedem Rechenschritt immer neue Werte. Ein Rechenschritt wird als Iteration bezeichnet. Wir schauen uns dann an, wie sich der Wert verhält. Geht er in Richtung Unendlich oder bleibt er in der Nähe der 0?

Das ergibt ein kleines Problem: wir müssen uns eine Grenze definieren, was für uns unendlich sein soll. Wir legen nun einfach fest, dass wenn der Betrag der komplexen Zahl größer als 3 ist, dass dann unsere Zahl Richtung unendlich strebt. Was ist denn nun der Betrag einer komplexen Zahl?

Betrag komplexe Zahl

Also wenn wir uns den Realteil (grüner Pfeil) einer komplexen Zahl auf die x-Achse in einem Diagramm malen und den Imaginärteil (blauer Pfeil) auf die y-Achse, dann ist der Betrag die Länge der langen Seite (Hypotenuse, roter Pfeil) in dem rechtwinkligen Dreieck, das die beiden Pfeile bilden. Nach dem Satz des Pythagoras ist also der Betrag einer Komplexen Zahl:

      |z| = √(zr2 + zi2) 

Außerdem müssen wir uns eine maximale Anzahl an Iterationen festlegen, denn wir können nicht unendlich lang prüfen, ob der Punkt nicht vielleicht doch noch Richtung Unendlich strebt. Für den Anfang legen wir die maximale Anzahl von Iterationsschritten auf 50 fest.

Die Konstante c

Eine Kleinigkeit fehlt noch zum Bild. Die Konstante c! c ist eine komplexe Zahl mit Real- und Imaginärteil.

Betrag komplexe Zahl

Das Bild vom Betrag der komplexen Zahl deutet es bereits an. Wir stellen den Realteil der komplexen Zahlen auf der x-Achse dar und den Imaginärteil auf der y-Achse. Somit erhalten wir eine komplexe Zahlenebene:

Komplexe Zahlenebene

Um nun das Bild zu zeichnen, variieren wir den Wert der Zahl c in Abhängigkeit davon, welchen Punkt wir auf der komplexen Ebene untersuchen wollen. Der Realteil von c wird von links nach rechts verändert, der Imaginärteil von c von oben nach unten.

Wichtig: wir legen jetzt folgendes fest: Jedes mal, wenn die Zahl z für ein bestimmtes c Richtung unendlich strebt, also der Betrag größer als 3 wird, dann gehört der Punkt nicht zur Mandelbrotmenge und wird mit einer Farbe eingefärbt (im einfachsten Fall weiß). Wenn der Betrag der Zahl z nach 50 Iterationsschritten immer noch nicht größer als 3 geworden ist, dann gehört der Punkt zur Mandelbrotmenge und wird schwarz eingefärbt.

Zusammenfassung

Wir haben jetzt alles zusammen, was wir zum Zeichnen brauchen. Der grobe Ablauf sieht so aus:

Umsetzung in einem Programm

Soweit zur Theorie, jetzt kommt die Praxis. Ich werde jetzt zeigen, wie man das ganze in einem Programm umsetzen kann. Als Programmiersprache verwende ich Javascript, da die Fraktale hier auf dieser Seite auch mit Javascript gezeichnet werden.

Iteration


function Iterate(c_r, c_i, z0_r, z0_i, max_iter)
{
  var iter;
  var z_r = z0_r;
  var z_i = z0_i;
  var z_r_2, z_i_2;
  
  for (iter = 0; iter < max_iter; iter++)
  {
    z_r_2 = z_r * z_r;
    z_i_2 = z_i * z_i;
    
    if (z_r_2 + z_i_2 > 9)
      break;
      
    z_i = 2 * z_r * z_i + c_i;
    z_r = z_r_2 - z_i_2 + c_r;
  }
  
  return iter;
}

Der Startwert: Mandelbrot- oder Juliamenge

Bis jetzt haben wir bei den Iterationen den Startwert immer auf 0 gesetzt. Das muss aber nicht sein. Wenn man den Startwert variiert, dann bekommt man die sogenannten Juliamengen. Probiert es einfach mal aus und seht euch das Ergebnis an.

TODO: Applet

Andere Formeln, zum Beispiel z = z3 + c

Bis jetzt haben wir nur die einfache Formel z = z2 + c betrachtet. Natürlich kann man auch mit jeder anderen Formel ein Fraktal zeichnen. Als Beispiel nehme ich z = z3 + c. Wir müssen wieder die Zahl z = zr + zii einsetzen, ausmultiplizieren und nach Imaginär- und Realteil trennen.

Das ganze ausmultiplizieren kann man sich auch sparen, wenn die Programmiersprache komplexe Zahlen direkt unterstützt oder wenn man eine Bibliothek für komplexe Zahlen für die Berechnungen nutzt. (Man kann sich natürlich die nötigen Berechnungen für komplexe Zahlen auch ziemlich leicht selbst programmieren.) Der einzige Nachteil ist, die Berechnung ist etwas langsamer.

Bri's world© Torsten Brischalle. Design based upon BlueWebTemplates.com