ADRC的simulink仿真实现与m代码实现
本文章以最简单的二阶系统为例,介绍其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代码实现相关推荐
- ADRC自抗扰控制自学笔记(包含simulink仿真)(转载)
他这里让我很好理解了跟踪微分器 非线性PID(准确说是非线性PD,所以可以看到输入是两根线而不是三根线) 也就是说传统PID是线性的?但是不是那些系统是非线性的,比如无人机,平衡车,只是小幅度里近似 ...
- 基于 MATLAB 、Simulink 仿真和 TrueTime 工具箱的网络控制系统的仿真方法 附完整代码
通过动手实践了解网络控制系统的架构及运行控制原理 熟悉使用基于 MATLAB 平台.Simulink 仿真工具和 TrueTime 工具箱的网络控制系统的仿真方法 考察不同丢包率下网络控制系统状态.输 ...
- 【模糊PI控制(从原理到simulink仿真到C代码实现)】
模糊PI控制(从simulink仿真到C代码实现) 1. 模糊控制的基础知识 1.1 模糊PI控制理论想法(有基础直接看第2点以后) 1.2 模糊控制基础理论 1.2.1 量化因子与比例因子概念 1. ...
- Simulink仿真代码之step()函数的使用
当我们写仿真代码时,调用Simlink Library Browser中元件,会遇到step()函数 查看官方文档,其用法: step(obj,___) 调用 System object™(参数为ob ...
- P3 Simulink仿真-《Matlab/Simulink与控制系统仿真》程序指令总结
上一篇 回到目录 下一篇 <Matlab/Simulink与控制系统仿真>程序指令总结 Matlab_Simulink_BookExample 3. Simulink 仿真 书中详细实例代 ...
- 【Matlab 控制】Simulink仿真+S函数例子
Simulink 仿真+S函数例子 S 函数代码如下: function [sys,x0,str,ts,simStateCompliance] = Eg3_7_SFunction(t,x,u,flag ...
- 最小拍控制系统详细解读(阶跃输入+速度输入2个案例)【Simulink仿真】
目录索引 1.符号说明与结构框图 2.最小拍控制系统构造原则 2.1数字控制器D(z)的构造 3.简单控制对象的最小拍控制器设计 3.1阶跃输入 3.2速度输入 1.符号说明与结构框图 y(k)--系 ...
- 强跟踪卡尔曼滤波STF估算车辆质量——matab simulink仿真
强跟踪卡尔曼滤波估算车辆质量--matab simulink仿真 目录 参考资料 强跟踪滤波器算法 解决的问题 Simulink模型 车辆运动状态仿真代码 强跟踪卡尔曼滤波代码 链接: https:/ ...
- simulink仿真实例_又见Simulink库模型之(9):自定义函数
Simulink中提供了各种各样的模块,使得研究人员通过搭积木的方式,可以实现大部分功能需求.但总会有一些场景,是必须要研究人员自行编写代码,来满足自己的个性化需求. Simulink正是通过Matl ...
最新文章
- Redis与Memcached简要比较
- 华硕笔记本自带win10改win7的方法
- [C#]关于Access的“INSERT INTO 语句的语法错误”问题
- U盘启动盘恢复为普通U盘
- Arrays.asList()返回的ArrayList,这是Arrays里内嵌的一个私有静态类,而并不是java.util.ArrayList类
- win7系统每次开机都需要疑难解答的原因与解决方法
- 2台主机的docker互相通信的方法
- java 面向对象 重载_Java方法重载
- 在GNS3中使用SecureCRT6.1出错的解决方案
- java加解密之DES多种使用方式
- uniapp 即时通讯_在uni-app使用极光IM 开发一个聊天室
- 利用DDS IP实现线性调频信号(二)
- 打造地图拼接利器(五)地图采集与拼接
- HTML5 拖放(Drag 和 Drop)(stage1-39)
- element-ui使用踩坑记录 2022/8/24
- 由内而外全面造就自己(三)
- mysql proxies priv_Mysql 5.7.18 利用MySQL proxies_priv实现类似用户组管理
- Tensorflow Dataset API 入门
- 瑰珀翠全新伊芙琳玫瑰系列全球首发
- 梦幻西游手游经验任务链计算机,梦幻西游手游跑环任务详解 刷经验利器
热门文章
- unity c#帧同步网络优化方案
- 用python实现vCard3.0转vCard2.1
- 哈佛大学计算机学院博士后,哈佛大学正在招收访问学者、博士后!
- select下拉框二级联动
- 任意文件上传mysql_[代码审计]XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)...
- Created with Cocos |集结金庸三大IP《新射雕群英传》获畅销榜第五
- C语言二维数组相关操作方法
- Java从不同目录获取文件方式
- 盒子/图片/内容 垂直、水平居中方法总结
- 常用的污水处理工艺都有几种