1.建立模糊控制器
%Fuzzy Tunning PID control
clear all
close all
a=newfis('fuzzpid')
%参数e
et=1/3
a=addvar(a,'input','e',et*[-3,3]);
a=addmf(a,'input',1,'NB','zmf',et*[-3,-2]);%‘zmf’,‘trimf’为对应的隶属函数
a=addmf(a,'input',1,'NM','trimf',et*[-3,-2,-1]);
a=addmf(a,'input',1,'NS','trimf',et*[-2,-1,0]);
a=addmf(a,'input',1,'ZO','trimf',et*[-1,0,1]);
a=addmf(a,'input',1,'PS','trimf',et*[0,1,2]);
a=addmf(a,'input',1,'PM','trimf',et*[1,2,3]);
a=addmf(a,'input',1,'PB','smf',et*[2,3]);
%参数ec
ect=4
a=addvar(a,'input','ec',ect*[-3,3]);
a=addmf(a,'input',2,'NB','zmf',ect*[-3,-2]);
a=addmf(a,'input',2,'NM','trimf',ect*[-3,-2,-1]);
a=addmf(a,'input',2,'NS','trimf',ect*[-2,-1,0]);
a=addmf(a,'input',2,'ZO','trimf',ect*[-1,0,1]);
a=addmf(a,'input',2,'PS','trimf',ect*[0,1,2]);
a=addmf(a,'input',2,'PM','trimf',ect*[1,2,3]);
a=addmf(a,'input',2,'PB','smf',ect*[2,3]);
%参数dkp
dp=5;
a=addvar(a,'output','dkp',dp*[-3,3]);
a=addmf(a,'output',1,'NB','zmf',dp*[-3,-2]);
a=addmf(a,'output',1,'NM','trimf',dp*[-3,-2,-1]);
a=addmf(a,'output',1,'NS','trimf',dp*[-2,-1,0]);
a=addmf(a,'output',1,'ZO','trimf',dp*[-1,0,1]);
a=addmf(a,'output',1,'PS','trimf',dp*[0,1,2]);
a=addmf(a,'output',1,'PM','trimf',dp*[1,2,3]);
a=addmf(a,'output',1,'PB','smf',dp*[2,3]);
%参数dkd
dd=1;
a=addvar(a,'output','dkd',dd*[-3,3]);
a=addmf(a,'output',2,'NB','zmf',dd*[-3,-2]);
a=addmf(a,'output',2,'NM','trimf',dd*[-3,-2,-1]);
a=addmf(a,'output',2,'NS','trimf',dd*[-2,-1,0]);
a=addmf(a,'output',2,'ZO','trimf',dd*[-1,0,1]);
a=addmf(a,'output',2,'PS','trimf',dd*[0,1,2]);
a=addmf(a,'output',2,'PM','trimf',dd*[1,2,3]);
a=addmf(a,'output',2,'PB','smf',dd*[2,3]);
% %参数dki
di=0.1;
a=addvar(a,'output','dki',di*[-3,3]);
a=addmf(a,'output',3,'NB','zmf',di*[-3,-2]);
a=addmf(a,'output',3,'NM','trimf',di*[-3,-2,-1]);
a=addmf(a,'output',3,'NS','trimf',di*[-2,-1,0]);
a=addmf(a,'output',3,'ZO','trimf',di*[-1,0,1]);
a=addmf(a,'output',3,'PS','trimf',di*[0,1,2]);
a=addmf(a,'output',3,'PM','trimf',di*[1,2,3]);
a=addmf(a,'output',3,'PB','smf',di*[2,3]);
% %规则2,对应表格中的规则2,对应文献中的规则作为参考
rulelist2=[
%第一位表示e(输入1),第二位表示ec(输入2),
%第三位表示输出dkp(输出1),第四位表示输出dkd(输出2),第5位表示dki(输出3)
1,1,7,5,1,1,1;
1,2,7,3,1,1,1;
1,3,6,1,2,1,1;
1,4,6,1,2,1,1;
1,5,5,1,3,1,1;
1,6,4,2,4,1,1;
1,7,4,5,4,1,1;
2,1,7,5,1,1,1;
2,2,7,3,1,1,1;
2,3,6,1,2,1,1;
2,4,5,2,3,1,1;
2,5,5,2,3,1,1;
2,6,4,3,4,1,1;
2,7,3,4,4,1,1;
3,1,6,4,1,1,1;
3,2,6,3,2,1,1;
3,3,6,2,3,1,1;
3,4,5,2,3,1,1;
3,5,4,3,4,1,1;
3,6,3,3,5,1,1;
3,7,3,4,5,1,1;
4,1,6,4,2,1,1;
4,2,6,3,2,1,1;
4,3,5,3,3,1,1;
4,4,4,3,4,1,1;
4,5,3,3,5,1,1;
4,6,2,3,6,1,1;
4,7,2,4,6,1,1;
5,1,6,6,2,1,1;
5,2,5,4,3,1,1;
5,3,4,4,4,1,1;
5,4,3,4,5,1,1;
5,5,3,4,5,1,1;
5,6,2,4,6,1,1;
5,7,2,4,7,1,1;
6,1,5,5,4,1,1;
6,2,4,7,4,1,1;
6,3,3,3,5,1,1;
6,4,2,5,5,1,1;
6,5,2,5,6,1,1;
6,6,2,5,7,1,1;
6,7,1,7,7,1,1;
7,1,4,4,4,1,1;
7,2,4,6,4,1,1;
7,3,2,6,5,1,1;
7,4,2,6,6,1,1;
7,5,2,5,6,1,1;
7,6,1,5,7,1,1;
7,7,1,7,7,1,1;
];
a=addrule(a,rulelist2);%对应规则2
a=setfis(a,'DefuzzMethod','centroid');%重心法解模糊
writefis(a,'cablefz');
a=readfis('cablefz');
1)其中常用隶属度函数:
trimf(三角形) ,trapmf(梯形), gbellmf(钟形), gaussmf(高斯型),zmf(z型)
2)模糊PID对应的规则
2.模糊PID控制器的simulink程序
1).通过比例、积分、微分项作为PID的输入
2).通过误差e和误差导数ec作为模糊控制器的输入项,进行模糊运算,得到模糊输出,进行解模糊处理后得到输出deta_kp,deta_ki,deta_kd
3).将上述1)u ,2)kpid中的内容输入PID控制器
4)PID控制器:给定初始KP0,KI0,KD0;
KP=KP0+deta_kp;
KD=KD0+deta_kd;
KI=KI0+deta_ki;