2015-05-03 3 views
2

Я новичок в хаосе и нелинейной динамике. Я пытался построить график фазового пространства для Tent Map с использованием Matlab. График фазового пространства представляет собой график его независимых переменных. Итак, если система имеет одну переменную, то это будет график предыдущего vs следующего значения. Схема сюжета напоминает карту теней, но я получаю несколько перекрестных линий. График фазового пространства должен выглядеть как треугольник (отсюда название Tent), ограниченный между нулем и одним. Если параметр mu, то самым высоким значением должно быть mu/2. Правильное пространство участок фазы должен бытьMatlab: Фазовый участок

enter image description here

Я попытался для других дискретных карт, а также и получать аналогичные линии. Однако в книгах и во всех случаях я видел чистую кривую без линий. Где я иду не так? Кроме того, график не начинается с нуля по оси X. Этот вопрос также с точки зрения программирования и концепций. Я не знаю, как получить график x[n] vs x[n-1], как показано на графике, приведенном в Википедии.

Tent map

Вот код Matlab для карты Палатка, где параметр 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) 
+0

http://www.mathworks.com/matlabcentral/fileexchange/7370-chaotic-maps/content/cmaps/tenti.m дает реализацию, но мне трудно следовать, и я не получаю участок фазового пространства, который должен http://en.wikipedia.org/wiki/File:Tent_map.png – SKM

+0

Вам нужно использовать 'double',' x' создается с помощью 'rand()' и всегда должен быть массивом 'double'. – David

+0

Функция палатки - это не то же самое, что карта палатки. Ваша первая фотография - это функция палатки, вторая - график фазового пространства карты палатки (с исправлением, которое дал Хватани). – David

ответ

3

Есть несколько проблем в вашем коде. Во-первых, ваши условия слишком сложны, и отбрасывание чего-то на 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 в vector generation и indexing возможности:

plot(x(1 : end - 1), x(2 : end), '.') 
axis equal 
axis([0 1 0 1]) 

и вы получите

Это, вероятно, еще не то, что вы ожидали: полный карту палатки. Это потому, что то, что вы вычисляете, это не сама карта, а траектория , которой управляет карта, которая состоит из 256 точек, как вы указали. Не все возможные значения для x из [0, 1] могут возникать на этих 256 шагах, поэтому вы получаете всего несколько баллов на карте.

Если вы не хотите, чтобы получить точки на карте, а граф самой палатки карты, сделайте следующее:

x = 0 :0.01: 1; 
plot(x, 2 * min(x, 1 - x)) 
axis equal 
axis([0 1 0 1]) 

Обратите внимание, что это не фаза участок в standard sense, который является графиком состояния системы во времени, а также phase portrait, в котором описывается структура фазового пространства (и которая на самом деле не применяется к картам).

+0

Спасибо за ваш ответ. Не могли бы вы прояснить следующие детали? (1) Вы упомянули, что второй график не является фазовым пространством на карте Тент. Но текстовые книги и wikepedia говорят, что это график фазового пространства, альтернативно называемый фазовым портретом. Траектория - это график переменной w.r.t time. (2) Какова процедура генерации графика карт, так что я могу сделать это для других дискретных карт, таких как логистика и т. Д. (3) Что такое график, на котором я получил дополнительные строки, похожие на то, что упоминал Хватени? – SKM

+0

@SKM, пожалуйста. (1) На странице Википедии даже не упоминается слово «фаза», а заголовок графика, на который вы ссылаетесь, говорит «карта теней» и ничего больше. Я использую слова «фазовый график», «фазовый портрет» и «траектория» в соответствии с использованием в Википедии, что идентично значению этих слов, которые я узнал при изучении нелинейной динамики. Быстрая проверка в [Scholarpedia] (http://www.scholarpedia.org/article/Phase_space) подтверждает это использование. Какой учебник вы используете? –

+1

(2) Карта представляет собой не что иное, как функцию от заданного интервала на тот же самый интервал. Поэтому карты отображаются так же, как любая другая функция переменной. Обычно я использую 'plot', как показано в ответе, но вы также можете посмотреть' ezplot'. Я настоятельно рекомендую вам потратить время на работу над разделами * Language Fundamentals *, * Mathematics *, * Graphics * и * Programming Scripts and Functions * документации Matlab, прежде чем идти дальше. Обучаясь, делая только работы после того, как у вас есть прочная основа. –

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

enter image description here

+0

Благодарим за указание ошибки; Я получал то же самое и не знал причины. – SKM

Смежные вопросы