Странная привлекательность логистической карты

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 каждая последовательность сходится к одному из этих двух значений. Фактически, для двух начальных значений, рассмотренных выше, последовательности являются (обратите внимание на колебательное поведение):

             х 0 = 0,01, ..., х 1000 = 0,5130, х 1001 = 0,7995, х 1002 = 0,5130, ...
             х 0 = 0,02, ..., х 1000 = 0,7995, х 1001 = 0,5130, х 1002 = 0,7995 ...

То , что это верно в том , что при достаточно большом N , а для почти всех начальных значений х 0 , термин х N будет близко к одному из элементов множества {0.5130, 0,7995}. Это множество называется аттрактором для этого конкретного r .

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

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

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

Соревнование

входные

  • N : количество итераций.

  • r 1 , r 2 и с . Они определяют множество R значений г , а именно R = { г 1 , г 1 + S , R 1 + 2 ые , ..., г 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 art).

Дополнительные правила

  • Указанная процедура определяет требуемый результат, но не применяется. Можно использовать любую другую процедуру, которая обрабатывает тот же набор ( 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 за их полезные комментарии, пока задача находилась в песочнице.

Луис Мендо
источник
Что нет решения Python ?!
@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
Suever
источник
8

Mathematica, 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-#)&всего Nраз, начиная с x; здесь первый аргумент функции ( #) - это Nвопрос; Point@{r,...}производит, Pointчто Graphicsбудет рад заговору. Table[...,{x,0,1,.01},{r,##2}]создает целую кучу этих точек со xзначением, бегущим от 0до 1в приращениях .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

Mathematica, 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]

выход

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

J42161217
источник
1
Первый ответ, который выбирает, чтобы избежать начальных значений 0 или 1 (и строки x = 0, которые они генерируют) :-)
Луис Мендо
Вы должны добавить объяснение того, что делает ваш код, поскольку он на самом деле не следует указанной процедуре. ОП может решить, оправдывает ли точный результат альтернативный метод.
Грег Мартин
Указанная процедура не применяется. Все, что дает тот же результат любыми другими способами, разрешено (я поясню это). Независимо от этого, мне любопытно увидеть объяснение
Луис Мендо
Точки, которые вам нужно построить для каждого r, уже существуют в каждом «Гнезде». это оригинальный код, и это был мой первый подход (некоторое время назад) к построению этой диаграммы.
J42161217
@Luis Mendo У меня есть еще более короткая версия (которая делает запись для mathematica) .58 байт, но вы должны ввести только 3 входа [N, r1, r2]. Это занимает время, но оно работает. Сюжет [Table [NestList [# ( 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);

ASCII-только
источник
Я думаю , вы можете заменить voidс , varпотому что это обработка JS
Kritixi Lithos
И x*=p*(1-x)может статьx*=p-p*x
Kritixi Lithos
Переставляя цикл for, я получаю 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 байтах
Kritixi Lithos
1

Лари , 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является необходимым дополнением, чтобы сделать очки как можно меньше.

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

JAD
источник