深圳幻海软件技术有限公司 欢迎您!

ADRC的simulink仿真实现与m代码实现

2023-04-12

本文章以最简单的二阶系统为例,介绍其simulink仿真实现和m代码实现案例中的二阶系统如下所示 经典ADRC的基本结构如下: 本案例中的simulink仿真整体结构(为便于理解,结构图与上述ADRC整体结构类似)仿真参数初始化所需m文件程序(文章尾部附有本仿真模型及m,文件支持

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

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

 经典ADRC的基本结构如下:

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

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

  1. %-----------ADRC参数初始化------------%
  2. %参数初始化
  3. %跟踪微分器
  4. r=100;%表示跟踪快慢
  5. h0=5*h;%h0代表信号的平滑程度(滤波效果)
  6. v1_last=0;
  7. v2_last=0;
  8. v0_last=0;
  9. %扩张状态观测器
  10. beta01=10;
  11. beta02=200;
  12. beta03=30;
  13. alpha1=0.5;%文献里给定值
  14. alpha2=0.25;%给定值
  15. delta=0.0025;
  16. b=1;
  17. z1_last=0;
  18. z2_last=0;
  19. z3_last=0;
  20. %非线性误差反馈
  21. nlsef_alpha1=0.7;
  22. nlsef_alpha2=1;
  23. %被控对象初始化
  24. temp_y=[0.5;0];
  25. u_last=0;

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

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

  1. %fst函数
  2. function fn=fst(x1,x2,r,h)
  3. d=h*r;
  4. d0=h*d;
  5. y=x1+h*x2;
  6. a0=sqrt(d^2+8*r*abs(y));
  7. if abs(y)<=d0
  8. a=x2+y/h;
  9. else
  10. a=x2+0.5*(a0-d)*sgn(y);
  11. end
  12. fn=-r*sat(a,d);
  13. end
  14. %符号函数
  15. function y=sgn(x)
  16. if x>0
  17. y=1;
  18. elseif x<0
  19. y=-1;
  20. else
  21. y=0
  22. end
  23. end
  24. %sat函数
  25. function y=sat(a,d)
  26. if abs(a)<=d
  27. y=a/d;
  28. else
  29. y=sgn(a);
  30. end
  31. end
  32. %符号函数

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

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

  1. function y=fal(e,alpha,delta)
  2. if abs(e)>delta
  3. y=sign(e)*abs(e)^alpha;
  4. else
  5. y=e/(delta^(1-alpha));
  6. end
  7. end

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

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

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

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

 系统输出的微分观测效果

 系统非线性项的观测效果

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

 m代码(ADRC控制器)

  1. clc;clear all;close all;
  2. %设定运行时间
  3. time=10;
  4. %设定仿真步长
  5. h=0.01;
  6. %时间定义
  7. t=0.01:h:time;
  8. %跟踪信号
  9. v0=zeros(1,time/h);
  10. for i=time/h/2+1:time/h;
  11. v0(i)=1;
  12. end
  13. rand_noise=0.05*randn(1,time/h);
  14. %跟踪信号中加入随机噪声
  15. vn=v0+rand_noise;
  16. %-----------ADRC------------%
  17. %参数初始化
  18. %跟踪微分器
  19. r=100;%表示跟踪快慢
  20. h0=5*h;%h0代表信号的平滑程度(滤波效果)
  21. v1_last=0;
  22. v2_last=0;
  23. v0_last=0;
  24. %扩张状态观测器
  25. beta01=10;
  26. beta02=200;
  27. beta03=30;
  28. alpha1=0.5;%文献里给定值
  29. alpha2=0.25;%给定值
  30. delta=0.0025;
  31. b=1;
  32. z1_last=0;
  33. z2_last=0;
  34. z3_last=0;
  35. %非线性误差反馈
  36. nlsef_alpha1=0.7;
  37. nlsef_alpha2=1;
  38. %被控对象初始化
  39. temp_y=[0.5;0];
  40. u_last=0;
  41. %----ADRC正式开始------%
  42. for k=1:time/h
  43. %第一轮迭代处理
  44. %两个参数分别为控制量和当前时间
  45. parameter1=u_last;
  46. parameter2=k*h;
  47. tSpan=[0 h];
  48. %利用龙格库塔法求解微分方程
  49. [~,total_y]=ode45('PlantModel',tSpan,temp_y,[],parameter1,parameter2);
  50. %total_state里面的元素都是龙格塔库一点点计算的结果,直接使用最后一列,即计算结果即可
  51. temp_y=total_y(length(total_y),:);%寻访最后一行,全部列的元素
  52. %记录下输出和输出的微分
  53. y(k)=temp_y(1);
  54. dy(k)=temp_y(2);
  55. %---跟踪微分器TD----%
  56. v1(k)=v1_last+h*v2_last;
  57. v2(k)=v2_last+h*fst(v1_last-vn(k),v2_last,r,h0);
  58. x3(k)=-v1_last^2;
  59. v1_last=v1(k);
  60. v2_last=v2(k);
  61. v0_last=vn(k);
  62. %----扩张状态观测器--%
  63. e=z1_last-y(k);
  64. z1(k)=z1_last+h*(z2_last-beta01*e);
  65. z2(k)=z2_last+h*(z3_last-beta02*(fal(e,alpha1,delta))+b*u_last);
  66. z3(k)=z3_last-h*beta03*(fal(e,alpha2,delta));
  67. z1_last=z1(k);
  68. z2_last=z2(k);
  69. z3_last=z3(k);
  70. %---非线性误差反馈----%
  71. e1(k)=v1(k)-z1(k);
  72. e2(k)=v2(k)-z2(k);
  73. u0(k)=beta01*fal(e1(k),nlsef_alpha1,delta)+beta02*fal(e2(k),nlsef_alpha2,delta);
  74. u(k)=u0(k)-z3(k)/b;
  75. u_last=u(k);
  76. end
  77. figure(1);
  78. plot(t,u,'r');
  79. figure(2);
  80. subplot(311);
  81. plot(t,z1,'r',t,y,'k',t,vn,'b','linewidth',2);
  82. xlabel('time(s)');ylabel('z1,y');
  83. legend('目标输出信号','估计输出信号','实际输出信号');
  84. subplot(312);
  85. plot(t,z2,'r',t,dy,'k','linewidth',2);
  86. xlabel('time(s)'),ylabel('z2,dy');
  87. legend('估计输出微分信号','实际输出微分信号');
  88. subplot(313);
  89. plot(t,z3,'r',t,x3,'k','linewidth',2);
  90. xlabel('time(s)'),ylabel('z3,x3');
  91. legend('估计扰动','实际扰动');
  92. %---------函数部分---------%
  93. %sat函数
  94. function y=sat(a,d)
  95. if abs(a)<=d
  96. y=a/d;
  97. else
  98. y=sgn(a);
  99. end
  100. end
  101. %符号函数
  102. function y=sgn(x)
  103. if x>0
  104. y=1;
  105. elseif x<0
  106. y=-1;
  107. else
  108. y=0
  109. end
  110. end
  111. %fst函数
  112. function fn=fst(x1,x2,r,h)
  113. d=h*r;
  114. d0=h*d;
  115. y=x1+h*x2;
  116. a0=sqrt(d^2+8*r*abs(y));
  117. if abs(y)<=d0
  118. a=x2+y/h;
  119. else
  120. a=x2+0.5*(a0-d)*sgn(y);
  121. end
  122. fn=-r*sat(a,d);
  123. end
  124. %fal函数
  125. function y=fal(e,alpha,delta)
  126. if abs(e)>delta
  127. y=abs(e)^alpha*sign(e);
  128. else
  129. y=e/(delta^(1-alpha));
  130. end
  131. end

系统模型

  1. %系统方程
  2. function dy=PlantModel(t,y,flag,p1,p2)
  3. u=p1;
  4. time=p2;
  5. dy=zeros(2,1);
  6. dy(1)=y(2);
  7. dy(2)=-y(1)^2+u;
  8. end

m文件实现的仿真结果

 

仿真源文件网盘链接

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

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览43883 人正在系统学习中