ARDC代码实现以及验证

ADRC自抗扰实验测试

1.ADRC的MATLAB实验仿真

ADRC主要由三部分组成:
微分跟踪器TD、扩张状态观测器ESO和非线性误差反馈律组成。
本次实验基于韩京清老师提出的非线性ADRC进行实验测试
整体代码如下所示:

clc
clear
close all


h=0.001;%采样时间
h0=10*h;h1=10;
b=2;
c=1.5;%阻尼因子
b0=2;%假设已知参数b
r0=20;r=20;%自己设定的参数
beta1=12;%关键参数,ESO的参数需要调节的
num=1;
den=[1 1 1];
ts=0.001;
sys=tf(num,den);
dsys=c2d(sys,ts,'zoh');
[num,den]=tfdata(dsys,'v');
y_1=0.0;y_2=0.0;
u_1=0.0;u_2=0.0;
e_1=0.0;
delta=8*h;
tend=25;
t=0:h:tend;
v=sin(t);
dv=cos(t);
x1=zeros(tend/h,1);
x2=zeros(tend/h,1);

z1=zeros(tend/h,1);
z2=zeros(tend/h,1);
z3=zeros(tend/h,1);
e1=zeros(tend/h,1);
e2=zeros(tend/h,1);
u0=zeros(tend/h,1);
u=zeros(tend/h+1,1);
y=zeros(tend/h+1,1);
kasy=zeros(tend/h,1);

%%
for k=1:1:tend/h
    % TD微分跟踪以及过渡过程:
    fh=fhan((x1(k)-v(k)),x2(k),r0,h0);
    x1(k+1)=x1(k)+h*x2(k);
    x2(k+1)=x2(k)+h*fh;
    
    % NLSEF函数设计
    e1(k)=x1(k)-z1(k);
    e2(k)=x2(k)-z2(k);
    %u0(k)=fhan(e1(k),c*e2(k),r,h1);
    u0(k)=50*fal(e1(k),0.8,delta)+50*fal(e2(k),1.5,delta);
    
    u(k)=(u0(k)-z3(k))/b0;
    
    
    %被控对象传函描述
    %二阶系统被控对象传函
    y(k)=-den(3)*y_2-den(2)*y_1+num(2)*u_1+num(3)*u_2;
    
            %扩张状态观测ESO设计
    kasy(k)=z1(k)-y(k);
    z1(k+1)=z1(k)+h*(z2(k)-beta1*kasy(k));
    z2(k+1)=z2(k)+h*(z3(k)-beta1*fal(kasy(k),1/2,delta)+b*u(k));
    z3(k+1)=z3(k)-h*beta1*fal(kasy(k),1/4,delta);

    
    %更新状态
    u_1=u(k);
    y_2=y_1;
    y_1=y(k);
    
end

%%
figure(1)
plot(t,v,t,z1,'linewidth',2)
legend("v(t)","z1(t)")
grid on
figure(2)
plot(t,y,t,v,'linewidth',2)
legend("y(t)","v(t)")
grid on
figure(3)
plot(t,z3,'linewidth',2)


ADRC测试结果验证

在这里插入图片描述
状态观测器构建的状态z1可以有效跟踪上输入参数v,验证ESO有效性;
在这里插入图片描述
系统输出可以有效跟上模型输入v,验证了ADRC模型有效性。

与PID控制器的比较

在相同被控对象传函的条件下,进行比较:
PID测试部分代码如下:

clc
clear 
close all

ts=0.001;
sys=tf(1,[1,1,1]);
dsys=c2d(sys,ts,'zoh')
[num,den]=tfdata(dsys,'v')
u_1=0.0;u_2=0.0;
y_1=0.0;y_2=0.0;
e_1=0.0;ei=0.0;
yd=1.0;
kp=8;ki=0.5;kd=0.1;

for k=1:1:30000
    time(k)=k*ts;
    
    y(k)=-den(3)*y_2-den(2)*y_1+num(2)*u_1+num(3)*u_2;
    yd(k)=sin(k*ts);
    e(k)=yd(k)-y(k);
    
    ei=e(k)*ts+ei;
    u(k)=kp*e(k)+ei*ki+kd*(e(k)-e_1)/ts;
    
    u_2=u_1;u_1=u(k);
    y_2=y_1;y_1=y(k);
    e_1=e(k);
end
figure(1)
plot(time,y,time,yd,'linewidth',2)
grid on

测试结果如下所示:
在这里插入图片描述

同样观察仿真曲线发现,PID同样可以有效跟踪上系统输入。

本次实验仅仅验证了ADRC模型有效性,未验证最优参数,所以结果可能不是最优的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值