Attraktore

Clifford Attraktor

Grundlagen

Diese äußerst interessanten Attraktore hat der geniale Clifford Pickover entdeckt. Die Iteration erfolgt mit dieser Formel:

xNeu = Math.sin(a*yAlt)+c*Math.cos(a*xAlt);
yNeu = Math.sin(b*xAlt)+d*Math.cos(b*yAlt);
xAlt = xNeu; yAlt = yNeu;
Die Parameter a,b,c und d wählt man aus dem Bereich von -2 bis +2; Da auch hier möglicherweise mehrere Millionen Mal iteriert werden muss, sollte man mit double-Attributen arbeiten. Dies ist auch bei der Sinus- und Cosinusfunktion möglich, sofern man mit der Klasse Math arbeitet.
Im ersten Moment kann man, außer der Verwendung trigometrischer Funktionen, keinen großen Unterschied zum Henon Attraktor erkennen. Ist das tatsächlich so?
Um das zu klären, müssen einige Fragen bezüglich der Erzeugung des Attraktors beantwortet werden:
Mit der folgenden Anwendung können Sie dies testen:
(Zu Beginn a = -1.4; b = 1.6; c = 1.0; d = 0.7;)




Tasten- oder Klickaktion Wirkung
Taste n Anzahl der Folgepunkte verdoppeln
Taste h Hintergrund s/w umschalten
Taste p Umschalten Zoomen/Startpunkt
Taste z Zufällige Parameter a,b,c,d
Taste s Neustart
Klick ins Bild hier Zoomen/Startpunkt setzen


Drückt man die Taste p, so bewirkt ein Klick ins Bild die Wahl des Startpunktes an dieser Stelle. (Drückt man erneut auf p, kommt man wieder in den Zoom-Modus.)
Im Bild links wurden fünf Starpunkte gewählt (der rote Startpunkt ist "im" Attraktor oben rechts!).
Bei jedem neuen Startpunkt wurde die Farbe gewechselt. Wir erkennen an den verschiedenen Farben, dass alle Folgepunkte im "wolkigen" Attraktor liegen, - aber öfters andere Stellen dort besetzen. Dies ist für unser weiteres Vorgehen wichtig. Da später hunderte von Millionen Punkte berechnet werden sollen, kann man multithreaded arbeiten, in dem man jedem Core mit einem anderen Startpunkt beschäftigt.

Um zufällige Parameter zu wählen, verwendet man die Taste z. Wundern Sie sich nicht, wenn Sie oftmals nur einzelne Punkte sehen.



Klicken Sie so lange auf Taste z, bis Sie einen Attraktor ähnlich wie im Bild links sehen. Wie im Fall des Henon-Attraktors, zoomen Sie auf eine einzelne Linie. Diese wird sich bei jeder weiteren Vergrößerung in mehrere Linien auflösen. Gegebenenfalls mehrfach mit Taste n die Anzahl der Punkte erhöhen!
Damit sind die Fragen 2 und 3 beantwortet: Ein derartiger Attraktor ist bei der Wahl bestimmter Parameter ein Fraktal. Außerdem haben wir festgestellt, dass die Art des Attraktors massiv von der Wahl der Parameter a,b,c und d abhängt. Man bekommt einzelne Punkt-Attraktoren und auch geschlossene Linien, die nicht fraktal sind.
Im Bild links unten besteht der Attraktor aus einem Punkt, rechts daneben aus einer 1-dimensionalen geschlossenen Kurve.



Trefferdichte

Sucht man im Internet nach "Clifford Attractor" bekommt man zumeist sehr ästhetische und äußerst ansprechende Bilder zu sehen. Diese können unmöglich in der oben beschriebenen Weise erzeugt worden sein. Es handelt sich dabei um sogenannte "Dichtebilder", also die Anzahl der Treffer auf einem Pixel. Die Idee ist simpel: Nehmen wir an, wir möchte ein Bild mit 1600 x 1600 Pixeln erzeugen. Dann benötigen wir einen 2-dimensionalen Array:

int[ ][ ] Matrix;
cols = width;
rows = height;
Matrix = new int[cols][rows];

Jedem Pixel entspricht also ein Integer-Wert des Arrays und umgekehrt. Haben wir beispielsweise 8 Core zur freien Verfügung, dann ist jeder Thread für 200 x 1600 Startwerte zuständig. Da die ersten Werte meist nicht auch schon im Attraktor liegen, beachten wir die ersten zum Beispiel 10 Iterationsergebnisse nicht ("Leerlauf"). Außerdem werden die Werte, die nicht im Bildbereich liegen, weggelassen. Das Attribut m = 256 gibt an, wieviele Folgepunkte ab dem 10. Iterationsschritt noch zu berechnen sind. Natürlich muss man diesen Wert im Sketch veränden können. Er bestimmt ja die Gesamtzahl der Punkte und somit auch die Punktdichte. Mit den oben angegebenen Werten werden ca. 82 Millionen Punkte erzeugt. Bei einem Bild der Größe 1600x1600 sind das im Schnitt 32 Treffer pro Zelle. Um die Unterschiede in der Trefferzahl sichtbar zu machen, muss außer der Farbe auch noch die Transparenz einbezogen werden.
Jeder Thread bekommt einen eigenen Teil des Bildes zugewiesen, aus dem er zufällig die Anfangspunkte wählt. Vergessen Sie nicht, falls Sie die herunterladbaren Sketche verwenden, die Anzahl der Threads anzupassen. Hat man beispielsweise 8 Cores (virtuelle werden mitgezählt), dann sollte man die Anzahl auf 6 einstellen. Sind alle Threads fertig, addiert man alle Trefferergebnisse im Array MatrixHisto. Je nach Anzahl der restlichen Iterationen, bekommt man dann einen in bestimmten Bereichen gut "gefüllten" Array. In einem konkreten Fall gab es bei 2,56 Millionen Zellen beispielsweise 520000 Zellen, die nur einen Treffer hatten. 13 Zellen hingegen hatten 250 Treffer. Diese Spannweite gilt es mit geeigneter Farbgebung sichtbar zu machen. Man verwendet also die Dichte der Treffer für die Farbgebung. Wir erzeugen dazu einen Farbverlauf mit 2048 Stufen. Eine mögliche Einfärbung des Pixel kann dann so ausssehen:
MatrixHisto[i][j]=round(4*hellDunkel* MatrixHisto[i][j]);
if(MatrixHisto[i][j] >2047){
MatrixHisto[i][j] = 2047;
if(hW && MatrixHisto[i][j]==0)f = color(255);
if(!hW && MatrixHisto[i][j]==0)f = color(0);
else{
    farbWert =MatrixHisto[i][j];
    alphaWert=alphaFaktor*MatrixHisto[i][j];
        if(alphaWert>255) alphaWert =255;
    f=color(hue(farbe[round(farbWert)]),255,...
   ...brightness(farbe[round(farbWert)]),alphaWert);
}
Für das folgende Bild wurden die Parameter a = 1.7, b = 1.7, c = 0.6, d = 1.2 gewählt. Die Anzahl der Startpunkte pro Thread waren n = 40000. Iterationstiefe für jeden Startpunkt war m = 256 und der "Dunkelfaktor 0.25.

Für ein schwarz-weiß Bild verwenden wir folgenden äußerst simplen Algorithmus:
if(MatrixHisto[i][j] > 245) MatrixHisto[i][j] = 245;
grauWert = 255 - MatrixHisto[i][j] ;
f = color(0,0,grauWert);
Höhere Trefferzahlen als 245 werden auf 245 gesetzt. Dies erspart uns die Verwendung von Transparenz.
Hier waren die Parameter a = -1.2030973, b = 1.7360396, c = -1.3117653 und d = -1.343715. Die Anzahl der Startpunkte pro Thread ist n = 160000. Der Rest wie oben.


Möchte man etwas kompaktere Farben haben, dann wird man auf den Gedanken kommen, die Transparenz auch bei hoher Trefferzahl wegzulassen. Das Ergebnis ist enttäuschend. Und das liegt daran:

Auf der x-Achse sind die Anzahl der Treffer in einer Zelle aufgetragen und auf der y-Achse die Anzahl der Zellen mit der entsprechenden Trefferanzahl. Für die Zuordnung Trefferzahl -> Farbe ist diese Verteilung suboptimal. Dies kann man, wie man oben gesehen hat, durch die Verwendung von Transparenz einigermaßen ausgleichen. Ohne Transparenz hilft folgendes: Man verwendet als Zuordnung nicht die Trefferzahl sondern
farbWert =(210*log(MatrixHisto[i][j]));
so bekommt man angenähert eine Gerade. Mit einem Farbberlauf color farbe2[] hat man dann
f = farbe2[round(farbWert)];
Die zugehörigen Parameter für das so erzeuge Bild sind hier:: a = -1.5603, b = -1.7791, c = 0.5469 und d = 1.8430;
Die übrigen Parameter wurden wie oben gewählt.


Klassifikation mit Hilfe von Fixpunkten

Auf der Suche nach ästhetischen Dichtebildern staunt man einigermaßen, wie sehr sich die Ergebnisse durch eine neue Wahl von Parametern ändern. Ergebnisse wie die Dichtebilder oben sind eher selten anzutreffen. Mitunter sieht man schlicht gar nichts, weil nur ein einzelnes Pixel angezeigt wird. Das liegt dann daran, dass es nur Fixpunkte gibt. Wenn man Folgepunkte erst ab zum Beispiel n = 100 eintragen lässt, dann befinden sie sich möglicherweise so nah an den Fixpunkten, dass der Abstand aller weiteren Folgenelemente zu den Fixpunkten weniger als einem Pixel entspricht.
Wir werden sehen, dass sich die Clifford Attraktoren auf elegante Weise klassifizieren lassen, wenn man die Anzahl und Art der Fixpunkte bestimmt. Dazu verwenden wir einen einfachen Trick: Es werden eine Anzahl zufälliger Startpunkt erzeugt, deren Folgepunkte aber erst ab n = 1000000 im Bild eingetragen. Das Ergebnis zeigt dann sofort, ob Fixpunkte vorliegen oder nicht. Und das wollen wir uns nun etwas genauer ansehen. (Es empfiehlt sich auch hier, mit doppelter Genauigkeit zu rechnen.)

Gegeben: a = 1.4307165 ;b = -1.7855427 ;c = 1.3840983 ;d = -0.40422416; Wir begnügen uns hier mit nur einem Startpunkt (unten, blau):

Der Startpunkt wurde eine Million mal iteriert. Die danach folgenden 200 Punkte verteilen sich unregelmäßig auf dem Clifford Attraktor (Dichtebild). Da sich nach einer Million Iterationen noch immer keine Punktanhäufungen an einer oder mehreren Stellen zeigen, dürfen wir annehmen: Es gibt hier keine Fixpunkte!

Es gibt, wie wir sehen werden, nicht nur Fixpunkte, sondern auch sogenannte "Fixpunktmengen". Worin besteht der Unterschied? Einfach ausgedrückt liegt dann eine Fixpunktmenge vor, wenn zum Beispiel die ungeraden Folgenelemente zum einen Punkt streben und die geraden zum anderen. Dann bestünde die Fixpunktmenge aus zwei Punkten. Entscheidend ist, dass die Menge dieser speziellen Fixpunkte endlich ist. Und was genau ist ein Fixpunkt einer Folge?
"P ist ein Fixpunkt einer Folge, wenn für jede noch so kleine Umgebung von P alle Folgenelemente ab einer bestimmten Nummer innerhalb dieser Umgebung liegen."
Wir werden sehen, dass ein Clifford Attraktor mehrere Fixpunkte und mehrere Fixpunktmengen enthalten kann. Darüber hinaus kann er auch zusätzlich eine unendliche Punktemenge ohne Fixpunkte besitzen.

Betrachten wir zunächst ein Beispiel mit genau einem Fixpunkte:
Die zugehörigen Parameter sind hier: a = 1.0983169 ;b = 2.1036682 ;c = 0.9298053 ;d = -0.5148897;



Der kleine orange grüne Punkt ist der Startpunkt. Der größer gezeichnete Fixpunkt wurde mit point(x,y) und strokeWeight(10) der besseren Sichtbarkeit wegen eingetragen. Machen Sie sich aber klar, dass alle 2000 Folgepunkte nach einer Million Iterationen auf nur ein Pixel treffen würden. Das rosafarbene Dichtebild wäre dann nicht mehr zu sehen.
Die in verschiedenen Blautönen gezeichneten Pixel wurden nach der Anzahl der Iterationen, die man benötigt, um vom betreffenden Startpunkt näher als ein zehnmillionstel an den Fixpunkt heranzukommen. Auch wenn es auf den ersten Blick so aussieht, dass dabei ein Fraktal ensteht, zeigt eine starke Vergrößerung, dass dem nicht so ist.

Das folgende Beispiel zeigt den Fall ein Fixpunkt und eine Fixpunktmenge aus neun Elementen.
Die zugehörigen Parameter sind hier: a = 0.8464165; b = -1.177206; c = -1.9538873; d = -0.5927634;


Im Gegensatz zu oben gibt es hier einen roten und einen blauen Bereich. Startpunkte im roten Bereich landen beim Fixpunkt. Solche im blauen Bereich in der Fixpunktmenge. Auch hier entsteht durch die farbliche Zuordnung, wie die Vergrößerung zeigt,vermutlich kein Fraktal. Allerdings kann man selbst bei 16 000-facher Vergrößerung keine klare Trennung zwischen dem roten und dem blauen Bereich finden. Daher das Wort "vermutlich".

Eine ganz außergewöhnliche Situation bekommt man bei diesen Paramtern:
a = -1.9968241 ;b = -2.293939 ; c = 0.36133742 ;d = -0.37688112;
Wir haben hier einen Fixpunkt (grün), eine Fixpunktmenge aus zwei FPs (blau) und eine aus vier FPs (hellblau) bestehend. Zusätzlich gibt es eine unendliche Punktemenge ohne Fixpunkte (lila). Von daher gibt es vier Farbbereiche, je nach dem, wo der Startpunkt landet. Weiß erhält keine Abstufung, da man ohne Fixpunkte keinen Abstand berechnen kann.
Vergrößert man hinreichend, dann erkennt man, dass die Farben und damit die Zuordnungen chaotisch verteilt sind.



Bei a = 1.1065235 ;b = 1.8883085 ;c = 1.5869684 ;d = 2.4945722; bekommt man tatsächlich eine Fixpunktmenge bestehend aus 40 Fixpunkten! Hier ein Zoom in das Ergebnis:



Aber es geht noch besser! Mit a = -1.5734456; b = 2.2270818; c = -1.7885008; d = 0.7539799; erhält man eine Fixpunktmenge, die aus 1032 Elementen besteht!
Alle Sketche zu diesem Thema können Sie unten heruntladen. Die Klassifizierung findet sich im Namen des Sketch wieder: CA_FPwFPMxFPMyUz ist ein Clifford Attraktor mit w Fixpunkten, Fixpunktmengen bestehend aus x und y Elementen und z unendlichen Punktmengen ohne Fixpunkte oder Fixpunktmengen.

Clifford Gleichungen als partielle Ableitungen interpretiert

Bisher wurde jeder neue Punkt allein mit Hilfe des vorherigen Punktes bestimmt. Um einen neuen Attraktor zu bekommen, musste mindestens einer der vier Parameter a,b,c oder d geändert werden.
Nun soll ein System beschrieben werden, das erlaubt, den nächsten Punkt näherungsweise aus dem vorherigen Punkt und aus der Ableitung an diesem Punkt zu berechnen. Dazu verwenden wir die Euler-Methode:

Normalerweise bemüht man sich um ein sehr kleines Δt . Interessanter wird es in unserem Fall, wenn man Δt etwas größer wählt, denn dann ähneln die Gleichungen den Gleichungen bei erzwungenen Schwingungen. Wie wir wissen, kann man dort chaotisches Verhalten erwarten. Und so sehen die partiellen Gleichungen nun aus:

double xNeu =xAlt+delta*(Math.sin(a*yAlt)+c*Math.cos(a*xAlt));
double yNeu =yAlt+delta*(Math.sin(b*xAlt)+d*Math.cos(b*yAlt));
Δt wird dort "delta" genannt. Für einen kurzen Test genügt es, die obigen Gleichungen in den Sketch Sketch Clifford Attraktor Multi Thread dieses Kapitels einzusetzen. Variieren Sie Δt zwischen 0.1 und 1.7. Entscheidend ist dabei eine Erkenntis: Die Attraktoren sind vom Startpunkt abhängig!
Etliche Fraktale werden durch die "Konvergenzgeschwindigkeit" eines Startpunktes erzeugt. Allen voran die Mandelbrotmenge. Divergenz in dem Sinn, dass die Punkte bei Anwendung der obigen Gleichungen gegen Unendlich streben, könne wir allerdings nicht erwarten. Andererseits wird es nur in einem Fall Konvergenz geben: Genau dann, wenn ein oder mehrere einzelne Fixpunkte existieren. Die zugehörigen Pixel werden schwarz gefärbt. Diese muss man aber nicht, wie oben, mühsam zuerst bestimmen. Es reicht uns, wenn zwei aufeinander folgende Punkte einen Abstand kleiner als zum Beispiel ein Millionstel besitzen. Ein Beweis für Konvergenz ist das freilich nicht. Denken Sie sich eine Fixpunktmenge bestehend aus zwei Punkten, die besagten Abstand haben. Dennoch dürfte es in den meisten Fällen korrekt sein.
Als Startpunkte verwenden wir die den Pixeln entsprechenden Punkte. Was aber soll mit "Fixpunktmengen" und "ausgedehnten unendlichen Punktmengen" geschehen? Wie soll man prüfen, wohin sich eine Punktfolge bewegt? (Für deren Definition lesen sie den obigen Abschnitt "Klassifikation...").
Es gilt also einen Unterschied zu finden, der sich beim Gang zu verschiedenen Fixpunktmengen ergibt. Da ist zunächst der zurückgelegten Gesamtweg und zum anderen der gesamte Winkel. Bei jeder Interation kann man einen Winkel dadurch bestimmen, dass man den Winkel der Strecke von Punkt Pn zu Pn+1 zur x-Achse misst. Da es auch negative Winkel gibt, muss man die Winkelsumme größenmäßig durch einen geeigneten Faktor an die Gesamtlänge anpassen. Die so entstandene Zahl wird einer Farbe zugeordnet. Diese Methode liefert für die Parameter:
a = 2.2364812, b = -0.76892674, c = -0.14085174, d = 1.9444833 und delta = 1.5   folgendes Bild:


Die Ecke links unten ist (-20,-20) und die rechts oben (20,20). Wie man sieht, funktioniert diese Methode recht gut. In manchen Gebieten ändert sich wenig,- es gibt aber auch ganz offensichtlich fraktale Bereiche, wie man an der Vergrößerung des gelben Quadrats im nachfolgenden Bild sehen kann. Die dicken (point(11)) farbigen Punkte entstanden durch Zeichnung von 50000 Folgepunkte nach einer Million Iterationen. Einzelne Punkte in der schwarzen Mitte sind offensichtlich Fixpunkte. Die anderen farbigen Punkte gehören zu Fixpunktmengen verschiedener Anzahl. Die weißen Gebilde sind ausgedehnte unendliche Mengen, wie wir sie für die Dichtezeichnung der Attraktoren schon verwendet haben.
Um die Korrektheit der Farbgebung zu kontrollieren, wählen Sie eigene Startpunkte. Hierfür laden Sie den Sketch Clifford Gleichungen als Ableitungen runter. Nach dem Start erscheint nach einiger Zeit ein Bild. Den Startpunkt wählen Sie durch einen Rechtsklick an der gewünschten Stelle. Will man lediglich die Punkte ab der 1000000-ten Iteration sehen, so klickt man zuvor auf die Taste 'X'.


Die im vorletzten Bild mit einem roten Pfeil gekennzeichnete ausgedehnte unendliche Menge schauen wir uns im folgenden Bild genauer an.


Links delta = 1.4 , rechts delta = 1.5. Man bekommt, wie bereits angedeutet, für identische Paramter verschiedene Attraktoren, sobald man delta ändert. Das nutzen wir, um wie im Abschnitt Trefferdichte ästhetischere Clifford-Attraktorenbilder zu erzeugen. Dabei sind nur wenige Änderungen im Sketch Clifford Attraktor Multi Thread nötig: Das Zentrum ist nicht der Ursprung, sondern der ungefähre Mittelpunkt des zu zeichenden Attraktors. Und natürlich müssen die Iterationsgleichungen angepasst werden. In den folgenden Bildern gelten immer noch die gleichen Parameter. Großes Bild: delta = 1.64.


Kleine Bilder von links oben nach rechts unten: delta = 1.0, delta = 1.4, delta = 1.5 und delta = 1.62.


Den bereits für diese Situation angepassten Sketch "Clifford Gleichungen Multi Thread als Ableitungen" können Sie unten runterladen.



Sketch Clifford Attraktor Single Thread

Sketch Clifford Attraktor Multi Thread

Klassifikation der Clifford Attraktoren

Clifford Gleichungen als Ableitungen

Clifford Gleichungen Multi Thread als Ableitungen

Menu