www.gusucode.com > 锅炉水位系统模糊控制的实例matlab源码程序 > code/jcl/flc_p.m

    function flc_p()
%这次实验我采用的模糊控制器是模糊控制表法
%      0800021.45 陈健
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%给出输入输出量的论域
%输出增量控制的论域[-64,64]
%误差的论域[-4/ke,4/k4]
%误差变化的论域[-4/kde,4/kde]

%确定量化等级 取三个语言变量的量化等级都是9级
%{-4,-3,-2,-1.4,0,1.4,2,3,4},为了提高稳态点控制的
%精度,量化方式采用非线性量化
%误差:{-4/ke,-3/(ke*1.4),-2/(ke*1.4^2),-1.4/(ke*1.4^3),0,1.4/(ke*1.4^3),2/(ke1.4^2),3/(ke*1.4),4/ke}
%误差变化:{-4/kde,-3/(kde*1.4),-2/(kde*1.4^2),-1.4/(kde*1.4^3),0,1.4/(kde*1.4^3),2/(kde1.4^2),3/(kde*1.4),4/kde}
%增量控制输出:{-64,-1.46,-4,-2,0,2,4,1.46,64}

%定义模糊子集
%这次实验我采用5个模糊子集
%{NB,NS,ZE,PS,PB}
%
%
%给出律属度函数值
m_lsd=[0 0 0 0 0 0 0 0.35 1
       0 0 0 0 0 0.4 1 0.4 0
       0 0 0 0.2 1 0.2 0 0 0
       0 0.4 1 0.4 0 0 0 0 0
       1 0.35 0 0 0 0 0 0 0];
   
%经过模糊控制规则的确定,求出了模糊控制表
m_flct=[4 3 3 2 2 3 0 0 0
        3 3 3 2 2 2 0 0 0
        3 3 2 2 1 1 0 -1 -2
        3 2 2 1 1 0 -1 -1 -2
        2 2 1 1 0 -1 -1 -2 -2 
        2 1 1 0 -1 -1 -2 -2 -3
        1 1 0 -1 -1 -2 -2 -3 -3
        0 0 0 -2 -2 -2 -3 -3 -3
        0 0 0 -3 -2 -2 -3 -3 -4];
    
    
%下面开始仿真实验

%输入误差和误差变化的量化因子
prompt={'input e:','input kde:','input 非线性量化因子:','增量控制强度'};
default={'0.133','0.133','1.4','1'};
k=inputdlg(prompt,'08000215 陈健',1,default);
ke=str2num(k{1});
kde=str2num(k{2});
fl=str2num(k{3});
cq=str2num(k{4});
prompt1={'给定','采样点数'};
default={'30','200'};
kk=inputdlg(prompt1,'给定',1,default);
r=str2num(kk{1});
num=str2num(kk{2});
uu=[-6.4 -1.6 -0.4 -0.2 0 0.2 0.4 1.6 6.4]*cq;
%变量初始化
y(1)=0;
for i=1:num %采样20000个点
    time(i)=i*0.5;
    if(i==1) 
        de(i)=0;
        e(i)=0;
    else 
        e(i)=r-y(i);
        de(i)=e(i)-e(i-1);
    end
    %误差的量化,确定模糊控制表的行号rnum
    if(e(i)<-4/ke)
        rnum=-4;
    elseif (e(i)<-3/(ke*fl))
        if(-3/(ke*fl)-e(i)>e(i)+4/ke)
             rnum=-4;
    else rnum=-3;
    end
    elseif (e(i)<-2/(ke*fl^2))
        if(-2/(ke*fl^2)-e(i)>e(i)+3/(ke*fl))
            rnum=-3;
    else rnum=-2;
    end
    elseif (e(i)<-1/(ke*fl^3))
        if(-1/(ke*fl^3)-e(i)>e(i)+2/(ke*fl^2))
            rnum=-2;
   else rnum=-1;
   end
    elseif (e(i)<0)
        if(-e(i)>e(i)+1/(ke*fl^3))
            rnum=-1;
    else rnum=0;
    end
    elseif (e(i)<1/(ke*fl^3))
        if(1/(ke*fl^3)-e(i)>e(i))
            rnum=0;
    else rnum=1;
    end
    elseif (e(i)<2/(ke*fl^2))
        if(2/(ke*fl^2)-e(i-1)>e(i)-1/(ke*fl^3))
            rnum=1;
     else rnum=2;
     end
    elseif (e(i)<3/(ke*fl))
        if(3/(ke*fl)-e(i)>e(i)-2/(ke*fl^2))
            rnum=2;
        else rnum=3;
        end
    elseif(e(i)<4/ke)
       if(4/ke-e(i)>e(i)-3/(ke*fl))
           rnum=3;
    else rnum=4;
    end
    elseif(e(i-1)>4/ke)
        rnum=4;
    end
   % 误差变化的量化,确定模糊控制表的列号cnum
   if(de(i)<-4/kde)
        cnum=-4;
    elseif (de(i)<-3/(kde*fl))
        if(-3/(kde*fl)-de(i)>de(i)+4/kde)
             cnum=-4;
        else cnum=-3;
        end
    elseif (de(i)<-2/(kde*fl^2))
        if(-2/(kde*fl^2)-de(i)>de(i)+3/(kde*fl))
            cnum=-3;
        else cnum=-2;
        end
    elseif (de(i)<-1/(kde*fl^3))
        if(-1/(kde*fl^3)-de(i)>de(i)+2/(kde*fl^2))
            cnum=-2;
        else cnum=-1;
        end
    elseif (de(i)<0)
        if(-de(i)>de(i)+1/(kde*fl^3))
            cnum=-1;
        else cnum=0;
        end
    elseif (de(i)<1/(kde*fl^3))
        if(1/(kde*fl^3)-de(i)>de(i))
            cnum=0;
        else cnum=1;
        end
    elseif (de(i)<2/(kde*fl^2))
        if(2/(kde*fl^2)-de(i)>de(i)-1/(kde*fl^3))
            cnum=1;
        else cnum=2;
        end
    elseif (de(i)<3/(kde*fl))
        if(3/(kde*fl)-de(i)>de(i)-2/(kde*fl^2))
            cnum=2;
        else cnum=3;
        end
    elseif(de(i)<4/kde)
        if(4/kde-de(i)>de(i)-3/(kde*fl))
            cnum=3;
        else cnum=4;
        end
    elseif(de(i)>4/kde)
        cnum=4;
    end
    %确定控制量
    control=m_flct(rnum+5,cnum+5);
    u(i)=-uu(control+5);
    if(i==1)     
          y(i+1)=exp(-0.05)*y(i);
    else  
          y(i+1)=exp(-0.05)*y(i)+(1-exp(-0.05))*u(i-1);
    end
end
%仿真结束
%画响应曲线
yy(1:num)=y(2:num+1);
plot(time,yy)
xlabel('time');
ylabel('y');