Дивна привабливість логістичної карти


21

Мета завдання полягає в тому, щоб побудувати приблизно аттрактор з логістичного відображення в залежності від його параметра г (також називається бифуркационной діаграма ), або подобласть нього. Зовнішній вигляд графіка можна побачити на наступному зображенні з Вікіпедії:

введіть тут опис зображення

Фон

Логістичне відображення є математичною функцією , яка приймає вхідний х K , і відображає його на вихід х до + 1 визначається як

             x k + 1 = r x k (1− x k )

де r - параметр карти, який лежить в інтервалі [0, 4].

З огляду на г в [0,4], а початкове значення х 0 в інтервалі [0,1], цікаво повторно застосувати функцію для великого числа N ітерацій, виробляючи кінцеве значення х N . Зауважте, що x N обов'язково лежить і в [0,1].

Як приклад, розглянемо r = 3,2, N = 1000. Початкове значення x 0 = 0,01 дає x 1000 = 0,5130. Для x 0 = 0,02 результат х x 0 = 0,7995. Для будь-яких інших початкових значень x 0 кінцеві значення x 1000 надзвичайно близькі до 0,5130 або 0,7995. Це видно на графіку як висота двох ліній у горизонтальному положенні r = 3,2.

Це не означає, що при r = 3.2 кожна послідовність сходить до одного з цих двох значень. Насправді для двох розглянутих вище початкових значень послідовності є (зверніть увагу на коливальну поведінку):

             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 , ...

Те , що це вірно в тому , що при досить великому N , а для майже всіх початкових значень х 0 , термін х N буде близько до одного з елементів множини {0.5130, 0,7995}. Цей набір називається аттрактором для даного конкретного r .

Для інших значень параметра r розмір набору атракторів або його елементів зміниться. Графік розміщує елементи в атракторі для кожного r .

Атрактор для конкретного r можна оцінити за

  1. тестування широкого діапазону початкових значень x 0 ;
  2. дозволяти системі розвиватися для великої кількості N ітерацій; і
  3. приймаючи під увагу кінцевих значень х N , які отримані.

Змагання

Вхідні дані

  • N : кількість ітерацій.

  • r 1 , r 2 і s . Вони визначають множину R значень r , а саме R = { r 1 , r 1 + s , r 1 + 2 s , ..., r 2 }.

Порядок

Множина X початкових значень x 0 фіксована: X = {0,01, 0,02, ..., 0,99}. Необов'язково, 0 і 1 також можуть бути включені в X .

Для кожного г в R , і кожен х 0 в X , ітерації логістичного відображення N раз для отримання х N . Запишіть отримані кортежі ( r , x N ).

Вихідні дані

Накресліть кожен кортеж ( r , x N ) як точку в площині з r як горизонтальна вісь і x N як вертикальна вісь. Вихід повинен бути графічним (не ASCII).

Додаткові правила

  • Вказана процедура визначає необхідний результат, але не застосовується. Будь-яка інша процедура, яка передбачає той самий набір ( r , x N ) кортежів, може бути використана.
  • Введення гнучко, як зазвичай.
  • Помилки з плаваючою точкою проти відповідача не утримуватимуться.
  • Графічний вихід необхідний у будь-якому з прийнятих форматів . Зокрема, на екрані може відображатися вихід, або може бути створений графічний файл, або може бути виведений масив значень RGB. Якщо виводите файл або масив, будь ласка, опублікуйте приклад того, як він виглядає при відображенні.
  • Графіка може бути векторною або растровою. Для растрової графіки розмір зображення повинен бути не менше 400 × 400 пікселів.
  • Кожна точка повинна бути показана як один піксель, або як позначка з розміром порядку одного пікселя (інакше графік швидко забивається).
  • Діапазон осі повинен бути [0,4] для r (горизонтальна вісь) і [0,1] для x N (вертикальна вісь); або він може бути меншим, якщо він включає всі отримані бали.
  • Осі ваги довільні. Зокрема, масштаб не повинен бути однаковим для обох осей.
  • Лінії сітки, мітки осі, кольори та подібні елементи прийнятні, але не обов'язкові.
  • Виграє найкоротший код у байтах.

Тестові кейси

Натисніть на кожне зображення, щоб отримати версію з високою роздільною здатністю.

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;

введіть тут опис зображення

Подяка

Дякуємо @FryAmTheEggman та @AndrasDeak за корисні коментарі, поки виклик був у пісочниці.


Що за рішення пітону ?!

@ Lembik У мене є реалізація посилань на Python (і в Matlab), але я не хочу відповідати собі
Луїс Мендо,

Вам дозволяється відповідати на власні запитання щодо PPCG (можливо, на диво).

@Lembik Я знаю, але я вважаю за краще відповіді інших
Луїс Мендо

Відповіді:


13

MATL, 32 30 28 27 байт

4 байти збережено завдяки @Luis

3$:0:.01:1!i:"tU-y*]'.'3$XG

Формат вхідного сигналу r1, s, r2, іN

Спробуйте в MATL Online

введіть тут опис зображення

Пояснення

        % Implicitly grab the first three inputs
3$:     % Take these three inputs and create the array [r1, r1+s, ...]
0:.01:1 % [0, 0.01, 0.02, ... 1]
!       % Transpose this array
i       % Implicitly grab the input, N
:"      % For each iteration
  tU    % Duplicate and square the X matrix
  -     % Subtract from the X matrix (X - X^2) == x * (1 - x)
  y     % Make a copy of R array
  *     % Multiply the R array by the (X - X^2) matrix to yield the new X matrix
]       % End of for loop
'.'    % Push the string literal '.' to the stack (specifies that we want
        % dots as markers)
3$XG    % Call the 3-input version of PLOT to create the dot plot

8

Математика, 65 байт

Graphics@Table[Point@{r,Nest[r#(1-#)&,x,#]},{x,0,1,.01},{r,##2}]&

Чиста функція, приймаючи аргументи N, r1, r2, s у такому порядку. загальна кількість разів Nest[r#(1-#)&,x,N]повторює логістичну функцію ; тут перший аргумент функції ( ) - це питання; виробляє те , що з радістю змовить. створює цілий букет з цих точок, з значенням , що йде від до з кроком ; в Означає всіх вихідних аргументів функції , починаючи з другого, і так розширюється , щоб , правильно встановлює діапазон і приріст для .r#(1-#)&Nx#NPoint@{r,...}PointGraphicsTable[...,{x,0,1,.01},{r,##2}]x01.01##2{r,##2}{r,##2}{r,r1,r2,s}r

Вибірка зразка, у другому тестовому випадку: вхід

Graphics@Table[Point@{r,Nest[r#(1-#)&,x,#]},{x,0,1,.01},{r,##2}]&[2000,3.4,3.8,0.0002]

дає графіку нижче.

введіть тут опис зображення


1
59 байт ListPlot @ Table [{r, Nest [r # (1 - #) &, x, #]}, {x, 0,1, .01}, {r, ## 2}] &
J42161217

Я вирішив у виклику, що зазначена процедура призначена для визначення необхідного результату, але сама процедура не виконується. Ви можете використовувати будь-яку іншу процедуру, яка дає такий же результат. Вибачте, якщо спочатку це було не ясно
Луїс Мендо

Не проблема, у нас є кілька хороших відповідей!
Грег Мартін

1
Чи не збираєтесь ви використовувати ці -6 байт. Ви вважаєте, що сомати не в цьому рішенні?
J42161217

О, я подумав, що Ваша відповідь - розміщення (версія) коду з Вашого коментаря ....
Грег Мартін

5

Математика, 65 байт

Я використав деякі хитрощі Грега Мартіна, і це моя версія без використання графіки

ListPlot@Table[{r,NestList[#(1-#)r&,.5,#][[-i]]},{i,99},{r,##2}]&

вхід

[1000, 2,4, 4, 0,001]

вихід

введіть тут опис зображення

вхід

[2000, 3.4, 3.8, 0.0002]

вихід

введіть тут опис зображення


1
Перша відповідь, яка вирішить уникнути початкових значень 0 або 1 (і рядок x = 0, який вони генерують) :-)
Луїс Мендо

Ви повинні додати пояснення, що робить ваш код, оскільки він фактично не відповідає зазначеній процедурі. ОП може вирішити, чи точно вигляд результату виправдовує альтернативний метод.
Грег Мартін

Зазначена процедура не виконується. Дозволено все, що дає такий же результат, будь-якими іншими способами (я уточню це). Незалежно від цього мені цікаво побачити пояснення
Луїс Мендо

Точки, які потрібно побудувати для кожного r, існують уже в кожному "Гнізді". це оригінальний код, і це був мій перший підхід (деякий час тому) щодо побудови цієї діаграми.
J42161217

@Luis Mendo У мене є ще коротша версія (яка робить запис для математики) .58 байтів, але ви повинні ввести лише 3 входи [N, r1, r2]. Це потребує часу, але це працює. 1 - #) r & ,. 5, #] [[- i]], {i, 99}], {r, ## 2}] &
J42161217

2

TI-Basic, 85 байт

Prompt P,Q,S,N
P→Xmin:Q→Xmax
0→Ymin:1→Ymax
For(W,.01,1,.01
For(R,P,Q,S
W→X
For(U,1,N
R*X*(1-X→X
End
Pt-On(R,X
End
End

Повна програма TI-Basic, яка приймає введення в порядку, r1,r2,s,Nа потім показує вихід у режимі реального часу на екрані графіка. Зауважте, що це, як правило, надзвичайно повільно .

Ось неповний вихідний зразок, що генерується приблизно через 2,5 години для введення 3,4,0.01,100:

введіть тут опис зображення


*Знаки вам не потрібні .
lirtosiast

1

ОбробкаJS, 125 123 120 байт

Завдяки Kritixi Lithos за збереження 3-х байт.

var f(n,q,r,s){size(4e3,1e3);for(i=0;i<1;i+=.01)for(p=q;p<=r;p+=s){x=i;for(j=0;j<n;j++)x*=p-p*x;point(p*1e3,1e3-x*1e3)}}

Спробуйте в Інтернеті! Дзвінок за допомогоюf(N, r_1, r_2, s);


Я думаю , ви можете замінити voidз , varтому що це обробка JS
Kritixi Lithos

А x*=p*(1-x)може статиx*=p-p*x
Kritixi Lithos

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;}
Переставляючи фор

1

GEL , 158 байт

`(N,r,t,s)=(LinePlotWindow=[r,t,0,1];for i=r to t by s do(p=.;for w=0to 1by 0.01do(x=w;for a=0to N do(x=i*x*(1-x););p=[p;q=[i,x]];);LinePlotDrawPoints(p);););

Це може бути не найкоротшим, але він малює в режимі реального часу, хоча може бути неймовірно повільним при величезних введеннях. У будь-якому випадку це анонімна функція, яка приймає введення у форматі (N,r1,r2,s)та виводить сюжет у новому вікні. Зауважте, що це має бути запущено з версією GNOME Genius.

Вибірка зразка


1

R, 159 147 байт

pryr::f({plot(NA,xlim=c(a,b),ylim=0:1);q=function(r,n,x=1:99/100){for(i in 1:n)x=r*x*(1-x);x};for(i in seq(a,b,s))points(rep(i,99),q(i,n),cex=.1)})

Що виробляє функцію

function (a, b, n, s) 
{
    plot(NA, xlim = c(a, b), ylim = 0:1)
    q = function(r, n, x = 1:99/100) {
        for (i in 1:n) x = r * x * (1 - x)
        x
    }
    for (i in seq(a, b, s)) points(rep(i, 99), q(i, n), cex = 0.1)
}

plot(NA,...)створює порожнє полотно, яке має правильні розміри. qце функція, яка виконує ітерацію. Він приймає значення r, а потім робить nітерації для всіх вихідних точок між 0.01і 0.99. Потім він повертає отриманий вектор.

Для контуру застосовує функцію qдо послідовності , aщоб bз кроком s. Замість того, щоб повертати значення, він додає їх як точки до сюжету. Якщо точка притягання - одна величина, всі точки просто перекриються і відображатимуться як одна точка. cex=.1є необхідним доповненням, щоб зробити очки якомога меншими.

введіть тут опис зображення

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