正不变集(Positive invariant set)的形象理解

给定一个动态系统:\dot{x}=f(x)

设:系统运动轨迹为x(t, x_0),其中x_0是初始点。

假设存在一个集合O = \{ x\in \mathbb{R}^n | \phi(x) = 0 \},其中 \phi(x)是一个实函数。

如果集合满足:初始点x_0\in O,且对于\forall t \geq 0x(t, x_0) \in O。则称集合O是一个正不变集。

形象的理解如下图所示:

圆锥是个正不变集,圆球是一个有初速度的运动体,球的轨迹始终会在圆锥内,圆锥是个正不变集。

个人理解,有哪里不对的地方感谢指出。

 

close all; clear; clc;
[xS, yS, zS] = sphere(6);       % 球形数据
sphereRatio = 0.03; xS = sphereRatio*xS; yS = sphereRatio*yS; zS = sphereRatio*zS;
[X,Y,Z] = cylinder([0 sqrt(3)/3], 30);   % 圆锥数据
x_new = 0; y_new = sqrt(3)/3; z_new = 1; idx = 1;
figure(1); set(gcf, 'position', [1920+0 0 1280 600]);
set(gcf, 'Color', 'w');
%% ==============================
subplot(1,2,2); hold on;
contour(X,Y,Z);
title('俯视图'); set(gca, 'FontSize', 16);
xlabel('x'); ylabel('y'); axis equal; grid minor;
handle2DLine = animatedline('Color', 'r', 'LineStyle', '--');
circle(x_new, y_new, sphereRatio, 'b');

subplot(1,2,1); hold on;
mesh(X,Y,Z, 'FaceColor', 'interp', 'FaceAlpha', 0.5, 'EdgeColor', 'k', 'EdgeAlpha', 0, 'LineStyle', '-');
colormap gray;
title('三维视图'); view(-45, 20); set(gca, 'FontSize', 16);
xlabel('x'); ylabel('y'); zlabel('z'); axis equal; grid minor;
handle3DLine = animatedline('Color', 'r', 'LineStyle', '--');
surf(x_new+xS, y_new+yS, z_new+zS, 'FaceColor', 'b','FaceAlpha',0.5,'EdgeColor', 'b', 'EdgeAlpha',1, 'LineStyle', '-');

%% 仿真数据
handleLast = [];
deltaT = 0.05;
vHorizontal = 1; vVertical = 1e-10;

while(z_new > 0)
    x = z_new / sqrt(3) * x_new / sqrt(x_new^2 + y_new^2);
    y = z_new / sqrt(3) * y_new / sqrt(x_new^2 + y_new^2);
    z = z_new;
    delete(handleLast);
    subplot(1,2,1); handle3D = surf(x+xS, y+yS, z+zS, 'FaceColor', 'r','FaceAlpha',0.5,'EdgeColor', 'r', 'EdgeAlpha',1, 'LineStyle', '-');
    handle = legend('$O$', '$x(t, x_0)$', '$x_0$', '$x_{now}$', 'Position', [480 380 0 0]);
    set(handle,'Interpreter','latex', 'FontSize', 12);
    subplot(1,2,2); handle2D = circle(x, y, sphereRatio, 'r');
    
%     handle = legend('$O$', '$x(t, x_0)$', '$x_0$');
%     set(handle,'Interpreter','latex', 'FontSize', 12);
    
    addpoints(handle2DLine, x, y);
    addpoints(handle3DLine, x, y, z);
    handleLast(1) = handle3D; handleLast(2) = handle2D;
    x_new =  deltaT * vHorizontal * y / sqrt(x^2 + y^2) + x;
    y_new = -deltaT * vHorizontal * x / sqrt(x^2 + y^2) + y;
    z_new = -deltaT * vVertical * sqrt(3) / 2 + z;
    vVertical = sqrt(vVertical^2 + 2*1*(z - z_new));
    im(idx) = getframe(1);            % 获取当前图形
    idx = idx + 1;
    
    drawnow;
end

filename = 'simPicture.gif'; % Specify the output file name
for idx = 1:size(im, 2)
    [A,map] = rgb2ind(frame2im(im(idx)),256);
    if idx == 1
        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1e-1);
    else
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1e-1);
    end
end

%% ==============================
function handle2D = circle( x,y,r,c )
    handle2D = rectangle('Position',[x-r,y-r,2*r,2*r],'Curvature',[1,1],'linewidth',1,...
        'FaceColor', c);
end


 

  • 27
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值