基于matlab的常规模糊控制器与PID控制器的比较

模糊控制器的设计

clear;
y=0;
h=0.1;
r=10;
sum=0;
x1_0=0;
a=ones(1,2);
b=ones(1,3000);
c=ones(1,3000);
m=newfis(“Fuzzypif”); %创建一个 FIS (Fuzzy Inference System ) 对象

%增加模糊语言变量
m = addvar(m,‘input’,‘error’,[-100,100]);%第一个输入变量error
%添加模糊语言名称
m =addmf(m,‘input’,1,‘error<<0’,‘gaussmf’,[21.24 -100]);
m =addmf(m,‘input’,1,‘error<0’,‘gaussmf’,[21.2 -50.5]);
m =addmf(m,‘input’,1,‘error<<0’,‘gaussmf’,[21.2 0]);
m =addmf(m,‘input’,1,‘error<<0’,‘gaussmf’,[21.24 50]);
m =addmf(m,‘input’,1,‘error<<0’,‘gaussmf’,[21.2 99.5]);
m = addvar(m,‘input’,‘de’,[-100,100]);%第二个输入变量 de
m =addmf(m,‘input’,2,‘de>0’,‘gaussmf’,[42.47 100]);
m =addmf(m,‘input’,2,‘de=0’,‘gaussmf’,[42.47 0]);
m =addmf(m,‘input’,2,‘de<0’,‘gaussmf’,[42.47 -100]);
m = addvar(m,‘output’,‘du’,[-10,10]);%输出变量 du
m =addmf(m,‘output’,1,‘du<<0’,‘gaussmf’,[2.124 -10]);%
m =addmf(m,‘output’,1,‘du<0’,‘gaussmf’,[2.124 -5.0]);%
m =addmf(m,‘output’,1,‘du=0’,‘gaussmf’,[2.124 0]);%
m =addmf(m,‘output’,1,‘du>0’,‘gaussmf’,[2.124 5.0]);%
m =addmf(m,‘output’,1,‘du>>0’,‘gaussmf’,[2.124 10]);%
rulelist=[
1 0 5 1 1; %模糊控制规则表,共有m+n+2列
3 0 3 1 1; %前两个数字为m的隶属度函数号,其次是n的隶属度函数号
5 0 1 1 1 ; %第m+n+1位为规则的权重,一般设置为1
2 3 5 1 1 ; %第m+n+2位 and为“1”,or为“0”
4 1 1 1 1];
m = addrule(m,rulelist); % 向模糊推理系统添加规则
homework = m;
for i=1:1:3000

x1 = y-r;

if x1>10 %对误差信号进行限幅
x2=10;

elseif x1<-10 %对误差信号进行限幅
x2 = -10;
else x2=x1;
end
x2_de = (x1-x1_0)/h;
%a=ones(1,2);
a(1)=x2;
a(2)=x2_de;
x3=evalfis(a,homework);%采用增量控制方法,输出是deltau

sum =sum+x3;
b(i)=sum;%把每次的控制信号放入一个数组中,以便与延时处理
x4 = y;
if(i-0.5/h)<=0 %对时间零以前置零处理
c(i)=0;
else
c(i)=b(i-0.5/h);
end
%龙格库塔法是用于非线性常微分方程的解的重要的一类隐式或显式迭代法%
f1 = (c(i)-x4)/10;
f2 = ((c(i)+h/2)-(x4+hf1/2))/10;
f3 = ((c(i)+h/2)-(x4+h
f2/2))/10;
f4 = ((c(i)+h)-(x4+hf3))/10;
x4_dot = x4+h
(f1+2f2+2f3+f4)/6;
y = x4_dot;
x(i)=x4;
x1_0 = x1;
end
plot(x,‘r’);

运行结果如下

在这里插入图片描述

PID控制器

clear;
kp=10;
ki=1;
kd=2;
y=0;
h = 0.1;
r = 10;
sum=0;
x1_0=0;
a=ones(1,2);
b=ones(1,1500);
c=ones(1,1500);
int_err = 0;
for i=1:1:1500
x1 = y-r; %计算误差信号
if x1>10
x2 =10;

  elseif x1 <-10
        x2 = -10;
            else  x2=x1; 

end
x2_de = (x1-x1_0)/h;
err =x2;
int_err = int_err+err;
de = x2_de;
x3=-(kperr+kiint_err+kdde)%求出控制信号,y-r为负,所以加了负号
b(i) = x3;%把每次的控制信号放入一个数组中,便于延时处理
x4 = y;
if(i-0.5/h)<=0
c(i)=0;
else
c(i) = b(i-0.5/h);
end
f1 = (c(i)-x4)/10;
f2 = ((c(i)+h/2)-(x4+h
f1/2))/10;
f3 = ((c(i)+h/2)-(x4+hf2/2))/10;
f4 = ((c(i)+h)-(x4+h
f3))/10;
x4_dot = x4+h*(f1+2f2+2f3+f4)/6;
y = x4_dot;
x(i)=x4;
x1_0 = x1;

end
plot(x,‘r’)

运行结果如下

在这里插入图片描述

结论

对照以上两幅图,在此例中,模糊控制器经过1500次后还在调整,而PID经过大约200次就结束调整,且震荡较少,PID缺点就是超调量较大。

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值