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 и получил следующий график. Код теперь работает, но я не уверен, что он математически правильный или нет.

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

Другие вопросы по тегам