O objetivo do desafio é plotar aproximadamente o atrator do mapa logístico em função de seu parâmetro r (também chamado de diagrama de bifurcação ) ou uma sub-região dele. A aparência do gráfico pode ser vista na seguinte imagem da Wikipedia:
fundo
O mapa logístico é uma função matemática que pega uma entrada x k e mapeia para uma saída x k + 1 definida como
x k + 1 = r x k (1− x k )
onde r é o parâmetro do mapa, assumido como estando no intervalo [0, 4].
Dado r em [0,4], e um valor inicial x 0 , no intervalo [0,1], é interessante para aplicar repetidamente a função para um grande número N de iterações, produzindo um valor final x N . Note que x N também estará necessariamente em [0,1].
Como exemplo, considere r = 3,2, N = 1000. O valor inicial x 0 = 0,01 fornece x 1000 = 0,5130. Para x 0 = 0,02, o resultado é x 0 = 0,7995. Para quaisquer outros valores iniciais x 0, os valores finais x 1000 são extremamente próximos de 0,5130 ou 0,7995. Isso é visto no gráfico como a altura das duas linhas na posição horizontal r = 3,2.
Isso não significa que para r = 3,2 cada sequência converja para um desses dois valores. De fato, para os dois valores iniciais considerados acima, as seqüências são (observe o comportamento 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 , ...
O que é verdade é que, para N suficientemente grande e para quase todos os valores iniciais x 0 , o termo x N estará próximo de um dos elementos do conjunto {0,5130, 0,7995}. Esse conjunto é chamado de atrator para esse r específico .
Para outros valores do parâmetro r, o tamanho do conjunto de atratores, ou seus elementos, será alterado. O gráfico plota os elementos no atrator para cada r .
O atrator para um r específico pode ser estimado por
- testando uma ampla gama de valores iniciais x 0 ;
- deixando o sistema evoluir para um grande número de N de iterações; e
- tomando nota dos valores finais x N que são obtidos.
O desafio
Entradas
N : número de iterações.
r 1 , r 2 e s . Eles definem o conjunto R de valores de r , ou seja, R = { r 1 , r 1 + s , r 1 + 2 s , ..., r 2 }.
Procedimento
O conjunto X dos valores iniciais x 0 é fixo: X = {0,01, 0,02, ..., 0,99}. Opcionalmente, 0 e 1, podem também ser incluídos em X .
Para cada R , em R e cada x 0 em X , iterar a logística mapa N vezes para produzir x N . Registre as tuplas obtidas ( r , x N ).
Saída
Traçar cada tuplo ( r , x N ) como um ponto no plano com R como eixo horizontal e x N como eixo vertical. A saída deve ser gráfica (não arte ASCII).
Regras adicionais
- O procedimento indicado define o resultado necessário, mas não é imposto. Qualquer outro procedimento que processe o mesmo conjunto de tuplas ( r , x N ) pode ser usado.
- A entrada é flexível, como de costume.
- Erros de ponto flutuante não serão mantidos contra o atendedor.
- A saída gráfica é necessária, em qualquer um dos formatos aceitos . Em particular, a saída pode ser exibida na tela ou um arquivo gráfico pode ser produzido ou uma matriz de valores RGB pode ser impressa. Se estiver produzindo um arquivo ou uma matriz, publique um exemplo da aparência quando exibida.
- Os gráficos podem ser vetoriais ou rasterizados. Para gráficos raster, o tamanho da imagem deve ser de pelo menos 400 × 400 pixels.
- Cada ponto deve ser mostrado como um único pixel ou como uma marca com tamanho da ordem de um pixel (caso contrário, o gráfico fica rapidamente confuso).
- A faixa do eixo deve ser [0,4] para r (eixo horizontal) e [0,1] para x N (eixo vertical); ou pode ser menor, desde que inclua todos os pontos obtidos.
- As escalas de eixo são arbitrárias. Em particular, a escala não precisa ser a mesma para os dois eixos.
- Linhas de grade, rótulos de eixos, cores e elementos semelhantes são aceitáveis, mas não são necessários.
- O menor código em bytes vence.
Casos de teste
Clique em cada imagem para obter uma versão de alta resolução.
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;
Reconhecimento
Obrigado a @FryAmTheEggman e @AndrasDeak por seus comentários úteis enquanto o desafio estava na caixa de areia.
Respostas:
MATL,
32302827 bytes4 bytes salvos graças a @Luis
O formato de entrada é
r1
,s
,r2
, eN
Experimente no MATL Online
Explicação
fonte
Mathematica, 65 bytes
Função pura tomando os argumentos N, r1, r2, s nessa ordem.
Nest[r#(1-#)&,x,N]
itera a função logísticar#(1-#)&
um total deN
vezes, começando emx
; aqui o primeiro argumento para a função (#
) é oN
em questão;Point@{r,...}
produz umPoint
queGraphics
terá prazer em traçar.Table[...,{x,0,1,.01},{r,##2}]
cria um monte desses pontos, com ox
valor variando de0
para1
em incrementos de.01
; o##2
in{r,##2}
denota todos os argumentos da função original a partir do segundo e, portanto, se{r,##2}
expande para o{r,r1,r2,s}
qual define corretamente o intervalo e o incremento parar
.Saída de amostra, no segundo caso de teste: a entrada
produz os gráficos abaixo.
fonte
Mathematica, 65 bytes
Usei alguns truques de Greg Martin e esta é a minha versão sem usar gráficos
entrada
saída
entrada
saída
fonte
TI-Básico, 85 bytes
Um programa TI-Basic completo que recebe as entradas na ordem
r1,r2,s,N
e mostra a saída em tempo real na tela do gráfico. Observe que isso tende a ser incrivelmente lento .Aqui está uma amostra de saída incompleta gerada após cerca de 2,5 horas para a entrada
3,4,0.01,100
:fonte
*
sinais.ProcessandoJS,
125123120 bytesObrigado ao Kritixi Lithos por salvar 3 bytes.
Experimente online! Ligue usando
f(N, r_1, r_2, s);
fonte
void
comvar
porque de Processamento JSx*=p*(1-x)
pode se tornarx*=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;}
em 119 bytesGEL , 158 bytes
Pode não ser o mais curto, mas atrai em tempo real, embora possa ser incrivelmente lento com entradas enormes. De qualquer forma, esta é uma função anônima que recebe entrada no formato
(N,r1,r2,s)
e exibe o gráfico em uma nova janela. Observe que isso deve ser executado com a versão GNOME do Genius.fonte
R,
159147 bytesQual produz a função
plot(NA,...)
cria uma tela vazia com as dimensões corretas.q
é a função que faz a iteração. Leva um valor der
e, em seguida, fazn
iterações para todos os pontos de partida entre0.01
e0.99
. Em seguida, retorna o vetor resultante.A for-loop aplica a função
q
para a sequênciaa
parab
o passos
. Em vez de retornar os valores, ele os adiciona como pontos ao gráfico. Se o ponto de atração é um valor, todos os pontos se sobrepõem e são exibidos como um ponto.cex=.1
é uma adição necessária para tornar os pontos o menor possível.fonte