我是混乱和非线性动力学的初学者。我试图用Matlab绘制Tent Map的相空间图。相空间图是其独立变量的图。因此,如果一个系统有一个变量,那么它将是前一个与下一个值的关系图。情节的轮廓类似于帐篷地图,但我得到了几条交叉线。相空间图应该看起来像一个三角形(因此名称Tent)在0和1之间。如果参数是mu,则最高值应为mu / 2。正确的相空间图应为
我也尝试过其他离散地图并获得类似的线条。然而,在书籍和所有书籍中,我看到了一条没有线条的干净曲线。我哪里错了?此外,绘图不是从X轴的零开始。本课题也是从编程和概念的角度出发的。我不知道如何获得维基百科中给出的图中显示的x[n] vs x[n-1]
图。
以下是Tent地图的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 :(得分: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个点组成。并非{0,1}中x
的所有可能值都可以在这256个步骤中出现,因此您只需在地图上获得几个。
如果您不想在地图上获取积分,但想要获取帐篷地图本身的图表,请执行以下操作:
x = 0 :0.01: 1;
plot(x, 2 * min(x, 1 - x))
axis equal
axis([0 1 0 1])
请注意,这不是standard sense中的相位图,它是系统状态随时间变化的图,也不是phase portrait,它描述了相空间的结构(并且不是真的适用于地图)。
答案 1 :(得分:1)
我通过两个简单的更改执行了您的代码,一个clear all
在开头,disp([j-1 x(j-1)]);
在for循环中。以下是我输出的最后一部分。
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 if else条件规则。因此,当条件满足时,循环结束。我将= sign添加到您的if条件为if (double(x(j-1)))>=0 && (double(x(j-1)))<0.5
,并得到以下图表。代码现在有效,但我不确定它在数学上是否正确。