Verdoppelungskaskade


12

Zunächst ein mathematisches Zwischenspiel, kurz und lohnenswert:

Wenn 0 < a < 4, bildet die Logistikfunktion f(x) = ax(1-x) das Intervall [0,1] in sich selbst ab. Dies bedeutet, dass man das Iterationsspiel spielen kann; Wenn beispielsweise a = 2 ist, wird der Anfangswert 0,3 zu 0,42, dann zu 0,4872 usw.

Mit azunehmendem Parameter wird die quadratische Funktion fim folgenden Sinne komplizierter:

  • 0 < a < 1 Alle Anfangswerte werden in Richtung 0 iteriert.
  • 1 < a < 3 0 wird abstoßend, aber es gibt einen neuen festen Punkt (a-1) / a, der alle Iterationen anzieht.
  • 3 < a < 1+sqrt(6) Der neue Fixpunkt wird abstoßend, aber es erscheint ein Zyklus von 2 anziehenden Punkten.
  • 3.44949... < a < 3.54409... Der 2-Zyklus wird abstoßend, aber es erscheint ein Zyklus von 4 anziehenden Punkten.
  • etc.

Feigenbaum stellte fest, dass die Länge dieser Parameterintervalle mit einer Geschwindigkeit abnimmt 4.6692..., die der Feigenbaum-Konstante immer näher kommt . Die wunderbare Entdeckung ist, dass diese Bifurkationssequenz der Periode 2 ein allgemeines Phänomen ist, das von jeder Funktion geteilt wird, die (wie die quadratische Parabel) zunimmt und dann abnimmt. Dies war einer der ersten Berichte über die Universalität des Chaos .

Nun zur Herausforderung! Schreiben Sie den kürzestmöglichen Code, der die Feigenbaum-Konstante mit einer Genauigkeit Ihrer Wahl berechnet . Hier geht es nicht darum, das System zu betrügen, indem Sie eine Zahl codieren, die Sie gegoogelt haben, sondern darum, dass der Computer den Wert tatsächlich findet. Als Referenz ist hier die Konstante mit 30 Stellen:

4.669201609102990671853203821578


5
Ich bin überrascht, dass wir noch keine Herausforderung haben, diese Konstante zu berechnen. Eine nette Idee, die wir verpasst haben. Am nächsten scheint es zu sein, den logistischen Attraktor zu zeichnen . Ich würde vorschlagen, dass der Code einen maximalen Fehler oder eine maximale Anzahl von Stellen berücksichtigt und die Konstante mit dieser Genauigkeit erzeugt (wobei die Maschinengrenzen nach einem gewissen Punkt ignoriert werden). Oder vielleicht, um das Verhältnis zwischen dem i-ten und (i + 1) -ten Verdopplungsintervall zu berechnen, das zur Konstanten konvergieren würde. Der Golfer, der sich für eine Genauigkeit entscheidet, ist zu vage und nicht hartkodierbar.
15.

Ich überlegte genau, wie ich die Herausforderung formulieren sollte. Das Problem ist, dass dies eine notorisch schwierige Sache ist, die genau berechnet werden kann. Daher dachte ich, dass die Leute mehr Spaß daran haben würden, sich auf die Implementierung einer cleveren Methode zu konzentrieren, anstatt diese zusätzliche Ziffer mit Gewalt zu erhalten. Wenn die Leute sich anders fühlen, werde ich die Regeln ändern.
Rodrigo A. Pérez

1
Wonach suchst du als Slick-Methode oder zur Vermeidung von Brute-Force? Beachten Sie, dass für Code-Golf standardmäßig keine Begrenzung der Laufzeit oder des Platzes erforderlich ist. Daher sind Antworten in der Regel sehr ineffizient, wenn sie für kurze Zeiträume optimiert sind. Vielleicht möchten Sie eine Herausforderung für den schnellsten Code oder die eingeschränkte Komplexität erstellen?
Xnor

Antworten:


3

Javascript, 141 138 135 131 Bytes, 8 Stellen

Es ist etwas, was ich denke. Es sollte ziemlich viel verbesserungsfähig sein. Wenn jemand einen Start muss: wie Feigenbaum berechnen . Und wenn Sie lieber wissen möchten, wie es im Code gemacht wird, lesen Sie dies .

Kopieren Sie den folgenden Code und fügen Sie ihn in Ihre Konsole ein. Errechnet 4.6692016 68823243 (also nicht wirklich präzise).

b=1;c=0;e=3.2;for(i=2;i<13;i++){z=b-c;a=b+z/e;j=4;while(j--){x=y=0;k=2**i;while(k--){y=1-2*y*x;x=a-x*x;}a-=x/y}e=z/(a-b);c=b;b=a;e}

b=1;c=0;e=3.2;for(i=2;i<13;i++){z=b-c;a=b+z/e;j=4;while(j--){x=y=0;k=2**i;while(k--){y=1-2*y*x;x=a-x*x;}a-=x/y}e=z/(a-b);c=b;b=a;e}
console.log(e)


2

Python, 127 Bytes

c,b,e=0,1,2
for i in range(2,13):a=b+(b-c)/e;exec(("x=y=0;"+"y,x=1-2*y*x,a-x*x;"*2**i+"a=a-x/y;")*17);d,c,b=(b-c)/(a-b),b,a;e=d

Gutschrift geht für @ThomasW mit seiner Javascriptantwort.

Add print(d)to output 4.669201673141983 . Dauert einige Sekunden, da die langen Zeichenfolgen vor der Ausführung berechnet werden.


1

Kohle , 84 Bytes

A¹βA⁰εA³·²δF…²¦¹³«A⁺β∕⁻βεδαFχ«A⁰ξA⁰ψFX²ι«A⁻¹××ψ²ξψA⁻α×ξξξ»A⁻α∕ξψα»A∕⁻βε⁻αβδAβεAαβ»Iδ

Probieren Sie es online! Link zum ausführlichen Code zur Erklärung.

Verwendet den Algorithmus von hier .

Drucke 4.66920 0975097843 (6 Stellen)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.