参考链接:【控制算法】ADRC自抗扰控制
跟踪微分器示例高频颤振
% 跟踪微分器示例高频颤振
% 参数设置
r = 10; % 常数r
h = 0.01; % 步长h
% 初始化变量
N = 1000; % 迭代次数
x1 = zeros(N, 1); % x1(k)的存储数组
x2 = zeros(N, 1); % x2(k)的存储数组
u = zeros(N, 1); % u(k)的存储数组
f = zeros(N, 1); % f的存储数组
% 初始状态
x1(1) = 0;
x2(1) = 0;
% 迭代计算
for k = 1:N-1
% 计算控制信号u(k)
u(k) = 1; % 这里仅作为示例,可以根据需要修改为不同的输入信号
% 计算跟踪微分器的输出f(k)
f(k) = -r * sign(x1(k) - u(k) + x2(k)*abs(x2(k))/(2*r));
% 更新状态方程
x1(k+1) = x1(k) + h * x2(k);
x2(k+1) = x2(k) + h * f(k);
end
u(k+1) = 1;
% 绘制跟踪效果
t = (0:N-1) * h; % 时间轴
figure;
plot(t, x1, 'b', 'LineWidth', 1.5);
hold on;
plot(t, u, 'r--', 'LineWidth', 1.5);
xlabel('时间');
ylabel('跟踪器输出');
legend('x1(k)', 'u(k)');
title('跟踪微分器的跟踪效果展示');
grid on;
跟踪微分器示例正常跟踪
% 跟踪微分器示例正常跟踪
function main()
% 控制参数
r = 10; % 调节参数
h = 0.01; % 采样时间步长
% 初始化状态变量
x1 = 0; % 初始状态变量 x1
x2 = 0; % 初始状态变量 x2
% 模拟阶跃响应
t = 0:h:10; % 时间范围
u = 1 * ones(size(t)); % 阶跃输入信号
y = zeros(size(t)); % 输出信号
% 期望轨迹
ref = ones(size(t)); % 期望轨迹
% 循环计算状态变量和输出信号
for k = 1:length(t)
fh = fhan(x1 - u(k), x2, r, h); % 计算控制量 fh
x1 = x1 + h * x2; % 更新状态变量 x1
x2 = x2 + h * fh; % 更新状态变量 x2
y(k) = x1; % 记录输出信号
end
% 绘制阶跃响应曲线和期望轨迹
figure;
plot(t, y, 'b', t, ref, 'r--');
xlabel('时间');
ylabel('输出信号');
legend('跟踪曲线', '期望曲线');
title('跟踪曲线与期望曲线');
end
function fh = fhan(x1, x2, r, h)
d = r * h^2;
a0 = h * x2;
y = x1 + a0;
a1 = sqrt(d * (d + 8 * abs(y)));
a2 = a0 + sign(y) * (a1 - d) / 2;
fsg1 = (sign(y + d) - sign(y - d)) / 2;
a = (a0 + y - a2) * fsg1 + a2;
fsg2 = (sign(a + d) - sign(a - d)) / 2;
fhan = -r * ((a / d) - sign(a)) * fsg2 - r * sign(a);
fh = fhan;
end
ESO状态估计
function adrc_eso_tracking()
% 系统参数
h = 0.01; % 采样时间步长
delta = 0.2; % 死区参数
alpha = 0.5; % 非线性函数alpha参数
beta01 = 10.5; % 调节器参数
beta02 = 6.2;
beta03 = 5.8;
bu = 1; % 输入信号bu
% 初始状态
z1 = 0.5;
z2 = 0;
z3 = 0;
t = 0; % 时间
freq = 1; % 期望曲线的频率
% 存储跟踪结果和期望曲线的向量
z1_history = [];
y_history = [];
% ADRC-ESO控制器
for k = 1:1000
e = z1 - sin(freq * t); % 计算误差,期望曲线为sin函数
fe = fal(e, alpha, delta);
fel = fal(e, 0.25, delta);
z1 = z1 + h * (z2 - beta01 * e);
z2 = z2 + h * (z3 - beta02 * fe + bu);
z3 = z3 + h * (-beta03 * fel);
t = t + h; % 更新时间
% 保存当前z1值和目标值到历史记录中
z1_history = [z1_history, z1];
y_history = [y_history, sin(freq * t)];
end
% 绘制跟踪结果和期望曲线的图形
figure;
plot(1:length(z1_history), z1_history, 'b', 'LineWidth', 2);
hold on;
plot(1:length(y_history), y_history, 'r--', 'LineWidth', 2);
hold off;
xlabel('时间步长');
ylabel('z1 / y');
legend('观测状态', '实际状态');
title('ADRC-ESO观测效果');
end
function output = fal(e, alpha, delta)
if abs(e) > delta
output = abs(e)^alpha * sign(e);
else
output = e / delta^(1 - alpha);
end
end