ADRC自抗扰控制

参考链接:【控制算法】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

你可能感兴趣的:(伺服系统,算法,ADRC)