2

我是混沌和非线性动力学的初学者。我试图使用 Matlab绘制帐篷地图的相空间图。相空间图是其自变量的图。因此,如果一个系统有一个变量,那么它将是前一个值与下一个值的图。情节的轮廓类似于帐篷地图,但我得到了几条交叉线。相空间图应该看起来像一个三角形(因此得名帐篷),边界在零和一之间。如果参数是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)
4

2 回答 2

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 的矢量生成索引功能:

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

你得到

这可能仍然不是您所期望的:完整的帐篷地图。那是因为您计算的不是地图本身,而是由地图控制的轨迹,由您指定的 256 个点组成。并非 [0, 1] 中的每个可能值都可以出现在这 256 个步骤中,因此您只能在地图上x获得几个点。

如果您不想获取地图上的点,而是获取帐篷地图本身的图表,请执行以下操作:

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

请注意,这不是标准意义上的相图,它是系统状态随时间变化的图,也不是图,它描述了相空间的结构(并不真正适用于地图)。

于 2015-05-04T02:26:06.543 回答
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 (double(x(j-1)))>=0 && (double(x(j-1)))<0.5并得到了下图。代码现在可以工作,但我不确定它在数学上是否正确。

在此处输入图像描述

于 2015-05-04T00:28:56.163 回答