本文章以最简单的二阶系统为例,介绍其simulink仿真实现和m代码实现

案例中的二阶系统如下所示

经典ADRC的基本结构如下:

本案例中的simulink仿真整体结构(为便于理解,结构图与上述ADRC整体结构类似)

仿真参数初始化所需m文件程序(文章尾部附有本仿真模型及m,文件支持matlab2017b以上)

%-----------ADRC参数初始化------------%
%参数初始化
%跟踪微分器
r=100;%表示跟踪快慢
h0=5*h;%h0代表信号的平滑程度(滤波效果)
v1_last=0;
v2_last=0;
v0_last=0;
%扩张状态观测器
beta01=10;
beta02=200;
beta03=30;
alpha1=0.5;%文献里给定值
alpha2=0.25;%给定值
delta=0.0025;
b=1;
z1_last=0;
z2_last=0;
z3_last=0;
%非线性误差反馈
nlsef_alpha1=0.7;
nlsef_alpha2=1;
%被控对象初始化
temp_y=[0.5;0];
u_last=0;

TD微分跟踪器结构如下所示

图中fst函数利用matlab_function搭建,内部代码如下所示

%fst函数
function fn=fst(x1,x2,r,h)
d=h*r;
d0=h*d;
y=x1+h*x2;
a0=sqrt(d^2+8*r*abs(y));
if abs(y)<=d0a=x2+y/h;
elsea=x2+0.5*(a0-d)*sgn(y);
end
fn=-r*sat(a,d);
end
%符号函数
function y=sgn(x)
if x>0y=1;
elseif x<0y=-1;
elsey=0
end
end
%sat函数
function y=sat(a,d)
if abs(a)<=dy=a/d;
elsey=sgn(a);
end
end
%符号函数

ESO扩张状态观测器结构如下所示

图中fal函数利用matlab_function搭建,内部代码如下所示

function y=fal(e,alpha,delta)
if abs(e)>deltay=sign(e)*abs(e)^alpha;
elsey=e/(delta^(1-alpha));
end
end

BLSEF非线性误差反馈控制律结构如下所示

图中fal函数利用matlab_function搭建,内部代码同上

典型被控系统结构如下所示

阶跃信号下输入/输出/跟踪信号仿真结果

系统输出的微分观测效果

系统非线性项的观测效果

系统仿真的m文件实现(想要深入理解实现过程的朋友可以尝试复现该代码)

m代码(ADRC控制器)

clc;clear all;close all;
%设定运行时间
time=10;
%设定仿真步长
h=0.01;
%时间定义
t=0.01:h:time;
%跟踪信号
v0=zeros(1,time/h);
for i=time/h/2+1:time/h;v0(i)=1;
end
rand_noise=0.05*randn(1,time/h);
%跟踪信号中加入随机噪声
vn=v0+rand_noise;
%-----------ADRC------------%
%参数初始化
%跟踪微分器
r=100;%表示跟踪快慢
h0=5*h;%h0代表信号的平滑程度(滤波效果)
v1_last=0;
v2_last=0;
v0_last=0;
%扩张状态观测器
beta01=10;
beta02=200;
beta03=30;
alpha1=0.5;%文献里给定值
alpha2=0.25;%给定值
delta=0.0025;
b=1;
z1_last=0;
z2_last=0;
z3_last=0;
%非线性误差反馈
nlsef_alpha1=0.7;
nlsef_alpha2=1;
%被控对象初始化
temp_y=[0.5;0];
u_last=0;
%----ADRC正式开始------%
for k=1:time/h%第一轮迭代处理%两个参数分别为控制量和当前时间parameter1=u_last;parameter2=k*h;tSpan=[0 h];%利用龙格库塔法求解微分方程[~,total_y]=ode45('PlantModel',tSpan,temp_y,[],parameter1,parameter2);%total_state里面的元素都是龙格塔库一点点计算的结果,直接使用最后一列,即计算结果即可temp_y=total_y(length(total_y),:);%寻访最后一行,全部列的元素%记录下输出和输出的微分y(k)=temp_y(1);dy(k)=temp_y(2);%---跟踪微分器TD----%v1(k)=v1_last+h*v2_last;v2(k)=v2_last+h*fst(v1_last-vn(k),v2_last,r,h0);x3(k)=-v1_last^2;v1_last=v1(k);v2_last=v2(k);v0_last=vn(k);%----扩张状态观测器--%e=z1_last-y(k);z1(k)=z1_last+h*(z2_last-beta01*e);z2(k)=z2_last+h*(z3_last-beta02*(fal(e,alpha1,delta))+b*u_last);z3(k)=z3_last-h*beta03*(fal(e,alpha2,delta));z1_last=z1(k);z2_last=z2(k);z3_last=z3(k);%---非线性误差反馈----%e1(k)=v1(k)-z1(k);e2(k)=v2(k)-z2(k);u0(k)=beta01*fal(e1(k),nlsef_alpha1,delta)+beta02*fal(e2(k),nlsef_alpha2,delta);u(k)=u0(k)-z3(k)/b;u_last=u(k);
end
figure(1);
plot(t,u,'r');
figure(2);
subplot(311);
plot(t,z1,'r',t,y,'k',t,vn,'b','linewidth',2);
xlabel('time(s)');ylabel('z1,y');
legend('目标输出信号','估计输出信号','实际输出信号');
subplot(312);
plot(t,z2,'r',t,dy,'k','linewidth',2);
xlabel('time(s)'),ylabel('z2,dy');
legend('估计输出微分信号','实际输出微分信号');
subplot(313);
plot(t,z3,'r',t,x3,'k','linewidth',2);
xlabel('time(s)'),ylabel('z3,x3');
legend('估计扰动','实际扰动');
%---------函数部分---------%
%sat函数
function y=sat(a,d)
if abs(a)<=dy=a/d;
elsey=sgn(a);
end
end
%符号函数
function y=sgn(x)
if x>0y=1;
elseif x<0y=-1;
elsey=0
end
end
%fst函数
function fn=fst(x1,x2,r,h)
d=h*r;
d0=h*d;
y=x1+h*x2;
a0=sqrt(d^2+8*r*abs(y));
if abs(y)<=d0a=x2+y/h;
elsea=x2+0.5*(a0-d)*sgn(y);
end
fn=-r*sat(a,d);
end
%fal函数
function y=fal(e,alpha,delta)
if abs(e)>deltay=abs(e)^alpha*sign(e);
elsey=e/(delta^(1-alpha));
end
end

系统模型

%系统方程
function dy=PlantModel(t,y,flag,p1,p2)
u=p1;
time=p2;
dy=zeros(2,1);
dy(1)=y(2);
dy(2)=-y(1)^2+u;
end

m文件实现的仿真结果

仿真源文件网盘链接

链接:https://pan.baidu.com/s/1bZ-teW6aMX2XjmLkBW1ozg 
提取码:4m5p

ADRC的simulink仿真实现与m代码实现相关推荐

  1. ADRC自抗扰控制自学笔记(包含simulink仿真)(转载)

    他这里让我很好理解了跟踪微分器 非线性PID(准确说是非线性PD,所以可以看到输入是两根线而不是三根线)  也就是说传统PID是线性的?但是不是那些系统是非线性的,比如无人机,平衡车,只是小幅度里近似 ...

  2. 基于 MATLAB 、Simulink 仿真和 TrueTime 工具箱的网络控制系统的仿真方法 附完整代码

    通过动手实践了解网络控制系统的架构及运行控制原理 熟悉使用基于 MATLAB 平台.Simulink 仿真工具和 TrueTime 工具箱的网络控制系统的仿真方法 考察不同丢包率下网络控制系统状态.输 ...

  3. 【模糊PI控制(从原理到simulink仿真到C代码实现)】

    模糊PI控制(从simulink仿真到C代码实现) 1. 模糊控制的基础知识 1.1 模糊PI控制理论想法(有基础直接看第2点以后) 1.2 模糊控制基础理论 1.2.1 量化因子与比例因子概念 1. ...

  4. Simulink仿真代码之step()函数的使用

    当我们写仿真代码时,调用Simlink Library Browser中元件,会遇到step()函数 查看官方文档,其用法: step(obj,___) 调用 System object™(参数为ob ...

  5. P3 Simulink仿真-《Matlab/Simulink与控制系统仿真》程序指令总结

    上一篇 回到目录 下一篇 <Matlab/Simulink与控制系统仿真>程序指令总结 Matlab_Simulink_BookExample 3. Simulink 仿真 书中详细实例代 ...

  6. 【Matlab 控制】Simulink仿真+S函数例子

    Simulink 仿真+S函数例子 S 函数代码如下: function [sys,x0,str,ts,simStateCompliance] = Eg3_7_SFunction(t,x,u,flag ...

  7. 最小拍控制系统详细解读(阶跃输入+速度输入2个案例)【Simulink仿真】

    目录索引 1.符号说明与结构框图 2.最小拍控制系统构造原则 2.1数字控制器D(z)的构造 3.简单控制对象的最小拍控制器设计 3.1阶跃输入 3.2速度输入 1.符号说明与结构框图 y(k)--系 ...

  8. 强跟踪卡尔曼滤波STF估算车辆质量——matab simulink仿真

    强跟踪卡尔曼滤波估算车辆质量--matab simulink仿真 目录 参考资料 强跟踪滤波器算法 解决的问题 Simulink模型 车辆运动状态仿真代码 强跟踪卡尔曼滤波代码 链接: https:/ ...

  9. simulink仿真实例_又见Simulink库模型之(9):自定义函数

    Simulink中提供了各种各样的模块,使得研究人员通过搭积木的方式,可以实现大部分功能需求.但总会有一些场景,是必须要研究人员自行编写代码,来满足自己的个性化需求. Simulink正是通过Matl ...

最新文章

  1. Redis与Memcached简要比较
  2. 华硕笔记本自带win10改win7的方法
  3. [C#]关于Access的“INSERT INTO 语句的语法错误”问题
  4. U盘启动盘恢复为普通U盘
  5. Arrays.asList()返回的ArrayList,这是Arrays里内嵌的一个私有静态类,而并不是java.util.ArrayList类
  6. win7系统每次开机都需要疑难解答的原因与解决方法
  7. 2台主机的docker互相通信的方法
  8. java 面向对象 重载_Java方法重载
  9. 在GNS3中使用SecureCRT6.1出错的解决方案
  10. java加解密之DES多种使用方式
  11. uniapp 即时通讯_在uni-app使用极光IM 开发一个聊天室
  12. 利用DDS IP实现线性调频信号(二)
  13. 打造地图拼接利器(五)地图采集与拼接
  14. HTML5 拖放(Drag 和 Drop)(stage1-39)
  15. element-ui使用踩坑记录 2022/8/24
  16. 由内而外全面造就自己(三)
  17. mysql proxies priv_Mysql 5.7.18 利用MySQL proxies_priv实现类似用户组管理
  18. Tensorflow Dataset API 入门
  19. 瑰珀翠全新伊芙琳玫瑰系列全球首发
  20. 梦幻西游手游经验任务链计算机,梦幻西游手游跑环任务详解 刷经验利器

热门文章

  1. unity c#帧同步网络优化方案
  2. 用python实现vCard3.0转vCard2.1
  3. 哈佛大学计算机学院博士后,哈佛大学正在招收访问学者、博士后!
  4. select下拉框二级联动
  5. 任意文件上传mysql_[代码审计]XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)...
  6. Created with Cocos |集结金庸三大IP《新射雕群英传》获畅销榜第五
  7. C语言二维数组相关操作方法
  8. Java从不同目录获取文件方式
  9. 盒子/图片/内容 垂直、水平居中方法总结
  10. 常用的污水处理工艺都有几种