Подвійний каскад


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

Пітон, 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 . Займає кілька секунд за рахунок обчислення довгих рядків перед виконанням.


1

Вугілля деревне , 84 байти

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

Спробуйте в Інтернеті! Посилання на багатослівний код для пояснення.

Використання алгоритму з тут .

Друк 4.66920 0975097843 (6 цифр)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.