二阶多智能体的一致性-包含matlab仿真代码

模型

这里仅用一个简单的双积分模型
{ x ˙ i = v i v ˙ i = u i \begin{equation} \begin{cases} {\dot x}_i = v_i \\ {\dot v}_i = u_i \\ \end{cases} \end{equation} {x˙i=viv˙i=ui
我们的控制最终的期望是使得状态趋于一致,即
lim ⁡ t → ∞ ∣ x i − x j ∣ = 0 lim ⁡ t → ∞ ∣ v i − v j ∣ = 0 \begin{aligned} \lim_{t \to \infty} |x_i - x_j| = 0 \\ \lim_{t \to \infty} |v_i - v_j| = 0 \\ \end{aligned} tlimxixj=0tlimvivj=0

协议

这里我们用一个简单的控制协议
u i = − k 1 ∑ j = 1 N ( x i − x j ) − k 2 ∑ j = 1 N ( v i − v j ) u_i = -k_1 \sum_{j=1}^N (x_i - x_j) - k_2 \sum_{j=1}^N (v_i - v_j) ui=k1j=1N(xixj)k2j=1N(vivj)

代码

clear;
close all;
clc;

% 拉普拉斯矩阵作为全局变量
global L;
% 图论
A=[0 1 0 0 1;
   1 0 1 0 0;
   0 1 0 1 0;
   0 0 1 0 1;
   1 0 0 1 0];
D=diag(sum(A,2));
L=D-A;
% 初始化
X0=[0;-1;2;1.5;1.2];
V0=[0;1;2;-1.5;-2];
% 迭代
options = odeset('MaxStep', 1e-2, 'RelTol',1e-2,'AbsTol',1e-4);
[t,y] = ode45(@odefun,[0 15],[X0;V0],options);
X = y(:,1:5);
V = y(:,6:10);
U_save=[];

% 重现控制量U
for i = 1:length(t)
    eX = L*y(i,1:5)';
    eV = L*y(i,6:10)';
    eu = controlInput(eX, eV);
    U_save = [U_save;eu'];
end

%% 画图部分
fig1 = figure(1);
plot(t,X);
xlabel('t(sec)');
ylabel('position');

fig2 = figure(2);
plot(t,V);
xlabel('t(sec)');
ylabel('velocity');

fig3 = figure(3);
plot(t,U_save);
xlabel('t(sec)');
ylabel('u');

print(fig1, './fig1.png', '-dpng', '-r300');
print(fig2, './fig2.png', '-dpng', '-r300');
print(fig3, './fig3.png', '-dpng', '-r300');


%% 函数部分
function dydt = odefun(t,y)
    global L;
    dydt = zeros(10,1);
    
    eX = L*y(1:5);
    eV = L*y(6:10);
    U = controlInput(eX,eV);
    
    dydt(1:5)=y(6:10);
    dydt(6:10)=U;
end

%% 计算输入
function u = controlInput(eX, eV)
    k1 = 1;
    k2 = 1;
    u = - k1 .* eX - k2 .* eV;
end

仿真

位置
二阶多智能体的一致性-包含matlab仿真代码_第1张图片
速度
二阶多智能体的一致性-包含matlab仿真代码_第2张图片
控制量
二阶多智能体的一致性-包含matlab仿真代码_第3张图片

你可能感兴趣的:(控制理论,matlab,开发语言)