Цель задачи состоит в том, чтобы построить приблизительно аттрактор из логистического отображения в зависимости от его параметра г (также называется бифуркационной диаграмма ), или подобласть него. Внешний вид графика можно увидеть на следующем изображении из Википедии:
Задний план
Логистическое отображение является математической функцией , которая принимает входной х 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 можно оценить как
- тестирование широкого диапазона начальных значений x 0 ;
- позволяя систему Evolve для большого числа N итераций; и
- принимая к сведению окончательные значения х 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 за их полезные комментарии, пока задача находилась в песочнице.
Ответы:
MATL,
32302827 байтов4 байта сохранены благодаря @Luis
Формат входного сигнала
r1
,s
,r2
, иN
Попробуйте это на MATL Online
объяснение
источник
Mathematica, 65 байт
Чистая функция, принимающая аргументы 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
.Пример вывода во втором тестовом случае: вход
дает график ниже.
источник
Mathematica, 65 байт
Я использовал некоторые хитрости Грега Мартина, и это моя версия без использования графики
вход
выход
вход
выход
источник
TI-Basic, 85 байт
Полная программа TI-Basic, которая принимает входные данные в порядке,
r1,r2,s,N
а затем отображает выходные данные в режиме реального времени на экране графика. Обратите внимание, что это имеет тенденцию быть невероятно медленным .Вот неполный пример вывода, сгенерированный примерно через 2,5 часа для ввода
3,4,0.01,100
:источник
*
знаки.ОбработкаJS,
125123120 байтовСпасибо Kritixi Lithos за сохранение 3 байта.
Попробуйте онлайн! Звонить используя
f(N, r_1, r_2, s);
источник
void
с ,var
потому что это обработка JSx*=p*(1-x)
может статьx*=p-p*x
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 байтахЛари , 158 байт
Он может быть не самым коротким, но он рисует в реальном времени, хотя он может быть невероятно медленным с огромными входными данными. В любом случае, это анонимная функция, которая принимает ввод в формате
(N,r1,r2,s)
и выводит график в новом окне. Обратите внимание, что это должно выполняться с GNOME-версией Genius.источник
R
159147 байтКоторый производит функцию
plot(NA,...)
создает пустой холст, который имеет правильные размеры.q
это функция, которая выполняет итерации. Он принимает значениеr
, а затем выполняетn
итерации для всех начальных точек между0.01
и0.99
. Затем он возвращает результирующий вектор.Для контура применяет функцию
q
к последовательности ,a
чтобыb
с шагомs
. Вместо того, чтобы возвращать значения, он добавляет их в виде точек на график. Если точка притяжения имеет одно значение, все точки просто перекрываются и отображаются как одна точка.cex=.1
является необходимым дополнением, чтобы сделать очки как можно меньше.источник