Doubler la cascade

12

Tout d'abord, un intermède mathématique, court et qui en vaut la peine:

Si 0 < a < 4, la fonction logistique f(x) = ax(1-x) mappe l'intervalle [0,1] à l'intérieur d'elle-même. Cela signifie que l'on peut jouer au jeu d'itération; par exemple, si a = 2, la valeur initiale 0,3 devient 0,42, puis 0,4872, etc.

À mesure que le paramètre aaugmente, la fonction quadratique fse complique dans le sens suivant:

  • 0 < a < 1 toutes les valeurs initiales itèrent vers 0.
  • 1 < a < 3 0 devient repoussant, mais il y a un nouveau point fixe (a-1) / a qui attire toutes les itérations.
  • 3 < a < 1+sqrt(6) le nouveau point fixe devient repoussant, mais un cycle de 2 points d'attraction apparaît.
  • 3.44949... < a < 3.54409... le cycle 2 devient repoussant, mais un cycle de 4 points d'attraction apparaît.
  • etc.

Feigenbaum a remarqué que les longueurs de ces intervalles de paramètres diminuent à un rythme qui se rapproche de plus en plus de 4.6692...la constante de Feigenbaum . La merveilleuse découverte est que cette séquence de bifurcation de la période 2 est un phénomène général partagé par toute fonction qui (comme la parabole quadratique) augmente, puis diminue. Ce fut l'un des premiers rapports sur l' universalité du chaos .

Maintenant pour le défi! Écrivez le code le plus court possible qui calcule la constante de Feigenbaum avec une précision de votre choix. Le point ici n'est pas de tromper le système en encodant un nombre que vous avez googlé, mais de faire en sorte que l'ordinateur trouve la valeur. Pour référence, voici la constante à 30 chiffres:

4.669201609102990671853203821578

Rodrigo A. Pérez
la source
5
Je suis surpris que nous n'ayons pas déjà de défi pour calculer cette constante, une belle idée que nous avons ratée. Le plus proche semble être de tracer l'attracteur logistique . Je suggère que le code prenne une erreur maximale ou un nombre de chiffres et produise la constante à l'intérieur de cette précision (en ignorant les limites de la machine au-delà d'un certain point). Ou peut-être pour calculer ce rapport entre les iième et (i + 1) st intervalles de doublement, comme cela convergerait vers la constante. Le golfeur qui choisit une précision est trop vague et le codage en dur n'est pas exécutoire.
xnor
J'ai beaucoup réfléchi à la façon de formuler le défi. Le problème est que c'est une chose notoirement difficile à calculer avec précision, alors j'ai pensé que les gens auraient plus de plaisir à se concentrer sur la mise en œuvre d'une méthode lisse, plutôt que d'obtenir ce chiffre supplémentaire par force brute. Si les gens pensent différemment, je changerai les règles.
Rodrigo A. Pérez
1
Que recherchez-vous comme méthode astucieuse ou pour éviter la force brute? Notez que par défaut pour les golfs de code, nous n'avons pas besoin de limites sur l'exécution ou l'espace, donc les réponses ont tendance à être très inefficaces lorsqu'elles sont optimisées pour être courtes. Vous cherchez peut-être à créer un code le plus rapide ou un défi de complexité limitée?
xnor

Réponses:

3

Javascript, 141 138 135 131 octets, 8 chiffres

C'est quelque chose que je suppose. Cela devrait être assez évolutif. Si quelqu'un a besoin d'un début: comment calculer Feigenbaum . Et si vous voulez plutôt savoir comment le faire au niveau du code, consultez ceci .

Copiez collez le code suivant dans votre console. Calcule 4.6692016 68823243 (donc pas vraiment précis).

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
la source
2

Python, 127 octets

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

Le mérite revient à @ThomasW avec sa réponse javascript.

Ajouter print(d)à la sortie 4.669201673141983 . Prend quelques secondes, car les longues chaînes sont calculées avant l'exécution.

Uriel
la source
1

Fusain , 84 octets

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

Essayez-le en ligne! Lien vers le code détaillé pour explication.

Utilise l'algorithme d' ici .

Imprime 4.66920 0975097843 (6 chiffres)

ASCII uniquement
la source