Cascada de duplicación

12

Primero, un interludio matemático, breve y que vale la pena:

Si 0 < a < 4, la función logística f(x) = ax(1-x) mapea el intervalo [0,1] dentro de sí misma. Esto significa que uno puede jugar el juego de iteración; por ejemplo, si a = 2, el valor inicial 0.3 se convierte en 0.42, luego 0.4872, etc.

A medida que aaumenta el parámetro , la función cuadrática se fvuelve más complicada en el siguiente sentido:

  • 0 < a < 1 Todos los valores iniciales iteran hacia 0.
  • 1 < a < 3 0 se vuelve repelente, pero hay un nuevo punto fijo (a-1) / a que atrae todas las iteraciones.
  • 3 < a < 1+sqrt(6) el nuevo punto fijo se vuelve repelente, pero aparece un ciclo de 2 puntos de atracción.
  • 3.44949... < a < 3.54409... el ciclo 2 se vuelve repelente, pero aparece un ciclo de 4 puntos de atracción.
  • etc.

Feigenbaum notó que las longitudes de estos intervalos de parámetros disminuyen a un ritmo cada vez más cercano a 4.6692...la constante de Feigenbaum . El maravilloso descubrimiento es que esta secuencia de bifurcación del período 2 es un fenómeno general compartido por cualquier función que (como la parábola cuadrática) aumenta y luego disminuye. Este fue uno de los primeros informes sobre la universalidad del caos .

¡Ahora para el desafío! Escriba el código más corto posible que calcule la constante de Feigenbaum con la precisión que elija. El punto aquí no es engañar al sistema codificando un número que buscó en Google, sino que la computadora realmente encuentre el valor. Como referencia, aquí está la constante de 30 dígitos:

4.669201609102990671853203821578

Rodrigo A. Pérez
fuente
55
Me sorprende que aún no tengamos un desafío para calcular esta constante, una buena idea que nos hemos perdido. Lo más cercano parece ser trazar el atractivo logístico . Sugeriría que el código tome un error máximo o un número de dígitos y produzca la constante dentro de esa precisión (ignorando los límites de la máquina más allá de algún punto). O tal vez para calcular esa relación entre los intervalos de duplicación i'th e (i + 1) st, como convergería a la constante. El golfista que elige una precisión es demasiado vago y no es difícil hacer una codificación rígida.
xnor
Pensé mucho en cómo formular el desafío. El problema es que esto es muy difícil de calcular con precisión, así que pensé que la gente se divertiría más enfocándose en implementar un método hábil, en lugar de obtener ese dígito adicional por la fuerza bruta. Si la gente se siente diferente, cambiaré las reglas.
Rodrigo A. Pérez
1
¿Qué buscas como método hábil o para evitar la fuerza bruta? Tenga en cuenta que, por defecto, para los campos de golf de código no requerimos límites en el tiempo de ejecución o el espacio, por lo que las respuestas tienden a ser muy ineficientes cuando se optimizan por ser cortas. ¿Quizás estás buscando hacer un código más rápido o un desafío de complejidad restringida?
xnor

Respuestas:

3

Javascript, 141 138 135 131 bytes, 8 dígitos

Es algo que supongo. Debería ser bastante mejorable. Si alguien necesita un comienzo: cómo calcular Feigenbaum . Y si prefieres saber cómo hacerlo en términos de código, mira esto .

Copia y pega el siguiente código en tu consola. Calcula 4.6692016 68823243 (por lo que no es realmente preciso).

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
fuente
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

El crédito va para @ThomasW con su respuesta de JavaScript.

Añadir print(d)a la salida 4.669201673141983 . Toma unos segundos, debido a las largas cadenas que se calculan antes de la ejecución.

Uriel
fuente
1

Carbón , 84 bytes

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

Pruébalo en línea! Enlace al código detallado para explicación.

Utiliza el algoritmo de aquí .

Imprime 4.66920 0975097843 (6 dígitos)

Solo ASCII
fuente