m基于Simulink的自适应模糊控制器设计与仿真实现

155 阅读3分钟

1.算法仿真效果

matlab2022a仿真结果如下:

1.png

2.png

3.png

4.png

5.png

6.png

7.png

2.算法涉及理论知识概要

        模糊自适应控制器同时结合自适应控制和模糊控制,形成具有自适应的功能的控制系统。模糊自适应控制不要求控制对象具有精确的数学模型,并且还巧妙的引入了自适应律以方便实时的去学习被控对象所具有的各种动态特性,然后再根据动态特性的实时变化来自动更新和修改以及在线实时调整对应的模糊控制器,这样就使得系统在出现各种各样的不确定因素的时候,控制器的控制效果仍然可以保持一致以及具有良好的鲁棒性。

       模糊自适应控制器的基本框架如图1所示。从图1可以看出,在自适应模糊控制的过程中,自适应规则的设计是依据控制性能指标来设计的,随着环境的变化自适应律不断用来修正模糊控制器中的参数。而在非自适应模糊控制系统,模糊控制器是事先已经设计好的,控制器的参数不依控制性能而改变,这就可能导致控制失效。因此,自适应模糊控制具有较好的控制性能。

       整个系统的完整结构为:

28460a16e677614183ca2960c99e2272_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png  

那么系统的自适应模糊控制模块可以简化为如下的结构:

3299dc9573fab6dfcf72f0c762f82407_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

只不过模糊输入的三个变量都是通过输出反馈得到的数据,从而构成自适应反馈系统。

 

       模糊自适应PID控制是在PID算法的基础上,以误差e和误差变化率ec作为输入,利用模糊规则进行模糊推理,查询模糊矩阵表进行参数调整,来满足不同时刻的e和ec对PID参数自整定的要求。PID控制有着原理简单,使用方便,适应性强的特点,同时具有制时精度低、抗干扰能力差等缺点,模糊自适应PID控制是在PID算法的基础上,以误差E 和误差变化率EC作为输入,利用模糊规则进行模糊推理,查询模糊矩阵表进行参数调整,来满足不同时刻的E和EC对PID参数自整定的要求.

 

3.MATLAB核心程序

9dac7abe080a24ac5a014704c476f9f6_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

c22b8fb11f404a14e2179cf2340cc649_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png `clc;

close all;

 

%首先在m文件中画出 p1,p2,p3,p4,p5,p6;

p0=[0    0];

p1=[1000 0];

p2=[1000 2000];

p3=[3000 2500];

p4=[4000 2000];

p5=[4000 0];

p6=[2000 -1000];

x=[p0(1) p1(1) p2(1) p3(1) p4(1) p5(1) p6(1)];

y=[p0(2) p1(2) p2(2) p3(2) p4(2) p5(2) p6(2)];

 

 

load x3.mat

load y3.mat

 

 

%直接对路经进行控制可定不可行,需要对路经的角度进行控制,然后反馈过来去控制船的路线

%计算实际的

load fai_tan.mat

load fai_tan2.mat

 

load x3.mat

load y3.mat

 

 

 

save x3.mat  x3

save y3.mat  y3

load s.mat

 

 

 

%控制后的录像

x0n(1)=x3(2)-150;

y0n(1)=y3(2)+20;

vn=1.19*s/length(fai_tan2);

for i = 2:length(fai_tan2)-1

     x0n(i)= x0n(i-1)+vn*cos(fai_tan2(2,i-1));

     y0n(i)= y0n(i-1)+vn*sin(fai_tan2(2,i-1));    

end

plot(x3,y3,'k','LineWidth',2);

axis([-1000,5500,-1000,2500]);

grid on;hold on;

title('Track keeping');

plot(x0n,y0n,'r','LineWidth',3)`