Olfati-Saber 04 first-order multi-agent switching topology consistency

The classic work on multi-agent consensus:

Consensus problems in networks of agents with switching topology and time-delays | IEEE Journals & amp; Magazine | IEEE Xplore

This article only does the simulation of the switching topology part

Code reference Zhao-Jichao boss
https://zhaojichao.blog.csdn.net/article/details/125792570

System model:

x

˙

i

=

u

i

{\dot x_i} = {u_i}

x˙i?=ui?
Control protocol:

u

i

=

?

j

=

1

N

a

i

j

(

x

i

?

x

j

)

{u_i} = – \sum\limits_{j = 1}^N {{a_{ij}}\left( {{x_i} – {x_j }} \right)}

ui?=?j=1∑N?aij?(xixj?)
The four topologies used for switching are as follows:

The topology switching sequence is as follows:

Lyapunov funtion for disagreement:

V

(

δ

)

=

1

2

δ

2

V\left( \delta \right) = \frac{1}{2}{\left\| \delta \right\|^2}

V(δ)=21?∥δ∥2
because

alpha

=

A

v

e

(

x

)

=

0

\alpha = Ave(x) = 0

α=Ave(x)=0
again

x

=

alpha

1

+

δ

x = \alpha {\bf{1}} + \delta

x=α1 + δ
therefore

V

(

δ

)

=

1

2

δ

2

=

1

2

x

2

V\left( \delta \right) = \frac{1}{2}{\left\| \delta \right\|^2} = \frac{1}{2 }{\left\| x \right\|^2}

V(δ)=21?∥δ∥2=21?∥x∥2

clear
clc
%% Laplacian Matrix
A1=[0 1 0 0 0 0 0 0 0 0;
    0 0 1 0 0 0 0 0 0 0;
    0 0 0 1 0 0 0 0 0 0;
    0 0 0 0 1 0 0 0 0 0;
    0 0 0 0 0 1 0 0 0 0;
    0 0 0 0 0 0 1 0 0 0;
    0 0 0 0 0 0 0 1 0 0;
    0 0 0 0 0 0 0 0 1 0;
    0 0 0 0 0 0 0 0 0 1;
    1 0 0 0 0 0 0 0 0 0;];
D1=diag(sum(A1,2));
L1=D1 - A1;

A2=[0 1 0 0 0 0 0 0 0 0;
    0 0 1 0 0 0 0 0 0 1;
    0 0 0 1 0 0 0 1 0 0;
    0 0 0 0 1 1 0 0 0 0;
    0 0 0 0 0 1 0 0 0 0;
    0 0 0 1 0 0 1 0 0 0;
    0 0 0 0 0 0 0 1 0 0;
    0 0 1 0 0 0 0 0 1 0;
    0 0 0 0 0 0 0 0 0 1;
    1 1 0 0 0 0 0 0 0 0;];
D2=diag(sum(A2,2));
L2=D2 - A2;

A3=[0 1 0 0 0 0 0 0 1 0;
    0 0 1 0 0 0 0 0 0 0;
    0 0 0 1 0 0 0 0 0 0;
    0 0 0 0 1 0 0 1 0 0;
    0 0 0 0 0 1 0 0 0 0;
    0 0 0 0 0 0 1 0 0 0;
    0 0 0 0 0 0 0 1 0 0;
    0 0 0 1 0 0 0 0 1 0;
    1 0 0 0 0 0 0 0 0 1;
    1 0 0 0 0 0 0 0 0 0;];
D3=diag(sum(A3,2));
L3=D3 - A3;

A4=[0 1 0 0 0 0 0 0 1 0;
    0 0 1 0 0 0 0 1 0 0;
    0 0 0 1 0 0 0 0 0 0;
    0 0 0 0 1 0 0 1 0 0;
    0 0 0 0 0 1 1 0 0 0;
    0 0 0 0 0 0 1 0 0 0;
    0 0 0 0 1 0 0 1 0 0;
    0 1 0 1 0 0 0 0 1 0;
    1 0 0 0 0 0 0 0 0 1;
    1 0 0 0 0 0 0 0 0 0;];
D4=diag(sum(A4,2));
L4=D4 - A4;

%% Initial States
x_1(:,1) = 2;
x_8(:,1) = -2;
x_2(:,1) = 1;
x_7(:,1) = -1;
x_3(:,1) = 0.5;
x_5(:,1) = -0.5;
x_10(:,1)= -1.5;
x_4(:,1) = 1.5;
x_6(:,1) = 2.5;
x_9(:,1) = -2.5;

%%Time parameters
tBegin = 0;
tFinal = 10.5;
dT = 0.01;
times = (tFinal-tBegin)/dT;
t(1,1) = 0;

%% Iteration Calculate
for i=1:times
    % record time
    t(:,i + 1) = t(:,i) + dT;

% switch topology b-a-d-c
if mod(t(:,i),4) >= 0 & amp; & amp; mod(t(:,i),4) < 1
    L = L2;
end
if mod(t(:,i),4) >= 1 & amp; & amp; mod(t(:,i),4) < 2
    L = L1;
end
if mod(t(:,i),4) >= 2 & amp; & amp; mod(t(:,i),4) < 3
    L = L4;
end
if mod(t(:,i),4) >= 3 & amp; & amp; mod(t(:,i),4) < 4
    L = L3;
end

%% calculate control inputs
%Note: Enter directly behind the cursor of the line-wrapping code ... and then press Enter once, indicating that there is still an operation relationship between the previous line and the next line.
u_1(i,:) = -L(1,1)*(x_1(i,:)-x_1(i,:)) - L(1,2)*(x_2(i,:)-x_1(i, :)) - L(1,3)*(x_3(i,:)-x_1(i,:)) - L(1,4)*(x_4(i,:)-x_1(i,:)) - L(1,5)*(x_5(i,:)-x_1(i,:))...
     - L(1,6)*(x_6(i,:)-x_1(i,:)) - L(1,7)*(x_7(i,:)-x_1(i,:)) - L(1 ,8)*(x_8(i,:)-x_1(i,:)) - L(1,9)*(x_9(i,:)-x_1(i,:)) - L(1,10)* (x_10(i,:)-x_1(i,:));

u_2(i,:) = -L(2,1)*(x_1(i,:)-x_2(i,:)) - L(2,2)*(x_2(i,:)-x_2(i, :)) - L(2,3)*(x_3(i,:)-x_2(i,:)) - L(2,4)*(x_4(i,:)-x_2(i,:)) - L(2,5)*(x_5(i,:)-x_2(i,:))...
     - L(2,6)*(x_6(i,:)-x_2(i,:)) - L(2,7)*(x_7(i,:)-x_2(i,:)) - L(2 ,8)*(x_8(i,:)-x_2(i,:)) - L(2,9)*(x_9(i,:)-x_2(i,:)) - L(2,10)* (x_10(i,:)-x_2(i,:));
     
u_3(i,:) = -L(3,1)*(x_1(i,:)-x_3(i,:)) - L(3,2)*(x_2(i,:)-x_3(i, :)) - L(3,3)*(x_3(i,:)-x_3(i,:)) - L(3,4)*(x_4(i,:)-x_3(i,:)) - L(3,5)*(x_5(i,:)-x_3(i,:))...
     - L(3,6)*(x_6(i,:)-x_3(i,:)) - L(3,7)*(x_7(i,:)-x_3(i,:)) - L(3 ,8)*(x_8(i,:)-x_3(i,:)) - L(3,9)*(x_9(i,:)-x_3(i,:)) - L(3,10)* (x_10(i,:)-x_3(i,:));
     
u_4(i,:) = -L(4,1)*(x_1(i,:)-x_4(i,:)) - L(4,2)*(x_2(i,:)-x_4(i, :)) - L(4,3)*(x_3(i,:)-x_4(i,:)) - L(4,4)*(x_4(i,:)-x_4(i,:)) - L(4,5)*(x_5(i,:)-x_4(i,:))...
     - L(4,6)*(x_6(i,:)-x_4(i,:)) - L(4,7)*(x_7(i,:)-x_4(i,:)) - L(4 ,8)*(x_8(i,:)-x_4(i,:)) - L(4,9)*(x_9(i,:)-x_4(i,:)) - L(4,10)* (x_10(i,:)-x_4(i,:));

u_5(i,:) = -L(5,1)*(x_1(i,:)-x_5(i,:)) - L(5,2)*(x_2(i,:)-x_5(i, :)) - L(5,3)*(x_3(i,:)-x_5(i,:)) - L(5,4)*(x_4(i,:)-x_5(i,:)) - L(5,5)*(x_5(i,:)-x_5(i,:))...
     - L(5,6)*(x_6(i,:)-x_5(i,:)) - L(5,7)*(x_7(i,:)-x_5(i,:)) - L(5 ,8)*(x_8(i,:)-x_5(i,:)) - L(5,9)*(x_9(i,:)-x_5(i,:)) - L(5,10)* (x_10(i,:)-x_5(i,:));
     
u_6(i,:) = -L(6,1)*(x_1(i,:)-x_6(i,:)) - L(6,2)*(x_2(i,:)-x_6(i, :)) - L(6,3)*(x_3(i,:)-x_6(i,:)) - L(6,4)*(x_4(i,:)-x_6(i,:)) - L(6,5)*(x_5(i,:)-x_6(i,:))...
     - L(6,6)*(x_6(i,:)-x_6(i,:)) - L(6,7)*(x_7(i,:)-x_6(i,:)) - L(6 ,8)*(x_8(i,:)-x_6(i,:)) - L(6,9)*(x_9(i,:)-x_6(i,:)) - L(6,10)* (x_10(i,:)-x_6(i,:));
     
u_7(i,:) = -L(7,1)*(x_1(i,:)-x_7(i,:)) - L(7,2)*(x_2(i,:)-x_7(i, :)) - L(7,3)*(x_3(i,:)-x_7(i,:)) - L(7,4)*(x_4(i,:)-x_7(i,:)) - L(7,5)*(x_5(i,:)-x_7(i,:))...
     - L(7,6)*(x_6(i,:)-x_7(i,:)) - L(7,7)*(x_7(i,:)-x_7(i,:)) - L(7 ,8)*(x_8(i,:)-x_7(i,:)) - L(7,9)*(x_9(i,:)-x_7(i,:)) - L(7,10)* (x_10(i,:)-x_7(i,:));
     
u_8(i,:) = -L(8,1)*(x_1(i,:)-x_8(i,:)) - L(8,2)*(x_2(i,:)-x_8(i, :)) - L(8,3)*(x_3(i,:)-x_8(i,:)) - L(8,4)*(x_4(i,:)-x_8(i,:)) - L(8,5)*(x_5(i,:)-x_8(i,:))...
     - L(8,6)*(x_6(i,:)-x_8(i,:)) - L(8,7)*(x_7(i,:)-x_8(i,:)) - L(8 ,8)*(x_8(i,:)-x_8(i,:)) - L(8,9)*(x_9(i,:)-x_8(i,:)) - L(8,10)* (x_10(i,:)-x_8(i,:));
     
u_9(i,:) = -L(9,1)*(x_1(i,:)-x_9(i,:)) - L(9,2)*(x_2(i,:)-x_9(i, :)) - L(9,3)*(x_3(i,:)-x_9(i,:)) - L(9,4)*(x_4(i,:)-x_9(i,:)) - L(9,5)*(x_5(i,:)-x_9(i,:))...
     - L(9,6)*(x_6(i,:)-x_9(i,:)) - L(9,7)*(x_7(i,:)-x_9(i,:)) - L(9 ,8)*(x_8(i,:)-x_9(i,:)) - L(9,9)*(x_9(i,:)-x_9(i,:)) - L(9,10)* (x_10(i,:)-x_9(i,:));
     
u_10(i,:) = -L(10,1)*(x_1(i,:)-x_10(i,:)) - L(10,2)*(x_2(i,:)-x_10(i, :)) - L(10,3)*(x_3(i,:)-x_10(i,:)) - L(10,4)*(x_4(i,:)-x_10(i,:)) - L(10,5)*(x_5(i,:)-x_10(i,:))...
   - L(10,6)*(x_6(i,:)-x_10(i,:)) - L(10,7)*(x_7(i,:)-x_10(i,:)) - L(10 ,8)*(x_8(i,:)-x_10(i,:)) - L(10,9)*(x_9(i,:)-x_10(i,:)) - L(10,10)* (x_10(i,:)-x_10(i,:));
   
u_1(i + 1,:)=u_1(i,:);
u_2(i + 1,:)=u_2(i,:);
u_3(i + 1,:)=u_3(i,:);
u_4(i + 1,:)=u_4(i,:);
u_5(i + 1,:)=u_5(i,:);
u_6(i + 1,:)=u_6(i,:);
u_7(i + 1,:)=u_7(i,:);
u_8(i + 1,:)=u_8(i,:);
u_9(i + 1,:)=u_9(i,:);
u_10(i + 1,:)=u_10(i,:);
% update statuses
x_1(i + 1,1) = x_1(i,1) + dT*u_1(i,:);
x_2(i + 1,1) = x_2(i,1) + dT*u_2(i,:);
x_3(i + 1,1) = x_3(i,1) + dT*u_3(i,:);
x_4(i + 1,1) = x_4(i,1) + dT*u_4(i,:);
x_5(i + 1,1) = x_5(i,1) + dT*u_5(i,:);
x_6(i + 1,1) = x_6(i,1) + dT*u_6(i,:);
x_7(i + 1,1) = x_7(i,1) + dT*u_7(i,:);
x_8(i + 1,1) = x_8(i,1) + dT*u_8(i,:);
x_9(i + 1,1) = x_9(i,1) + dT*u_9(i,:);
x_10(i + 1,1)=x_10(i,1) + dT*u_10(i,:);
   
delta(i,:) =0.5* ( x_1(i,:)*x_1(i,:) + x_2(i,:)*x_2(i,:) + x_3(i,:)*x_3(i,: ) + x_4(i,:)*x_4(i,:) + x_5(i,:)*x_5(i,:) + x_6(i,:)*x_6(i,:) ...
      + x_7(i,:)*x_7(i,:) + x_8(i,:)*x_8(i,:) + x_9(i,:)*x_9(i,:) + x_10(i,:)* x_10(i,:) );
delta(i + 1,:) = delta(i,:);

end

%% Draw graphs
figure(1)
plot(t,x_1, t,x_2, t,x_3, t,x_4, t,x_5, t,x_6, t,x_7, t,x_8, t,x_9, t,x_10, 'linewidth',1.5) ;
legend('$x_1$','$x_2$','$x_3$','$x_4$','$x_5$','$x_6$', '$x_7$','$x_8$','$x_9$','$x_{10}$', 'Interpreter','latex'); grid on
xlabel('$t$', 'Interpreter','latex');
ylabel('$x$', 'Interpreter','latex');
xlim([0,12])

figure(2)
plot(t,u_1, t,u_2, t,u_3, t,u_4, t,u_5, t,u_6, t,u_7, t,u_8, t,u_9, t,u_10, 'linewidth',1.5) ;
legend('$u_1$','$u_2$','$u_3$','$u_4$','$u_5$','$u_6$', '$u_7$','$u_8$','$u_9$','$u_{10}$', 'Interpreter','latex'); grid on
xlabel('$t$', 'Interpreter','latex');
ylabel('$u$', 'Interpreter','latex');
xlim([0,12])

figure(3)
plot(t,delta);
xlabel('$t$', 'Interpreter','latex');
ylabel('$disagreement$', 'Interpreter','latex');
xlim([0,12])


Figure 3 observes the switched topology input

u

u

u

R. Olfati-Saber and R. M. Murray, “Consensus problems in networks of agents with switching topology and time-delays,” in IEEE Transactions on Automatic Control, vol. 49, no. 9, pp. 1520-1533, Sept. 2004, doi: 10.1109/TAC.2004.834113.