El propósito del desafío es trazar aproximadamente el atractor del mapa logístico en función de su parámetro r (también llamado diagrama de bifurcación ), o una subregión del mismo. La apariencia del gráfico se puede ver en la siguiente imagen de Wikipedia:
Fondo
El mapa logístico es una función matemática que toma una entrada x k y lo asigna a una salida x k + 1 define como
x k + 1 = r x k (1− x k )
donde r es el parámetro del mapa, se supone que se encuentra en el intervalo [0, 4].
Dada r en [0,4], y un valor inicial x 0 en el intervalo [0,1], es interesante para aplicar repetidamente la función para un número grande N de iteraciones, produciendo un valor final x N . Tenga en cuenta que x N necesariamente estará en [0,1] también.
Como ejemplo, considere r = 3.2, N = 1000. El valor inicial x 0 = 0.01 da x 1000 = 0.5130. Para x 0 = 0.02 el resultado es x 0 = 0.7995. Para cualquier otro valor inicial x 0, los valores finales x 1000 son extremadamente cercanos a 0.5130 o 0.7995. Esto se ve en el gráfico como la altura de las dos líneas en la posición horizontal r = 3.2.
Esto no significa que para r = 3.2 cada secuencia converja a uno de esos dos valores. De hecho, para los dos valores iniciales considerados anteriormente, las secuencias son (tenga en cuenta el comportamiento oscilante):
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 , ...
Lo que es cierto es que para N suficientemente grande , y para casi todos los valores iniciales x 0 , el término x N estará cerca de uno de los elementos del conjunto {0.5130, 0.7995}. Este conjunto se llama atractor para este r específico .
Para otros valores del parámetro r, el tamaño del conjunto de atractor, o sus elementos, cambiará. El gráfico traza los elementos en el atractor para cada r .
El atractor para un r específico se puede estimar por
- probar un amplio rango de valores iniciales x 0 ;
- dejando que el sistema evolucione para un gran número N de iteraciones; y
- tomando nota de los valores finales x N que se obtienen.
El reto
Entradas
N : número de iteraciones.
r 1 , r 2 y s . Estos definen el conjunto R de valores de r , es decir, R = { r 1 , r 1 + s , r 1 + 2 s , ..., r 2 }.
Procedimiento
El conjunto X de valores iniciales x 0 es fijo: X = {0.01, 0.02, ..., 0,99}. Opcionalmente, 0 y 1 también pueden incluirse en X .
Para cada r en R y cada x 0 en X , Iterar los logísticos mapa N veces para producir x N . Registre las tuplas obtenidas ( r , x N ).
Salida
Grafica cada tupla ( r , x N ) como un punto en el plano con r como eje horizontal y x N como eje vertical. La salida debe ser gráfica (no arte ASCII).
Reglas adicionales
- El procedimiento indicado define el resultado requerido, pero no se aplica. Se puede utilizar cualquier otro procedimiento que genere el mismo conjunto de tuplas ( r , x N ).
- La entrada es flexible como de costumbre.
- Los errores de coma flotante no se mantendrán contra el respondedor.
- Se requiere salida gráfica, en cualquiera de los formatos aceptados . En particular, la salida puede mostrarse en la pantalla, o puede producirse un archivo de gráficos, o puede enviarse una matriz de valores RGB. Si genera un archivo o una matriz, publique un ejemplo de cómo se ve cuando se muestra.
- Los gráficos pueden ser vectoriales o de trama. Para gráficos ráster, el tamaño de la imagen debe ser de al menos 400 × 400 píxeles.
- Cada punto debe mostrarse como un solo píxel, o como una marca con un tamaño del orden de un píxel (de lo contrario, el gráfico se abarrotará rápidamente).
- El rango del eje debe ser [0,4] para r (eje horizontal) y [0,1] para x N (eje vertical); o puede ser más pequeño siempre que incluya todos los puntos obtenidos.
- Las escalas del eje son arbitrarias. En particular, la escala no necesita ser la misma para ambos ejes.
- Las líneas de cuadrícula, etiquetas de eje, colores y elementos similares son aceptables, pero no obligatorios.
- El código más corto en bytes gana.
Casos de prueba
Haga clic en cada imagen para obtener una versión de alta resolución.
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;
Reconocimiento
Gracias a @FryAmTheEggman y @AndrasDeak por sus útiles comentarios mientras el desafío estaba en el cajón de arena.
Respuestas:
MATL,
32302827 bytes4 bytes guardados gracias a @Luis
El formato de entrada es
r1
,s
,r2
, yN
Pruébalo en MATL Online
Explicación
fuente
Mathematica, 65 bytes
Función pura tomando los argumentos N, r1, r2, s en ese orden.
Nest[r#(1-#)&,x,N]
itera la función logísticar#(1-#)&
un total deN
veces comenzando enx
; aquí el primer argumento para la función (#
) es elN
en cuestión;Point@{r,...}
produce unPoint
queGraphics
será feliz de trazar.Table[...,{x,0,1,.01},{r,##2}]
crea un montón de estos puntos, con elx
valor que va de0
a1
en incrementos de.01
; el##2
in{r,##2}
denota todos los argumentos de la función original comenzando por el segundo, y se{r,##2}
expande a lo{r,r1,r2,s}
que establece correctamente el rango y el incremento parar
.Salida de muestra, en el segundo caso de prueba: la entrada
produce los gráficos a continuación.
fuente
Mathematica, 65 bytes
Usé algunos de los trucos de Greg Martin y esta es mi versión sin usar gráficos
entrada
salida
entrada
salida
fuente
TI-Basic, 85 bytes
Un programa TI-Basic completo que toma la entrada en el orden
r1,r2,s,N
y luego muestra la salida en tiempo real en la pantalla gráfica. Tenga en cuenta que esto tiende a ser increíblemente lento .Aquí hay una salida de muestra incompleta generada después de aproximadamente 2.5 horas para la entrada
3,4,0.01,100
:fuente
*
señales.Procesamiento JS,
125123120 bytesGracias a Kritixi Lithos por guardar 3 bytes.
Pruébalo en línea! Llamar usando
f(N, r_1, r_2, s);
fuente
void
convar
porque de Procesamiento de JSx*=p*(1-x)
puede llegar a serx*=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;}
119 bytesGEL , 158 bytes
Puede que no sea el más corto, pero se dibuja en tiempo real, aunque puede ser increíblemente lento con grandes entradas. De todos modos, esta es una función anónima que toma la entrada en el formato
(N,r1,r2,s)
y genera la trama en una nueva ventana. Tenga en cuenta que esto debe ejecutarse con la versión GNOME de Genius.fuente
R,
159147 bytesQue produce la función
plot(NA,...)
crea un lienzo vacío que tiene las dimensiones correctas.q
es la función que hace la iteración. Toma un valor der
, y luego realizan
iteraciones para todos los puntos de partida entre0.01
y0.99
. Luego devuelve el vector resultante.El bucle de aplica la función
q
a la secuenciaa
ab
con el pasos
. En lugar de devolver los valores, los agrega como puntos a la gráfica. Si el punto de atracción es un valor, todos los puntos se superpondrían y se mostrarían como un solo punto.cex=.1
es una adición necesaria para hacer que los puntos sean lo más pequeños posible.fuente