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');