Matlab: фазовый космический сюжет
Я новичок в хаосе и нелинейной динамике. Я пытался построить график фазового пространства для Tent Map, используя Matlab. График фазового пространства - это график его независимых переменных. Таким образом, если в системе есть одна переменная, то это будет график зависимости предыдущего значения от следующего. Контур сюжета напоминает карту палатки, но я получаю несколько перекрестных линий. График фазового пространства должен выглядеть как треугольник (отсюда и название палатка), ограниченный от нуля до единицы. Если параметр mu, то самое высокое значение должно быть mu/2. Правильный фазовый интервал должен быть
Я пробовал и для других дискретных карт, и получал похожие строки. Однако в книгах и прочем я видел чистую кривую без линий как таковую. Куда я иду не так? Кроме того, график не начинается с нуля по оси X. Этот Вопрос также с точки зрения программирования и концепций. Я не знаю, как получить график x[n] vs x[n-1]
как показано в сюжете, приведенном в Википедии.
Вот код Matlab для карты Tent, где параметр mu = 2
,
N = 256;
x(1) = rand(); % Initial condition
for j=2:N
if (double(x(j-1)))>0 && (double(x(j-1)))<0.5
x(j)=2*x(j-1);
elseif (double(x(j-1)))>=0.5
x(j)=2*(1-x(j-1));
end
end
for k = 2:N
next(k) = x(k-1);
end
plot(next,x)
2 ответа
В вашем коде есть несколько проблем. Во-первых, ваши условия слишком сложны, и что-то double
в этом нет необходимости, поскольку в любом случае это тип данных Matlab по умолчанию. Вот очищенный код для цикла вычислений:
for j = 2 : N
if x(j - 1) < 0.5
x(j) = 2 * x(j - 1);
else
x(j) = 2 * (1 - x(j - 1));
end
end
Это можно сделать еще проще, используя формулу, приведенную на странице Википедии:
for j = 2 : N
x(j) = 2 * min(x(j - 1), 1 - x(j - 1));
end
Во-вторых, простой plot
команда по умолчанию связывает точки по линиям; это не то, что вы хотите. Кроме того, дополнительный цикл для вычисленияnext
не нужно Просто используйте возможности Matlab для генерации и индексирования векторов:
plot(x(1 : end - 1), x(2 : end), '.')
axis equal
axis([0 1 0 1])
и вы получите
Это, вероятно, все еще не то, что вы ожидали: полная карта палатки. Это потому, что вы вычисляете не саму карту, а траекторию, управляемую картой, которая состоит из 256 точек, как вы указали. Не все возможные значения для x
из этих 256 шагов может возникнуть из [0, 1], так что вы получите всего несколько точек на карте.
Если вы не хотите получать очки на карте, а график самой карты палатки, сделайте это:
x = 0 :0.01: 1;
plot(x, 2 * min(x, 1 - x))
axis equal
axis([0 1 0 1])
Обратите внимание, что это не фазовый график в стандартном смысле, который представляет собой график состояния системы во времени или фазовый портрет, который описывает структуру фазового пространства (и который на самом деле не применяется к картам).
Я выполнил ваш код с двумя простыми изменениями, одним clear all
в начале и disp([j-1 x(j-1)]);
внутри для петли. Ниже приводится последняя часть моего вывода.
52.0000 0.7500
53.0000 0.5000
54 1
55 0
Attempted to access x(56); index out of bounds because numel(x)=55.
Error in phaseSpacePlot (line 10)
disp([j-1 x(j-1)]);
Теперь это легко понять. Потому что в вас, если еще условие правило, если double(x(j-1)))<=0
не определено. Следовательно, цикл заканчивается, когда это условие выполняется. Я добавил = подписать ваше условие if как if (double(x(j-1)))>=0 && (double(x(j-1)))<0.5
и получил следующий график. Код теперь работает, но я не уверен, что он математически правильный или нет.