Der Zweck der Herausforderung besteht darin, den Attraktor der logistischen Karte als Funktion seines Parameters r (auch als Bifurkationsdiagramm bezeichnet ) oder eines Teilbereichs davon ungefähr zu zeichnen . Das Aussehen des Graphen ist auf dem folgenden Bild von Wikipedia zu sehen:
Hintergrund
Die logistische Abbildung ist eine mathematische Funktion, die eine Eingabe x k auf eine Ausgabe x k + 1 abbildet, die als definiert ist
x k + 1 = r x k (1 - x k )
Dabei ist r der Parameter der Karte, der im Intervall [0, 4] liegen soll.
Bei gegebenem r in [0,4] und einem Anfangswert x 0 im Intervall [0,1] ist es interessant, die Funktion wiederholt für eine große Anzahl N von Iterationen anzuwenden , wodurch ein Endwert x N erzeugt wird . Beachten Sie, dass x N notwendigerweise auch in [0,1] liegt.
Als Beispiel sei r = 3,2, N = 1000 angenommen. Der Anfangswert x 0 = 0,01 ergibt x 1000 = 0,5130. Für x 0 = 0,02 ist das Ergebnis x 0 = 0,7995. Für alle anderen Anfangswerte x 0 liegen die Endwerte x 1000 extrem nahe an 0,5130 oder 0,7995. Dies ist in der Grafik als die Höhe der beiden Linien bei horizontaler Position r = 3,2 zu sehen.
Dies bedeutet nicht , dass für r = 3,2 jede Sequenz zu einem dieser beiden Werte konvergiert. Tatsächlich sind für die beiden oben betrachteten Anfangswerte die Sequenzen (beachte das oszillierende Verhalten):
x 0 = 0,01, ..., x 1000 = 0,5130, x 1001 = 0,7995, x 1002 = 0,5130, ...
x 0 = 0,02, ..., x 1000 = 0,7995, x 1001 = 0,5130, x 1002 = 0,7995 , ...
Was ist wahr , dass für hinreichend große N , und für fast alle Anfangswerte x 0 , der Begriff x N schließen sein wird, eines der Elemente der Menge {0,5130, 0,7995}. Diese Menge wird der Attraktor für dieses spezifische r genannt .
Bei anderen Werten des Parameters r ändert sich die Größe des Atraktorsatzes oder seiner Elemente. Das Diagramm zeigt die Elemente im Attraktor für jedes r .
Der Attraktor für ein bestimmtes r kann geschätzt werden durch
- Testen eines weiten Bereichs von Anfangswerten x 0 ;
- Entwickeln lassen des Systems für eine große Anzahl N von Iterationen; und
- Kenntnis nehmend von den Endwerte x N , die erhalten werden.
Die Herausforderung
Eingänge
N : Anzahl der Iterationen.
r 1 , r 2 und s . Diese definieren die Menge R von Werten von r , nämlich R = { r 1 , r 1 + s , r 1 + 2 s , ..., r 2 }.
Verfahren
Die Menge X der Anfangswerte x 0 ist fest: X = {0,01, 0,02, ..., 0,99}. Optional können auch 0 und 1 in X enthalten sein .
Für jedes r in R und jedes x 0 in X iteriere die logistische Abbildung N- mal, um x N zu erzeugen . Notiere die erhaltenen Tupel ( r , x N ).
Ausgabe
Zeichnen Sie jedes Tupel ( r , x N ) als Punkt in der Ebene mit r als horizontale Achse und x N als vertikale Achse. Die Ausgabe sollte grafisch sein (keine ASCII-Grafik).
Zusätzliche Regeln
- Die angegebene Prozedur definiert das erforderliche Ergebnis, wird jedoch nicht erzwungen. Es kann jede andere Prozedur verwendet werden, die dieselbe Menge von ( r , x N ) Tupeln enthält.
- Die Eingabe ist wie gewohnt flexibel.
- Gleitkommafehler werden nicht gegen den Antwortenden gehalten.
- Eine Grafikausgabe ist in jedem der akzeptierten Formate erforderlich . Insbesondere kann die Ausgabe auf dem Bildschirm angezeigt werden, oder es kann eine Grafikdatei erzeugt werden, oder es kann ein Array von RGB-Werten ausgegeben werden. Wenn Sie eine Datei oder ein Array ausgeben, veröffentlichen Sie bitte ein Beispiel dafür, wie es bei der Anzeige aussieht.
- Grafiken können Vektoren oder Raster sein. Für Rastergrafiken sollte die Bildgröße mindestens 400 × 400 Pixel betragen.
- Jeder Punkt sollte als einzelnes Pixel oder als Markierung mit einer Größe in der Größenordnung von einem Pixel angezeigt werden (andernfalls wird das Diagramm schnell unübersichtlich).
- Der Achsenbereich sollte für r (horizontale Achse) [0,4] und für x N (vertikale Achse) [0,1] betragen . oder es kann kleiner sein, solange es alle erhaltenen Punkte enthält.
- Achsenskalen sind beliebig. Insbesondere muss der Maßstab nicht für beide Achsen gleich sein.
- Rasterlinien, Achsenbeschriftungen, Farben und ähnliche Elemente sind zulässig, jedoch nicht erforderlich.
- Kürzester Code in Bytes gewinnt.
Testfälle
Klicken Sie auf jedes Bild, um eine hochauflösende Version zu erhalten.
N = 1000; r1 = 2.4; r2 = 4; s = 0.001;
N = 2000; r1 = 3.4; r2 = 3.8; s = 0.0002;
N = 10000; r1 = 3.56; r2 = 3.59; s = 0.00002;
Wissen
Vielen Dank an @FryAmTheEggman und @AndrasDeak für ihre hilfreichen Kommentare, während die Herausforderung im Sandkasten lag.
Antworten:
MATL,
32302827 Bytes4 Bytes gespart dank @Luis
Das Eingabeformat ist
r1
,s
,r2
undN
Probieren Sie es bei MATL Online aus
Erläuterung
quelle
Mathematica, 65 Bytes
Reine Funktion mit den Argumenten N, r1, r2, s in dieser Reihenfolge.
Nest[r#(1-#)&,x,N]
iteriert die logistische Funktionr#(1-#)&
insgesamtN
abx
; hier ist das erste Argument für die Funktion (#
) dasN
fragliche;Point@{r,...}
produziert einePoint
,Graphics
die gerne plotten wird.Table[...,{x,0,1,.01},{r,##2}]
erstellt eine ganze Reihe dieser Punkte, wobei derx
Wert von0
bis1
in Schritten von.01
; Das##2
in{r,##2}
bezeichnet alle ursprünglichen Funktionsargumente, beginnend mit dem zweiten, und{r,##2}
erweitert sich,{r,r1,r2,s}
wodurch der Bereich und das Inkrement für korrekt festgelegt werdenr
.Beispielausgabe für den zweiten Testfall: die Eingabe
ergibt die Grafik unten.
quelle
Mathematica, 65 Bytes
Ich habe einige von Greg Martins Tricks benutzt und dies ist meine Version ohne Grafik
Eingang
Ausgabe
Eingang
Ausgabe
quelle
TI-Basic, 85 Bytes
Ein vollständiges TI-Basic-Programm, das Eingaben in der Reihenfolge vornimmt
r1,r2,s,N
und die Ausgabe dann in Echtzeit auf dem Grafikbildschirm anzeigt. Beachten Sie, dass dies in der Regel unglaublich langsam ist .Hier ist eine unvollständige Beispielausgabe, die nach ca. 2,5 Stunden für die Eingabe generiert wurde
3,4,0.01,100
:quelle
*
Schilder nicht.ProcessingJS,
125123120 BytesVielen Dank an Kritixi Lithos für die Einsparung von 3 Bytes.
Probieren Sie es online! Mit anrufen
f(N, r_1, r_2, s);
quelle
void
mit ,var
weil es die Verarbeitung JSx*=p*(1-x)
kann werdenx*=p-p*x
var f(n,q,r,s){size(4e3,1e3);for(i=0;i<1;i+=.01)for(p=q;x=i,p<=r;point(p*1e3,1e3-x*1e3),p+=s)for(j=0;j<n;j++)x*=p-p*x;}
GEL , 158 Bytes
Es ist vielleicht nicht das kürzeste, aber es zeichnet in Echtzeit, obwohl es mit großen Eingaben unglaublich langsam sein kann. Auf jeden Fall handelt es sich hierbei um eine anonyme Funktion, die Eingaben in das Format entgegennimmt
(N,r1,r2,s)
und das Diagramm in einem neuen Fenster ausgibt. Beachten Sie, dass dies muss mit der GNOME - Version von Genius ausgeführt werden.quelle
R
159147 BytesWelches Produkt die Funktion
plot(NA,...)
Erstellt eine leere Leinwand mit den richtigen Abmessungen.q
ist die Funktion, die die Iteration ausführt. Es nimmt einen Wert vonr
an und führt dannn
Iterationen für alle Startpunkte zwischen0.01
und aus0.99
. Es gibt dann den resultierenden Vektor zurück.Die for-Schleife wendet die Funktion
q
auf die Sequenza
zub
Schritts
. Anstatt die Werte zurückzugeben, werden sie als Punkte zum Plot hinzugefügt. Wenn der Anziehungspunkt ein Wert ist, überlappen sich alle Punkte und werden als ein Punkt angezeigt.cex=.1
ist eine notwendige Ergänzung, um die Punkte so klein wie möglich zu machen.quelle