MATLAB代码编译环境与MATLAB命令设计模糊控制器
一、实验要求:
重点学习MATLAB系统仿真软件的使用和模糊控制器工作原理,并应用MATLAB命令进行模糊控制器设计,完成模糊控制查询表的实现、模糊控制在线运行代码的实现。
已知:
1.1 E、EC和U的论域:{-6,-5,…,-1,0,1,…,5,6};E、EC和U定义了7个语言值{NB,NM,NS,Z,PS,PM,PB};
1.2 各语言值的隶属函数采用三角函数,其分布可用下表表示:
1.3 控制规则表:
二、实验内容
2.1 模糊控制查询表的实现:
FuzzyTable :
**function** Fuzzy_Table=FuzzyTable()
*%一、初始化语言值、隶属函数、规则表矩阵*
*%7个语言值{NB,NM,NS,Z,PS,PM,PB};*
Input1_Terms=[1,2,3,4,5,6,7];
Input2_Trems=[1,2,3,4,5,6,7];
Output_Terms=[1,2,3,4,5,6,7];
*%各语言值的隶属函数(三角函数)*
Input1_Terms_Membership = [ 1,0.5,0,0,0,0,0,0,0,0,0,0,0;
0,0.5,1,0.5,0,0,0,0,0,0,0,0,0;
0,0,0,0.5,1,0.5,0,0,0,0,0,0,0;
0,0,0,0,0,0.5,1,0.5,0,0,0,0,0;
0,0,0,0,0,0,0,0.5,1,0.5,0,0,0;
0,0,0,0,0,0,0,0,0,0.5,1,0.5,0;
0,0,0,0,0,0,0,0,0,0,0,0.5,1];
Input2_Terms_Membership=Input1_Terms_Membership;
Output_Terms_Membership=Input1_Terms_Membership;
*%规则表矩阵*
Rule= [1,1,1,1,2,4,4;
1,1,1,1,2,4,4;
2,2,2,2,4,5,5;
2,2,3,4,5,6,6;
3,3,4,6,6,6,6;
4,4,6,7,7,7,7;
4,4,6,7,7,7,7];
*%二、求解模糊关系*
*%初始化R*
**for** i=1:169
**for** j=1:13
R(i,j)=0;
end
end
**for** Input1_Terms_Index=1:7
**for** Input2_Terms_Index=1:7
*%Input1_Terms_Index 代表输入E的语言值的序号,Input2_Terms_Index*
*%代表输入EC语言值的序号,Output_Terms_Index 代表输出U语言值的序号*
Output_Terms_Index=Rule(Input1_Terms_Index,Input2_Terms_Index);
*%A代表输入E的模糊值(隶属函数),B代表输入EC的模糊值,C代表输出U的模糊值*
A=Input1_Terms_Membership(Input1_Terms_Index,:);
B=Input2_Terms_Membership(Input2_Terms_Index,:);
C=Output_Terms_Membership(Output_Terms_Index,:);
*%规则库中第i条控制规则:*
*%Ri: IF E is Ai AND EC is Bi THEN U is Ci*
*%蕴含的模糊关系为:*
*% Ri = (Ai× Bi) ×Ci*
*%求解模糊关系*
*%R1=A×B*
**for** i=1:13
**for** j=1:13
R1(i,j)=min(A(i),B(i));
end
end
*%disp(R1)*
*%R2=R1^T(变为列向量)*
R2=[];
**for** k=1:13
R2=[R2;R1(k,:)'];
end
*%disp(R2)*
*%R3=R2×C*
**for** i=1:169
**for** j=1:13
R3(i,j)=min(R2(i),C(j));
end
**end**
R=max(R,R3);
end
end
disp®;

%三、总结模糊查询表*
**for** Input1_value_index=1:13
**for** Input2_value_index=1:13
*%a)将输入的精确值E和EC模糊化*
*%注:Input1_value_index表示输入E的精确值的序号,*
*%Input1_value_membership为E的精确值属于其各个模糊值的隶属度组成的向量(列)*
Input1_value_membership=Input1_Terms_Membership(:,Input1_value_index);
*%注:Max_Input1_index表示隶属度最大的模糊值的序号,Max_Input1_value为*
*%与之对应的隶属度*
[Max_Input1_value,Max_Input1_index]=max(Input1_value_membership);
*%注:Ad为与输入E的精确值相对应的隶属度最大的模糊值,也就是模糊化后的E*
*%的模糊值。(行)*
Ad=Input1_Terms_Membership(Max_Input1_index,:);
*%同理得到EC模糊化后的模糊值Bd*
Input2_value_membership=Input2_Terms_Membership(:,Input2_value_index);
[Max_Input2_value,Max_Input2_index]=max(Input2_value_membership);
Bd=Input2_Terms_Membership(Max_Input2_index,:);
*%b)推理*
*%Rd1=Ad×Bd*
**for** i=1:13
**for** j=1:13
Rd1(i,j)=min(Ad(i),Bd(j));
end
end
*%Rd2=Rd1^T(变为行向量)*
Rd2=[];
**for** k=1:13
Rd2=[Rd2,Rd1(k,:)];
end
*%Cd=Rd2 o R,Cd为推理后得到的模糊输出*
**for** j=1:13
Cd(j)=max(min(Rd2',R(:,j)));
end
disp(Cd)
sum1=0;
sum2=0;
Output = [-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6];
**for** i=1:13
sum1=sum1+Cd(i);
sum2=sum2+Cd(i)*Output(i);
end
OUT=round(sum2/sum1);
OUT
Fuzzy_Table(Input1_value_index,Input2_value_index)=OUT;
end
**end
2.2 模糊控制在线运行代码实现:
**function** u=FuzzyControl(e,ec)
*%定义el,eh,ech,ecl,uh,ul论域长度m*
el=-1,eh=1,ecl=-1,ech=1,m=13,ul=-1,uh=1,l=6;
ke=2*m/(eh-el);
kec=2*m/(ech-ecl);
Ku=(uh-ul)/2*l;
E=round(ke*(e-(eh+el)/2)); *%将E的论域转换到模糊控制器的论域*
**if** E>6
E=6;
**elseif** E<-6
E=-6;
end
EC=round(kec*(ec-(ech+ecl)/2)); *%将EC的论域转换到模糊控制器的论域*
**if** EC>6
EC=6;
**elseif** EC<-6
EC=-6;
end
Fuzzy_Table = FuzzyTable();
U=Fuzzy_Table(E+7,EC+7); *%查模糊控制查询表得到输出值U*
u=Ku*U+(uh+ul)/2; *%将输出转换到实际论域*
三、运行结果及分析
3.1、主函数:
%随机十组e和ec,通过模糊控制代码得到输出u
**for** i=1:10
e=unifrnd (-1,1);
ec=unifrnd (-1,1);
u = FuzzyControl(e,ec);
answer(i)=u;
end
disp(answer)
3.2、运行结果
e和ec的随机取值(第一列e,第二列ec)
模糊控制处理结果: