Двойной каскад


12

Во-первых, математическая интерлюдия, короткая, и того стоит:

Если 0 < a < 4, то логистическая функция f(x) = ax(1-x) отображает интервал [0,1] внутри себя. Это означает, что можно играть в итерационную игру; например, если a = 2, начальное значение 0,3 становится 0,42, затем 0,4872 и т. д.

По мере aувеличения параметра квадратичная функция fусложняется в следующем смысле:

  • 0 < a < 1 все начальные значения повторяются к 0.
  • 1 < a < 3 0 становится отталкивающим, но есть новая фиксированная точка (a-1) / a, которая привлекает все итерации.
  • 3 < a < 1+sqrt(6) новая фиксированная точка становится отталкивающей, но появляется цикл из 2 притягивающих точек.
  • 3.44949... < a < 3.54409... 2-й цикл становится отталкивающим, но появляется цикл из 4-х притягивающих точек.
  • и т.п.

Фейгенбаум заметил , что длины этих интервалов параметров уменьшается со скоростью , которая становится ближе и ближе к 4.6692..., с постоянной Фейгенбаума . Замечательное открытие состоит в том, что эта бифуркационная последовательность периода 2 является общим явлением, разделяемым любой функцией, которая (подобно квадратичной параболе) увеличивается, а затем уменьшается. Это был один из первых отчетов об универсальности хаоса .

Теперь для вызова! Напишите кратчайший код, который вычисляет постоянную Фейгенбаума с точностью по вашему выбору. Смысл здесь не в том, чтобы обмануть систему путем кодирования числа, которое вы гуглили, а в том, чтобы на самом деле компьютер нашел значение. Для справки, здесь есть константа до 30 цифр:

+4,669201609102990671853203821578


5
Я удивлен, что у нас еще нет задачи для вычисления этой константы, хорошая идея, которую мы пропустили. Наиболее близким представляется участок логистического аттрактора . Я бы предложил, чтобы код принимал максимальную ошибку или количество цифр и вырабатывал константу с точностью до этой точности (игнорируя ограничения машины после некоторой точки). Или, может быть, вычислить это отношение между i-м и (i + 1) -ым интервалами удвоения, которые будут сходиться к константе. Гольфист, выбирающий точность, слишком расплывчатый, и не жесткое кодирование неосуществимо.
xnor

Я много думал о том, как сформулировать вызов. Проблема в том, что это довольно сложно вычислить точно, поэтому я подумал, что людям было бы гораздо интереснее сосредоточиться на реализации ловкого метода, а не на получении дополнительной цифры с помощью грубой силы. Если люди будут чувствовать себя иначе, я буду менять правила.
Родриго А. Перес

1
Что вы ищете в качестве ловкого метода или избегания грубой силы? Обратите внимание, что по умолчанию для кодовых гольфов нам не требуются какие-либо ограничения на время выполнения или пространство, поэтому ответы, как правило, оказываются очень неэффективными, если их оптимизировать так, чтобы они были короткими. Может быть, вы хотите сделать самый быстрый код или сложную задачу?
xnor

Ответы:


3

Javascript, 141 138 135 131 байт, 8 цифр

Это то, что я думаю. Это должно быть улучшено совсем немного. Если кому-то нужно начать: как рассчитать Фейгенбаума . И если вы хотите знать, как сделать это с помощью кода, проверьте это .

Скопируйте и вставьте следующий код в вашу консоль. Вычисляет 4.6692016 68823243 (так что не очень точно).

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)


2

Python, 127 байт

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

Кредит идет на @ThomasW с его ответом javascript.

Добавить print(d)к выводу 4.669201673141983 . Занимает несколько секунд, поскольку длинные строки рассчитываются перед выполнением.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.