Le défi a pour objectif de tracer approximativement l' attracteur de la carte logistique en fonction de son paramètre r (également appelé diagramme de bifurcation ), ou d'une sous-région de celui-ci. L'aspect du graphique peut être vu dans l'image suivante de Wikipedia:
Contexte
La carte logistique est une fonction mathématique qui prend une entrée x k et la met en correspondance avec une sortie x k + 1 définie comme
x k + 1 = r x k (1− x k )
où r est le paramètre de la carte, supposé se situer dans l'intervalle [0, 4].
Compte tenu de r dans [0,4], et une valeur initiale x 0 dans l'intervalle [0,1], il est intéressant d' appliquer de façon répétée la fonction d'un grand nombre N d'itérations, en produisant une valeur finale x N . Notez que x N se situera nécessairement aussi dans [0,1].
À titre d'exemple, considérons r = 3,2, N = 1000. La valeur initiale x 0 = 0,01 donne x 1000 = 0,5130. Pour x 0 = 0,02, le résultat est x 0 = 0,7995. Pour toute autre valeur initiale x 0, les valeurs finales x 1000 sont extrêmement proches de 0,5130 ou 0,7995. Ceci est vu dans le graphique comme la hauteur des deux lignes à la position horizontale r = 3,2.
Cela ne signifie pas que pour r = 3,2, chaque séquence converge vers l'une de ces deux valeurs. En fait, pour les deux valeurs initiales considérées ci-dessus, les séquences sont (notez le comportement oscillant):
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 , ...
Ce qui est vrai, c'est que pour N suffisamment grand , et pour presque toutes les valeurs initiales x 0 , le terme x N sera proche de l'un des éléments de l'ensemble {0.5130, 0.7995}. Cet ensemble est appelé l' attracteur pour ce r spécifique .
Pour les autres valeurs du paramètre r, la taille de l'ensemble d'attracteurs ou de ses éléments changera. Le graphique trace les éléments de l'attracteur pour chaque r .
L'attracteur pour un r spécifique peut être estimé par
- tester une large gamme de valeurs initiales x 0 ;
- laisser le système évoluer pour un grand nombre N d'itérations; et
- prendre note des valeurs finales x N obtenues.
Le défi
Contributions
N : nombre d'itérations.
r 1 , r 2 et s . Celles-ci définissent l'ensemble R des valeurs de r , à savoir R = { r 1 , r 1 + s , r 1 + 2 s , ..., r 2 }.
Procédure
L'ensemble X des valeurs initiales x 0 est fixe: X = {0,01, 0,02, ..., 0,99}. En option, 0 et 1 peuvent également être inclus dans X .
Pour chaque r dans R et chaque x 0 dans X , Itérer la carte logistique N fois pour produire x N . Enregistrez les tuples obtenus ( r , x N ).
Production
Tracez chaque tuple ( r , x N ) comme un point dans le plan avec r comme axe horizontal et x N comme axe vertical. La sortie doit être graphique (pas art ASCII).
Règles supplémentaires
- La procédure indiquée définit le résultat requis, mais n'est pas appliquée. Toute autre procédure qui procède au même ensemble de ( r , x N ) tuples peut être utilisée.
- L'entrée est flexible comme d'habitude.
- Les erreurs en virgule flottante ne seront pas retenues contre le répondeur.
- Une sortie graphique est requise, dans tous les formats acceptés . En particulier, la sortie peut être affichée à l'écran, ou un fichier graphique peut être produit, ou un tableau de valeurs RVB peut être sorti. Si vous affichez un fichier ou un tableau, veuillez publier un exemple de ce à quoi il ressemble lorsqu'il est affiché.
- Les graphiques peuvent être vectoriels ou raster. Pour les graphiques raster, la taille de l'image doit être d'au moins 400 × 400 pixels.
- Chaque point doit être affiché comme un seul pixel, ou comme une marque avec une taille de l'ordre d'un pixel (sinon le graphique s'encombre rapidement).
- La plage des axes doit être [0,4] pour r (axe horizontal) et [0,1] pour x N (axe vertical); ou il peut être plus petit tant qu'il comprend tous les points obtenus.
- Les échelles des axes sont arbitraires. En particulier, l'échelle n'a pas besoin d'être la même pour les deux axes.
- Les lignes de quadrillage, les étiquettes d'axe, les couleurs et les éléments similaires sont acceptables, mais pas obligatoires.
- Le code le plus court en octets gagne.
Cas de test
Cliquez sur chaque image pour une version haute résolution.
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;
Reconnaissance
Merci à @FryAmTheEggman et @AndrasDeak pour leurs commentaires utiles pendant que le défi était dans le bac à sable.
Réponses:
MATL,
32302827 octets4 octets économisés grâce à @Luis
Le format d'entrée est
r1
,s
,r2
etN
Essayez-le sur MATL Online
Explication
la source
Mathematica, 65 octets
Fonction pure prenant les arguments N, r1, r2, s dans cet ordre.
Nest[r#(1-#)&,x,N]
itère la fonction logistiquer#(1-#)&
un total deN
fois à partir dex
; ici, le premier argument de la fonction (#
) est celuiN
en question;Point@{r,...}
produit unPoint
quiGraphics
sera heureux de tracer.Table[...,{x,0,1,.01},{r,##2}]
crée tout un tas de ces points, lax
valeur allant de0
à1
par incréments de.01
; le##2
in{r,##2}
indique tous les arguments de la fonction d'origine à partir du second, et se{r,##2}
développe donc pour définir{r,r1,r2,s}
correctement la plage et l'incrément pourr
.Exemple de sortie, sur le deuxième cas de test: l'entrée
donne les graphiques ci-dessous.
la source
Mathematica, 65 octets
J'ai utilisé quelques astuces de Greg Martin et ceci est ma version sans utiliser Graphics
contribution
production
contribution
production
la source
TI-Basic, 85 octets
Un programme TI-Basic complet qui prend les entrées dans l'ordre
r1,r2,s,N
et affiche ensuite les sorties en temps réel sur l'écran graphique. Notez que cela a tendance à être incroyablement lent .Voici un exemple de sortie incomplète générée après environ 2,5 heures pour l'entrée
3,4,0.01,100
:la source
*
signes.Processing.js,
125123120 octetsMerci à Kritixi Lithos pour avoir économisé 3 octets.
Essayez-le en ligne! Appeler en utilisant
f(N, r_1, r_2, s);
la source
void
parvar
parce que c'est Processing JSx*=p*(1-x)
peut devenirx*=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 octetsGEL , 158 octets
Ce n'est peut-être pas le plus court, mais il dessine en temps réel, bien qu'il puisse être incroyablement lent avec des entrées énormes. Quoi qu'il en soit, il s'agit d'une fonction anonyme qui prend une entrée au format
(N,r1,r2,s)
et sort le tracé dans une nouvelle fenêtre. Notez que cela doit être exécuté avec la version GNOME de Genius.la source
R,
159147 octetsQui produit la fonction
plot(NA,...)
crée un canevas vide qui a les bonnes dimensions.q
est la fonction qui fait l'itération. Il prend une valeur der
, puis effectue desn
itérations pour tous les points de départ entre0.01
et0.99
. Il retourne ensuite le vecteur résultant.La boucle for applique la fonction
q
de la séquencea
à l'b
étapes
. Au lieu de renvoyer les valeurs, il les ajoute en tant que points au tracé. Si le point d'attraction est une valeur, tous les points se chevauchent et apparaissent comme un seul point.cex=.1
est un ajout nécessaire pour rendre les points aussi petits que possible.la source