Attraktore
Juli Attraktor
Grundlagen
Vorab:
Juli Attraktore unterscheiden sich in zwei Eigenschaften von Clifford- und De Jong Attraktoren:
Die Folgenelemente können beliebig groß werden und es gibt nicht vier, sondern sechs Parameter.
Die Methoden der Untersuchung sind dennoch im Wesentlichen gleich. Daher werden die Erkärungen hier etwas knapper ausfallen.
Wer es genauer wissen will, schaut sich die entsprechende Stelle im Kapitel
Clifford Attraktor an.
Wenn Sie die Iterationen von Juli- und Clifford Attraktoren vergleichen, dann sehen Sie, dass letzterer durch
Varianten von Tangens und Cotangens ergänzt wurden:
xNeu = Math.sin(a*yAlt) + c*Math.cos(a*xAlt) + e*Math.cos(a*xAlt)/(Math.sin(a*xAlt)+f);
yNeu = Math.cos(b*xAlt) + d*Math.sin(b*yAlt) + e*Math.sin(b*yAlt)/(Math.cos(b*yAlt)+f);
xAlt = xNeu; yAlt = yNeu;
Die Parameter a,b,c und d wählt man aus dem Bereich von -2.5 bis +2.5. Parameter
e liegt zwischen
-4 und +4. Parameter
f schließlich bewirkt, geeignet gewählt, dass nicht durch Null geteilt wird. Wir wählen ihn
zwischen 1.00001 und 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 die Klasse
Math verwendet.
Worin unterscheidet sich dieser Attraktor vom Clifford bzw. vom Henon Attraktor?
Um das zu klären, müssen einige Fragen bezüglich der Erzeugung des Attraktors beantwortet werden:
- Spielt der Startpunkt eine wesentliche Rolle?
Welchen Einfluss haben die Parameter a,b,c,d,e und f?
Haben wir es mit einem Fraktal zu tun?
Mit der folgenden Anwendung können Sie dies testen:
(Zu Beginn a = -2.4914286136627197; b = -1.0557746887207031; c = -1.3139233589172363; d = 2.4677958488464355; e = -0.6391472816467285 ; f = 1.6227550506591797 ;)
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,e,f |
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 sechs Starpunkte gewählt.
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.
Das heißt zunächst einmal, dass alle Startpunkte zum Attraktor führen. Frage 1 ist damit beantwortet.
Dies ist für unser weiteres Vorgehen wichtig: Später wird man hunderte von Millionen Punkte berechnet müssen.
Daher sollte man multithreaded arbeiten.
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 oben links sehen.
Wie im Fall des Henon-Attraktors, zoomen Sie auf benachbarte Linie. Diese werden sich bei jeder weiteren
Vergrößerung in mehrere Linien auflösen (Bild oben rechts). 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,d,e und f abhängt. Man bekommt mitunter einzelne
Punkt-Attraktoren und auch geschlossene Linien, die nicht fraktal sind.
Trefferdichte
Will man ästhetische und ansprechende Juli-Attraktor-Bilder, so muss man auch hier
"Dichtebilder" erzeugen. Wir berechnen 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(farbe1[round(farbWert)]),255,...
...brightness(farbe1[round(farbWert)]),alphaWert);
}
farbe1[] ist ein zuvor erzeugter, aus 2048 Farben bestehender Farbverlauf.
Die verwendeten Parameter bei folgendem Bild werden mit ausgegeben:
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.
Die Parameter bei folgendem Bild:
Möchte man etwas kompaktere Farben haben, dann wird man auf den Gedanken kommen, die Transparenz auch bei
hoher Trefferzahl
wegzulassen. Im letzten Kapitel wurde dargelegt, weshalb der Versuch zu keinem guten Ergebnis führen wird.
Weil die Anzahl der Zellen mit einer bestimmten Anzahl von Treffern äußerst ungleichmäßig ist,muss man
die Zuordnung "Anzahl Zellen mit x Treffern" -> "Farbwert" ändern:
MatrixHisto[i][j]=round(hellDunkel* MatrixHisto[i][j]);
if(MatrixHisto[i][j]>2047) MatrixHisto[i][j]=2047;
farbWert = MatrixHisto[i][j];
if(farbWert < oberhalb){
if(hW) f = color(255);
else f = color(0);
}else{
farbWert = MatrixHisto[i][j] % 2048;
f = farbe2[round(farbWert)];
}
Die Verteilung der Trefferanzahlen unterscheidet sich von der Situation beim De Jong Attraktor.
Es gilt lediglich die in zu großer Zahl vorkommenden Zellen mit geringer Trefferzahl zu eliminieren, da
diese in der Darstellung oft als über die Fläche verteilte Einzelpunkte erscheinen.
Mit dem Attribut "oberhalb" kann man festlegen, ab welcher Trefferzahl gewertet werden soll.
Mit einem Farbberlauf color farbe2[] bekommt man dann ein Farbbild, ohne Transparenz verwendet zu haben:
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 winziges 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 auch die Juli Attraktoren auf elegante Weise klassifizieren lassen, indem 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.4558575; b = 0.7660339; c = 0.3623345; d = -1.6772356; e = -2.0669503 ; f = 2.0
Wir wählen 50 verschiedene Startpunkte:
Jeder Startpunkt wurde eine Million mal iteriert. Die danach folgenden 50 Punkte verteilen sich unregelmäßig auf dem
Juli 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!
Ebenfalls ist zu erkennen, dass die Punkte nur auf massiven Linien landen. Wenn man die Punkte erst ab einer höheren
Anzahl von Iterationen einträgt, dann würde der transparente Bereich komplett verschwinden.
Bei den Clifford Attraktoren haben wir verschiedene Fixpunkt-Situationen gezeigt. Wir beschränken uns bei
den Juli Attraktoren
auf ein einziges Beispiel. Es hat einen Fixpunkt und eine Fixpunktmenge mit 5, eine mit 7 Fixpunkten.
Die zugehörigen Parameter sind hier: a = -0.5260968; b = -2.22841; c = 1.2332025; d = 1.2759452; e = -3.1272144 ; f = 2.0;
Türkis: Ein Fixpunk. Wird erreicht,wenn der Startpunkt im blauen Bereich liegt
Blau: Fixpunktmenge aus 5 Fixpunkten. Wird erreicht,wenn der Startpunkt im roten Bereich liegt
Gelb: Fixpunktmenge aus 7 Fixpunkten. Wird erreicht,wenn der Startpunkt im grünen Bereich liegt
Die Helligkeit jedes Farbbereichs misst die Konvergenzgeschwindigkeit.
Auch ohne Vergrößerung erkennt man, dass die Farben und damit die Zuordnungen chaotisch verteilt sind.
Wenn man Treffer erst ab einer hinreichend großen Zahl im Bild einträgt, dann verschwinden die rosa Punkte
in der Mitte immer mehr. Sie ziehen sich sozusagen in die Fixpunkte zurück.
Juli 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:
xNeu =xAlt+delta*(Math.sin(a*yvt) + c*Math.cos(a*xAlt)+ e*Math.cos(a*xAlt)/(Math.sin(a*xAlt)+f));
yNeu =yAlt+delta*(Math.sin(b*xAlt) + d*Math.cos(b*yAlt)+ e*Math.sin(b*yAlt)/(Math.cos(b*yAlt)+f));
xAlt = xNeu; yAlt = yNeu;
Δt wird dort "delta" genannt. Für einen kurzen Test genügt es, die obigen Gleichungen in den
Sketch
Juli Attraktor
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 Pixel derartiger Gebiete 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 P
n zu P
n+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.3309712409973145; b = -1.3098266124725342; c = -1.006160020828247; d = 1.9719009399414062;
e = -0.057103633880615234 ; f = 1.480316162109375 und delta = 1.0 folgendes Bild:
Die Ecke links unten ist (-10,-10) und die rechts oben (10,10).
Wie man sieht, funktioniert diese Methode recht gut. In manchen Gebieten ändert sich wenig,- es gibt aber auch möglicherweise
fraktale Bereiche (Bildmitte). Startpunkte im Bereich einer bestimmten Farbe, landen im gleichen Attraktor.
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
Juli 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'.
Das obige Bild wurde erzeugt, in dem man die Parameter
übernimmt und wie im Abschnitt
Trefferdichte und ein Dichtebild zeichnen lässt.
Dazu muss man lediglich die Iterationsgleichungen
in
Juli Attraktor anpassen. Vergleichen Sie
die beiden Bilder! Jeder Attraktor oben (weiß) hat seine Entsprechung im Dichtebild.
Ändern wir nun delta von oben 1.0 zu 0.9. Alle anderen Paramter bleiben gleich:
Also auch hier: Startpunkt und der Wert für delta bestimmt das Aussehen eines lokalen Attraktors.
Interessant wird die Sache, wenn man für den Parameter im Nenner
f = 0 wählt. Dann ist der
Folgenwert nicht mehr definiert, wenn Sinus bzw. Cosinus Null ist. In der Praxis wird bei Verwendung von double-Attributen
der Nenner jedoch nie genau Null. Dennoch ist es sinnvoll, bei Folgenwerten über einer gewissen Grenze, abzubrechen
und dort beispielsweise die Farbe weiß zuzuordnen:
Auf den waagrechten und senkrechten Linien befinden sich hier die nicht definierten Folgenelemente.
Auffällig ist, dass sich die Gebiete innerhalb des Definiontsbereiches fundamental unterscheiden. Man
kann erkennen, dass die schwarzen Bereiche einen Fixpunkt besitzen, die einfarbigen jedoch Fixpunktmengen,
bestehend aus zwei oder vier Fixpunkten.
Die chaotischen Bildelemente erinnern stark an die
standard map. Fixpunkte in diesen Bereichen
sind schwer auszumachen, da sie, falls vorhanden, meist in einem anderen Quadrat landen.
Sketch Juli Attraktor Single Thread
Sketch Juli Attraktor Multi Thread
Klassifikation der Juli Attraktoren
Juli Gleichungen als Ableitungen
Beispiel Juli Gleichungen als Ableitungen
Menu