[英]Matlab : Phase space plot
我是混沌和非線性動力學的初學者。 我試圖使用Matlab為Tent Map繪制相空間圖。 相空間圖是其獨立變量的圖。 因此,如果系統具有一個變量,那么它將是前一個值與下一個值的曲線圖。 該圖的輪廓類似於“帳篷地圖”,但我得到了幾條交叉線。 相空間圖應看起來像一個三角形(因此稱為Tent),其邊界介於零和一之間。 如果參數為mu,則最大值應為mu / 2。 正確的相空間圖應為
我也嘗試了其他離散地圖,並獲得了相似的線條。 但是,在所有書籍中,我看到了一條沒有線條的干凈曲線。 我要去哪里錯了? 同樣,繪圖也不是從X軸的零開始。 這個問題也是從編程和概念的角度來看的。 我不知道如何獲得x[n] vs x[n-1]
的圖,如Wikipedia中給出的圖所示。
這是帳篷地圖的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)
您的代碼中有幾個問題。 首先,您的條件太復雜了,並且不需要將任何東西都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
通過使用Wikipedia頁面中給出的公式,這可以變得更加簡單:
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個點組成。 在這256個步驟中,並非[ x
,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
則條件規則中的Cos。 因此,當該條件滿足時,循環結束。 我在您的if條件中添加了=符號, if (double(x(j-1)))>=0 && (double(x(j-1)))<0.5
並得到下圖。 代碼現在可以使用,但是我不確定它在數學上是否正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.