% longterm.m
fun = @(x,r) x + r*x*(1-x);
x0 = .99; a0 = 0; a1 = 3; N = 777; preL = 200; L = 100;
mat = bifur(fun,x0,a0,a1,N,preL,L);
function mat = bifur(fun,x0,a0,a1,N,preL,L,p_siz)
% –
% Функция bifur: строит однопараметрическую диаграмму бифуркаций
% Вход: fun = некоторая функция @(x,para)
% x0 = стартовое значение для x
% a0 = начальное значение параметра a
% a1 = конечное значение параметра a
% N = количество интервалов для параметра 'a' на отрезке [a0;a1]
% preL = количество предварительно пропускаемых итераций для
% преодоления переходного процесса перед стабилизацией
% L = количество итераций для каждой начальной пары
% от (x0,параметр a)
% p_siz = размер маркера, по умолчанию 1
% Выход: mat = бифукационная матрица размера N на L
% которая хранит последовательность длины L
% для каждой пары (x0, параметр a)
% –
% установки по умолчанию
if ~exist('p_siz','var')
p_siz = 1;
end
% инициализация
mat = zeros(N,L);
a = linspace(a0,a1,N);
% основной цикл
format long
for i = 1:N
ca = a(i); % выбрать одно значение параметра в каждый момент времени
for j = 1:L % сгенерировать последовательность длиной L
if j == 1
pre = x0; % инициализируем стартовое значение
for k = 1:preL % пропускаем значения переходного процесса
nxt = fun(pre,ca);
pre = nxt;
end
end
nxt = fun(pre,ca); % вычисляем следующее значение последовательности
mat(i,j) = nxt; % сохраняем в результирующей матрице mat
pre = nxt; % последнее значение будет начальным для следующей итерации
end
end
% построение графика
dcolor = [0,0,1]; % настройка цвета маркера: синий
[r,c] = meshgrid(1:L,a); % наполяем сетку данных координат
surf(r,c,mat,'Marker','*','MarkerSize',p_siz,'FaceColor','None','MarkerEdgeColor', dcolor,'EdgeColor','None')
view([90,0,0]) % фиксируем направление камеры