Matlab 中二阶自治系统的极限环
Limit cycle in Matlab for 2nd order autonomous system
我想在 Matlab 中创建一个极限环。极限环看起来像这样:
不过我不知道该怎么做,我从来没有在 Matlab 中做过这样的事情。
描述极限环的方程如下:
x_1d=x_2
x_2d=-x_1+x_2-2*(x_1+2*x_2)x_2^2
它将以 (0,0)
的平衡点为中心
你们能帮帮我吗?
如果您使用函数的偏导数来构建向量场,则可以使用流线来可视化您所描述的循环。
例如函数f = x^2+y^2
给我偏导数 dx = 2x, dy=2y 对于可视化,我从网格上的偏导数中采样。
[x,y] = meshgrid(0:0.1:1,0:0.1:1);
dx = 2*x;
dy = 2*y;
为了可视化矢量场,我使用 quiver
;
figure;
quiver(x, y, dx, dy);
使用流线,我可以想象注入矢量场的粒子的路径。在我的示例中,我将粒子注入 (0.1, 0.1)
streamline(x,y, dx, dy, 0.1, 0.1);
这会产生以下可视化结果
在您的情况下,您可以省略箭袋步骤以移除每个网格点的刺猬箭头。
这是另一个显示粒子会聚到轨道的例子。
编辑:您的函数。
因此,正如 knedlsepp 指出的那样,您感兴趣的功能有点含糊不清。在 Matlab 中,*
表示矩阵乘积,而 .*
表示矩阵之间的逐元素乘法。类似地,'^2' 表示矩阵 M
的 MM
,而 .^2
表示采用元素方式的幂。
所以,
[x_1,x_2] = meshgrid(-4:0.1:4,-4:0.1:4);
dx_1 = x_2;
dx_2 = -x_1+x_2-2*(x_1+2*x_2)*(x_2)^2;
figure; streamline(x_1,x_2, dx_1, dx_2, 0:0.1:4, 0:0.1:4);
看起来像
这个函数不会显示收敛,因为它不收敛。
knedlsepp 建议您真正感兴趣的功能是
dx_1 = -1 * x_2;
dx_2 = -1 * -x_1+x_2-2*(x_1+2*x_2).*(x_2).^2;
对其余部分有很好的描述。
此 post 显示了生成矢量场积分线的代码,该矢量场定义为:
dx/dt = y
dy/dt = -x+y-2*(x+2*y)*y^2.
正确矢量化此函数很重要。 (即在所有重要的地方引入点)
dxdt = @(x,y) y;
dydt = @(x,y) -x+y-2*(x+2*y).*y.^2;
[X,Y] = meshgrid(linspace(-4,4,100));
[sx,sy] = meshgrid(linspace(-3,3,20));
streamline(stream2(X, Y, ... % Points
dxdt(X,Y), dydt(X,Y),... % Derivatives
sx, sy)); % Starting points
axis equal tight
要获得与您的照片更相似的图片,请更改网格大小和起点:
[X,Y] = meshgrid(linspace(-1,1,100));
[sx,sy] = meshgrid(linspace(0,0.75,20),0.2);
我想在 Matlab 中创建一个极限环。极限环看起来像这样:
不过我不知道该怎么做,我从来没有在 Matlab 中做过这样的事情。
描述极限环的方程如下:
x_1d=x_2
x_2d=-x_1+x_2-2*(x_1+2*x_2)x_2^2
它将以 (0,0)
的平衡点为中心你们能帮帮我吗?
如果您使用函数的偏导数来构建向量场,则可以使用流线来可视化您所描述的循环。
例如函数f = x^2+y^2
给我偏导数 dx = 2x, dy=2y 对于可视化,我从网格上的偏导数中采样。
[x,y] = meshgrid(0:0.1:1,0:0.1:1);
dx = 2*x;
dy = 2*y;
为了可视化矢量场,我使用 quiver
;
figure;
quiver(x, y, dx, dy);
使用流线,我可以想象注入矢量场的粒子的路径。在我的示例中,我将粒子注入 (0.1, 0.1)
streamline(x,y, dx, dy, 0.1, 0.1);
这会产生以下可视化结果
在您的情况下,您可以省略箭袋步骤以移除每个网格点的刺猬箭头。
这是另一个显示粒子会聚到轨道的例子。
编辑:您的函数。
因此,正如 knedlsepp 指出的那样,您感兴趣的功能有点含糊不清。在 Matlab 中,*
表示矩阵乘积,而 .*
表示矩阵之间的逐元素乘法。类似地,'^2' 表示矩阵 M
的 MM
,而 .^2
表示采用元素方式的幂。
所以,
[x_1,x_2] = meshgrid(-4:0.1:4,-4:0.1:4);
dx_1 = x_2;
dx_2 = -x_1+x_2-2*(x_1+2*x_2)*(x_2)^2;
figure; streamline(x_1,x_2, dx_1, dx_2, 0:0.1:4, 0:0.1:4);
看起来像
这个函数不会显示收敛,因为它不收敛。
knedlsepp 建议您真正感兴趣的功能是
dx_1 = -1 * x_2;
dx_2 = -1 * -x_1+x_2-2*(x_1+2*x_2).*(x_2).^2;
此 post 显示了生成矢量场积分线的代码,该矢量场定义为:
dx/dt = y
dy/dt = -x+y-2*(x+2*y)*y^2.
正确矢量化此函数很重要。 (即在所有重要的地方引入点)
dxdt = @(x,y) y;
dydt = @(x,y) -x+y-2*(x+2*y).*y.^2;
[X,Y] = meshgrid(linspace(-4,4,100));
[sx,sy] = meshgrid(linspace(-3,3,20));
streamline(stream2(X, Y, ... % Points
dxdt(X,Y), dydt(X,Y),... % Derivatives
sx, sy)); % Starting points
axis equal tight
要获得与您的照片更相似的图片,请更改网格大小和起点:
[X,Y] = meshgrid(linspace(-1,1,100));
[sx,sy] = meshgrid(linspace(0,0.75,20),0.2);