一:题目描述
二:控制器和规律描述
假设系统输入为 r = 1. 0 ,可取系统输出误差e和误差变化ec作为模糊控制器的输入 ,模糊控制器的输出u作为被控对象的控制输入。则可根据系统输出的误差和误差变化设计出模糊控制器fz,并根据一系列的模糊推理过程推导出最终的输出控制量u。其中误差e,误差变化量ec以及输出u所对应的模糊语言变量分别为E、EC和U。表示如下:
E={-6,-5,-4,-3,-2,-1,0,+1,+2,+3,+4,+5,+6}
EC={-6,-5,-4,-3,-2,-1,0,+1,+2,+3,+4,+5,+6}
U={-6,-5,-4,-3,-2,-1,0,+1,+2,+3,+4,+5,+6}
建立双输入,单输出的结构如图:
隶属度函数图像如下:
模糊规则定义:
表1 模糊控制规则
对规则进行编辑:
规则编辑界面图
Simulink仿真:
三:Simulink仿真图像:
代码:
% -----------------------------------------
% 典型二阶系统的模糊控制
% -----------------------------------------
a=newfis('fuzzy');
f1=1;
a=addvar(a,'input','e',[-6 6]); %添加误差输入变量
a=addmf(a,'input',1,'NB','trapmf',[-6,-6,-5,-3]); %添加误差隶属函数
a=addmf(a,'input',1,'NS','trapmf',[-5,-3,-2 0]);
a=addmf(a,'input',1,'ZR','trimf',[-2,0,2]);
a=addmf(a,'input',1,'PS','trapmf',[0,2,3,5]);
a=addmf(a,'input',1,'PB','trapmf',[3,5,6,6]);
f2=1;
a=addvar(a,'input','de',[-6 6]); %添加误差变化输入变量
a=addmf(a,'input',2,'NB','trapmf',[-6,-6,-5,-3]); %添加误差变化隶属函数
a=addmf(a,'input',2,'NS','trapmf',[-5,-3,-2,0]);
a=addmf(a,'input',2,'ZR','trimf',[-2,0,2]);
a=addmf(a,'input',2,'PS','trapmf',[0,2,3,5]);
a=addmf(a,'input',2,'PB','trapmf',[3,5,6,6]);
f3=1.5;
a=addvar(a,'output','u',[-3 3]); %添加输出变量
a=addmf(a,'output',1,'NB','trapmf',[-3,-3,-2,-1]); %添加输出隶属函数
a=addmf(a,'output',1,'NS','trimf',[-2,-1,0]);
a=addmf(a,'output',1,'ZR','trimf',[-1,0,1]);
a=addmf(a,'output',1,'PS','trimf',[0,1,2]);
a=addmf(a,'output',1,'PB','trapmf',[1,2,3,3]);
rr =[5 5 4 4 3; %以下为建立控制规则表
5 4 4 3 3;
4 4 3 3 2;
4 3 3 2 2;
3 3 2 2 1;
1 1 5 1 1;
1 2 5 1 1;
1 3 4 1 1;
1 4 4 1 1;
1 5 3 1 1;
3 1 4 1 1;
3 2 4 1 1;
3 3 3 1 1;
3 4 3 1 1;
3 5 2 1 1;
4 1 4 1 1;
4 2 3 1 1;
4 3 3 1 1;
4 4 2 1 1;
4 5 2 1 1;
5 1 3 1 1;
5 2 3 1 1;
5 3 2 1 1;
5 4 2 1 1;
5 5 1 1 1;
];
a=addrule(a,rulelist); %添加模糊规则到模糊控制器
a1=setfis(a, 'DefuzzMethod', 'mom'); %设置去模糊化方法
writefis(a1,'fuzzf');
a2=readfis('fuzzf');
Ulist=zeros(7,7);
for i=1:7
for j=1:7
e(i) = -4+i;
ec(j) = -4+j;
Ulist(i, j) = evalfis([e(i), ec(j)], a2);
end
end
figure(1);
plotfis(a2);
figure(2);
plotmf(a, 'input', 1);
figure(3);
plotmf(a, 'input', 2);
figure(4);
plotmf(a, 'output', 1);