Grafik 2

Exkurs: Komplexe Zahlen

Um Fraktale berechnen zu können benötigen wir komplexe Zahlen. Im Gegensatz zu reellen Zahlen, die man sich auf einem Zahlenstrahl angeordnet vorstellen kann, liegen die komplexen Zahlen in einer Ebene, der sogenannten Gaussschen Zahlenebene. Die Hochachse stellt dabei den imaginären, die Rechtsachse den reellen Zahlenanteil dar. In Delphi erzeugt man komplexe Zahlen mit der Funktion VarComplexCreate. Zusätzlich muss die Unit VarCmplx in der Uses-Klausel angegeben werden. Die komplexe Zahl a wird dann mit VarComplexCreate(reeller Teil, komplexer Teil) erzeugt. Auf die Bestandteile greift man dann mittels a.real und a.imaginary zu. Die Grundrechenarten handhabt Delphi wie gewohnt mit *, /, +, -.

Betrachte folgendes Beispiel (Hinweis: Die Unit "varcmplx" muss unter Uses angegeben sein.):

procedure TForm1.Button1Click(Sender: TObject);
var a,b,c: Variant;
begin
a := VarComplexCreate(0,1);
b := VarComplexCreate(0,1);
{das ist jeweils die imaginäre Zahl, die der Wurzel aus -1 entspricht}
c := a*b;
edit1.Text:= FloatToStr(c.Real);
{
entsprechend der Imaginärteil mit:
edit1.Text := FloatToStr(c.imaginary);
}
end;

Aufgaben Implementiere das Beispielprogramm und untersuche anhand einiger Beispiele die Ergebnisse der Rechenoperationen. Betrachte besonders das Quadrat von rein imaginären Zahlen.

Julia- und Mandelbrotmengen

Da wir lediglich Mandelbrot bzw. Juliamengen oder sogenannten Apfelmännchen grafisch darstellen wollen, begnügen wir uns hier mit dieser sehr oberflächlichen Kenntnis der komplexen Zahlen. Hier geht es um die Frage, was mit den Werten einer Funktion passiert, wenn man sie wiederholt anwendet. Nehmen wir die Funktion
        f: f(x) = x*x +c

1: x1 = x0 * x0 + c
2: x2 = x1 * x1 + c
3: x3 = x2 * x2 + c
usw.

Es stellt sich nun heraus, dass bei komplexen Zahlen in Äbhängigkeit vom Startpunkt x0 und der Konstanten c die Werte sehr schnell wachsen oder innerhalb bestimmter Schranken bleiben oder gegen Null gehen (Hinweis: Die komplexen Variablen haben in Delphi noch die Eigenschaft "Radius", die ihre "absolute" Größe darstellt). Stellt man dies unterschiedliche Verhalten für jede komplexe Konstante c mit Startpunkt x0= 0 mit unterschiedlichen Farben dar, so haben wir die grafische Veranschaulichung der Mandelbrotmenge.

Aufgabe: Schreibe ein Programm, das innerhalb der imaginären und reellen Grenzen von 0 bis +-2,5 und bei 10 Iterationen die Mandelbrotmenge darstellt. Werte größer 1 sollen blau, kleiner 1 grün dargestellt werden. Beachte, dass sehr große Werte das Programm zum Absturz bringen können und berücksichtige dies entsprechend.

 

 

Differenzierte Darstellung

Unten ist die Skizze einer Lösung zu sehen.

Aufgabe 1 Ergänze das Programm durch weitere Farben.

 

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c: variant;
i,n,iteration,x,y : integer;
farbe : Tcolor;

begin
for i := -250 to 250 do
for n := -250 to 250 do
  begin
     c := VarComplexCreate(i/100,n/100);
     a := VarComplexCreate(0,0);
     iteration:=1;
        while (iteration <=20) and (a.radius < 10000) do
            begin
            a := a*a + c;
            inc(iteration);
            end;
     x:= integer(c.real*100+250);
     y:= integer(250-c.imaginary*100);
     if a.radius > 0.9 then farbe := clBlue else farbe := ClGreen;
     canvas.Pixels[x,y]:= farbe;
  end;
end;

 



Aufgabe 2 Läßt man die Konstante c invariant und variiert den Startwert z0 so erhält man die Juliamenge. Schreibe das Programm so um, dass die Juliamenge gezeichnet wird. Dabei reicht es zu differenzieren zwischen "geht gegen 0" und "geht über alle Grenzen".