88彩介绍

88彩介绍

多智能体一致性控制和容错性控制

2025-10-09

%% 1. 清空环境与参数初始化

clear; clc; close all;

%% 2. 核心参数设置(无修改,确保n_agent=4)

n_agent = 4; % 智能体数量(明确设为4)

t_sim = 10; % 仿真总时间(秒)

dt = 0.01; % 时间步长

t = 0:dt:t_sim; % 时间向量

n_step = length(t); % 总迭代步数

% 通信拓扑:无向星型邻接矩阵A(4智能体)

A = [

0 1 1 1; % 智能体1连接2、3、4

1 0 0 0; % 智能体2连接1

1 0 0 0; % 智能体3连接1(故障体)

1 0 0 0 % 智能体4连接1

];

% 控制与故障参数

k_normal = 2; % 正常控制增益

k_fault = 5; % 故障后控制增益

fault_agent = 3; % 故障智能体编号

fault_step = 300; % 故障时刻(t=3秒,第300步)

fault_ratio = 0.3; % 故障执行器效率

% 初始状态与状态矩阵(4智能体初始状态不同,确保轨迹有差异)

x0 = [10, 2, 15, 5]; % 智能体1=10,2=2,3=15,4=5(初始状态差异明显)

x = zeros(n_agent, n_step); % 行=4个智能体,列=时间步

x(:,1) = x0;

% 拉普拉斯矩阵L

D = diag(sum(A, 2)); % 度矩阵(对角元素=邻居数)

L = D - A; % 拉普拉斯矩阵

%% 3. 仿真迭代(无修改,确保4智能体状态正常更新)

for step = 2:n_step

% 切换控制增益(故障前后)

if step <= fault_step

k = k_normal;

fault_flag = 0;

else

k = k_fault;

fault_flag = 1;

end

% 计算控制输入u(4智能体分别计算)

u = zeros(n_agent, 1);

Lx = L * x(:, step-1);

for i = 1:n_agent

u(i) = -k * Lx(i); % 4智能体各有独立控制输入

% 容错处理(仅智能体3故障)

if fault_flag && (i == fault_agent)

u(i) = u(i) * fault_ratio;

end

end

% 状态更新(4智能体状态同步更新)

x(:, step) = x(:, step-1) + u * dt;

end

%% 4. 结果可视化(重点修正:绘图前开启hold on,确保4条轨迹全显示)

figure('Position', [100, 100, 1000, 700]);

colors = ['r', 'g', 'm', 'b']; % 4种颜色,对应4个智能体(红1、绿2、品3、蓝4)

% 4.1 状态轨迹(修正:循环前开启hold on)

subplot(3,1,1);

hold on; % 关键修正:在绘图循环前开启,所有轨迹叠加显示

for i = 1:n_agent % 遍历4个智能体,绘制各自轨迹

plot(t, x(i,:), colors(i), 'LineWidth', 2, ...

'DisplayName', sprintf('智能体%d', i)); % 每个智能体标签不同

end

% 绘制故障时刻线

plot([t(fault_step), t(fault_step)], [min(x(:)), max(x(:))], ...

'k--', 'LineWidth', 1.5, 'DisplayName', '故障时刻(t=3s)');

xlabel('时间 t (s)'); ylabel('智能体状态 x_i');

title('4智能体一致性轨迹(红1、绿2、品3、蓝4)');

legend('Location', 'best'); % 显示4个智能体图例

grid on;

hold off; % 结束当前图的hold on

% 4.2 一致性误差(同理:循环前开启hold on)

subplot(3,1,2);

hold on; % 修正:循环前开启hold on

x_mean = mean(x, 1); % 4智能体状态平均值

for i = 1:n_agent

error_i = abs(x(i,:) - x_mean); % 每个智能体的一致性误差

plot(t, error_i, colors(i), 'LineWidth', 1.5, ...

'DisplayName', sprintf('智能体%d误差', i));

end

% 绘制故障时刻线

plot([t(fault_step), t(fault_step)], [0, max(abs(x(:)-x_mean))], ...

'k--', 'LineWidth', 1.5, 'DisplayName', '故障时刻(t=3s)');

xlabel('时间 t (s)'); ylabel('|x_i - 均值|');

title('4智能体一致性误差');

legend('Location', 'best');

grid on;

hold off;

% 4.3 控制输入(同理:循环前开启hold on)

subplot(3,1,3);

hold on; % 修正:循环前开启hold on

u_plot = zeros(n_agent, n_step);

for step = 1:n_step-1

% 确定当前控制增益(if-else替代三目运算符)

if step <= fault_step

k = k_normal;

else

k = k_fault;

end

Lx = L * x(:, step);

for i = 1:n_agent

u_plot(i, step) = -k * Lx(i);

% 故障体输入衰减

if step > fault_step && i == fault_agent

u_plot(i, step) = u_plot(i, step) * fault_ratio;

end

end

end

u_plot(:, end) = u_plot(:, end-1); % 补全最后一步输入

% 绘制4个智能体的控制输入

for i = 1:n_agent

plot(t, u_plot(i,:), colors(i), 'LineWidth', 1.5, ...

'DisplayName', sprintf('智能体%d输入', i));

end

% 绘制故障时刻线

plot([t(fault_step), t(fault_step)], [min(u_plot(:)), max(u_plot(:))], ...

'k--', 'LineWidth', 1.5, 'DisplayName', '故障时刻(t=3s)');

xlabel('时间 t (s)'); ylabel('控制输入 u_i');

title('4智能体控制输入变化');

legend('Location', 'best');

grid on;

hold off;

%% 5. 结果输出(无修改,验证4智能体状态)

fprintf('==================== 4智能体仿真结果 ====================\n');

% 输出4个智能体的初始状态和最终状态

fprintf('初始状态:智能体1=%.1f, 智能体2=%.1f, 智能体3=%.1f, 智能体4=%.1f\n', ...

x0(1), x0(2), x0(3), x0(4));

fprintf('最终状态:智能体1=%.6f, 智能体2=%.6f, 智能体3=%.6f, 智能体4=%.6f\n', ...

x(1,end), x(2,end), x(3,end), x(4,end));

% 输出一致性误差

normal_error = max(abs(x(:, fault_step) - mean(x(:, fault_step))));

stable_step = find(t>=8, 1, 'first');

fault_error = max(abs(x(:, stable_step:end) - mean(x(:, stable_step:end), 1)));

fprintf('正常阶段最大误差:%.6f\n', normal_error);

fprintf('故障后稳定误差:%.6f\n', fault_error);

fprintf('=========================================================\n');

88彩介绍

Powered by 88彩 RSS地图 HTML地图

Copyright Powered by365站群 © 2013-2024