【智能控制实验】MATLAB代码编译环境与MATLAB命令设计模糊控制器

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 各语言值的隶属函数采用三角函数,其分布可用下表表示:

img

1.3 控制规则表:

image-20211230155710527

二、实验内容

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®;

image-20211230161940877
%三、总结模糊查询表* 

**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

img

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)

image-20211230162009340

模糊控制处理结果:

img

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值