Podwajanie kaskady

12

Po pierwsze, matematyczne interludium, krótkie i warte twojej uwagi:

Jeśli 0 < a < 4The funkcja logistyczna f(x) = ax(1-x) odwzorowuje przedziału [0,1] wewnątrz siebie. Oznacza to, że można grać w grę iteracyjną; na przykład, jeśli a = 2, wartość początkowa 0,3 staje się 0,42, następnie 0,4872 itd.

Wraz ze awzrostem parametru funkcja kwadratowa fstaje się bardziej skomplikowana w następującym znaczeniu:

  • 0 < a < 1 wszystkie wartości początkowe iterują w kierunku 0.
  • 1 < a < 3 0 odpycha się, ale jest nowy stały punkt (a-1) / a, który przyciąga wszystkie iteracje.
  • 3 < a < 1+sqrt(6) nowy stały punkt odpycha się, ale pojawia się cykl 2 przyciągających punktów.
  • 3.44949... < a < 3.54409... 2-cykl staje się odpychający, ale pojawia się cykl 4 punktów przyciągania.
  • itp.

Feigenbaum zauważył, że długości tych przedziałów parametrów zmniejszać w tempie, że dostaje coraz bliżej 4.6692..., w stałej Feigenbaum . Cudowne odkrycie polega na tym, że sekwencja rozgałęzienia tego okresu 2 jest ogólnym zjawiskiem wspólnym dla każdej funkcji, która (jak kwadratowa parabola) rośnie, a następnie maleje. Był to jeden z pierwszych raportów na temat powszechności chaosu .

Teraz wyzwanie! Napisz możliwie najkrótszy kod, który oblicza stałą Feigenbaum z wybraną dokładnością. Chodzi o to, nie aby oszukać system kodowania przez szereg że google, ale aby rzeczywiście mieć komputer znaleźć wartość. Dla porównania, tutaj jest stała do 30 cyfr:

4.669201609102990671853203821578

Rodrigo A. Pérez
źródło
5
Dziwi mnie, że nie mamy już wyzwania, aby obliczyć tę stałą, fajny pomysł, który przegapiliśmy. Najbliżej wydaje się nakreślenie atraktora logistycznego . Sugerowałbym, aby kod zawierał maksymalny błąd lub liczbę cyfr i tworzył stałą z dokładnością do tej wartości (ignorując ograniczenia maszyny przekraczające pewien punkt). A może obliczyć ten stosunek między i-tym i (i + 1) st przedziałami podwojenia, które byłyby zbieżne do stałej. Golfista wybierający dokładność jest zbyt niejasny i brak możliwości twardego kodowania jest niewykonalny.
xnor
Ciężko zastanawiałem się, jak sformułować wyzwanie. Problem polega na tym, że jest to niezwykle trudna rzecz do dokładnego obliczenia, więc pomyślałem, że ludzie będą się lepiej bawić, wdrażając zręczną metodę, niż uzyskiwać tę dodatkową cyfrę brutalną siłą. Jeśli ludzie będą się inaczej czuć, zmienię zasady.
Rodrigo A. Pérez
1
Czego szukasz jako zręcznej metody lub unikania brutalnej siły? Zauważ, że domyślnie dla golfów kodowych nie wymagamy żadnych ograniczeń w czasie wykonywania ani przestrzeni, więc odpowiedzi wydają się być bardzo nieefektywne, gdy są zoptymalizowane pod kątem krótkości. Może chcesz stworzyć najszybszy kod lub wyzwanie o ograniczonej złożoności?
xnor

Odpowiedzi:

3

JavaScript, 141 138 135 131 bajtów, 8 cyfr

To chyba coś. Powinno to być nieco poprawialne. Jeśli ktoś potrzebuje początku: jak obliczyć Feigenbaum . A jeśli wolisz wiedzieć, jak to zrobić kodowo, sprawdź to .

Skopiuj wklej następujący kod do konsoli. Oblicza 4,6692016 68823243 (więc nie bardzo dokładnie).

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)

Thomas W.
źródło
2

Python, 127 bajtów

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

Podziękowania dla @ThomasW z jego odpowiedzią na javascript.

Dodaj print(d)do wyniku 4.669201673141983 . Trwa kilka sekund, ponieważ przed wykonaniem obliczane są długie łańcuchy.

Uriel
źródło
1

Węgiel drzewny , 84 bajty

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

Wypróbuj online! Link do pełnego kodu wyjaśniającego.

Używa algorytmu stąd .

Drukuje 4,66920 0975097843 (6 cyfr)

Tylko ASCII
źródło