Matlab:相 space 图
Matlab : Phase space plot
我是混沌和非线性动力学的初学者。我试图使用 Matlab 为 Tent Map 绘制阶段 space 图。阶段 space 图是其独立变量的图。所以,如果一个系统有一个变量,那么它将是前一个值与下一个值的关系图。情节的轮廓类似于帐篷地图,但我得到了几条交叉线。阶段 space 图应该看起来像一个介于 0 和 1 之间的三角形(因此得名 Tent)。如果参数是mu,那么最大值应该是mu/2。正确的阶段 space 图应该是
我也尝试了其他离散地图并获得了类似的线条。然而,在书籍和所有书籍中,我看到了一条没有线条的干净曲线。我哪里错了?此外,绘图不是从 X 轴上的零开始。这个问题也是从编程和概念的角度出发的。我不知道如何获得 x[n] vs x[n-1]
的图表,如维基百科中给出的图表所示。
这里是帐篷地图的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)
我通过两个简单的更改执行了您的代码,一个 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 else 条件规则中。因此,当该条件满足时循环结束。我在您的 if 条件中添加了 = 符号 if (double(x(j-1)))>=0 && (double(x(j-1)))<0.5
并得到了下图。代码现在可以运行了,但我不确定它在数学上是否正确。
您的代码中存在几个问题。首先,您的条件太复杂,不需要将某些内容强制转换为 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
command by default connects the points by lines; this is not what you want. Also, the extra loop to compute next
is unnecessary. Simply use Matlab's vector generation and 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, which is a plot of the system state over time, nor a phase portrait 中的相图,它描述了相 space 的结构(并不真正适用于地图)。
我是混沌和非线性动力学的初学者。我试图使用 Matlab 为 Tent Map 绘制阶段 space 图。阶段 space 图是其独立变量的图。所以,如果一个系统有一个变量,那么它将是前一个值与下一个值的关系图。情节的轮廓类似于帐篷地图,但我得到了几条交叉线。阶段 space 图应该看起来像一个介于 0 和 1 之间的三角形(因此得名 Tent)。如果参数是mu,那么最大值应该是mu/2。正确的阶段 space 图应该是
我也尝试了其他离散地图并获得了类似的线条。然而,在书籍和所有书籍中,我看到了一条没有线条的干净曲线。我哪里错了?此外,绘图不是从 X 轴上的零开始。这个问题也是从编程和概念的角度出发的。我不知道如何获得 x[n] vs x[n-1]
的图表,如维基百科中给出的图表所示。
这里是帐篷地图的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)
我通过两个简单的更改执行了您的代码,一个 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 else 条件规则中。因此,当该条件满足时循环结束。我在您的 if 条件中添加了 = 符号 if (double(x(j-1)))>=0 && (double(x(j-1)))<0.5
并得到了下图。代码现在可以运行了,但我不确定它在数学上是否正确。
您的代码中存在几个问题。首先,您的条件太复杂,不需要将某些内容强制转换为 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
command by default connects the points by lines; this is not what you want. Also, the extra loop to compute next
is unnecessary. Simply use Matlab's vector generation and 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, which is a plot of the system state over time, nor a phase portrait 中的相图,它描述了相 space 的结构(并不真正适用于地图)。