马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
我做了一个变论域的模糊控制,可以仿真,但是模糊控制输出为0,不知道哪里出错了,请高人指点,谢谢!
代码如下:(另外附件里是simulink仿真模型)
simulink.rar
(2.71 KB, 下载次数: 1)
function[sys,x0,str,ts]=sfun_mohu(t,x,u,flag)
ke=3.00;
kc=3/60.00;
ku=30;
switch flag,
case 0
[sys,x0,str,ts]=mdlInitializeSizes(ke,kc,ku);
case 3
sys=mdlOutputs(t,x,u,ke,kc,ku);
case {1,2,4,9}
sys=[];
otherwise
error(['unhandled flag=',num2str(flag)]);
end
function[sys,x0,str,ts]=mdlInitializeSizes(ke,kc,ku)
sizes=simsizes; %read default control varibles
sizes.NumContStates=0; %no continuous states
sizes.NumDiscStates=0; %3 states and assume they are the P I D components
sizes.NumOutputs=1; %1 output
sizes.NumInputs=3; %3 inputs
sizes.DirFeedthrough=1; %input reflected directly in output
sizes.NumSampleTimes=1; %singal sampling period
sys=simsizes(sizes);
x0=[];
str=[];
ts=[-1 0];
function sys=mdlOutputs(t,x,u,ke,kc,ku)
m=1-0.99*exp(-0.5*u(1)^2);
n=1-0.99*exp(-0.5*u(1)^2);
p=1-0.99*exp(-0.5*u(3)^2);
a=newfis('vertical');
a=addvar(a,'input','e',[-4*m 4*m]);
a=addmf(a,'input',1,'NB','trimf',[-6,-4,-2]*m);
a=addmf(a,'input',1,'NS','trimf',[-4,-2,0]*m);
a=addmf(a,'input',1,'ZR','trimf',[-2,0,2]*m);
a=addmf(a,'input',1,'PS','trimf',[0,2,4]*m);
a=addmf(a,'input',1,'PB','trimf',[2,4,6]*m);
%
a=addvar(a,'input','de',[-4*n 4*n]);
a=addmf(a,'input',2,'NB','trimf',[-6,-4,-2]*n);
a=addmf(a,'input',2,'NS','trimf',[-4,-2,0]*n);
a=addmf(a,'input',2,'ZR','trimf',[-2,0,2]*n);
a=addmf(a,'input',2,'PS','trimf',[0,2,4]*n);
a=addmf(a,'input',2,'PB','trimf',[2,4,6]*n);
%
a=addvar(a,'output','u',[-4*p 4*p]);
a=addmf(a,'output',1,'NB','trimf',[-6,-4,-2]*p);
a=addmf(a,'output',1,'NS','trimf',[-4,-2,0]*p);
a=addmf(a,'output',1,'ZR','trimf',[-2,0,2]*p);
a=addmf(a,'output',1,'PS','trimf',[0,2,4]*p);
a=addmf(a,'output',1,'PB','trimf',[2,4,6]*p);
%
rr=[5 5 4 4 3
5 4 4 3 2
5 4 3 2 1
4 3 2 1 1
3 2 2 1 1];
r1=zeros(prod(size(rr)),3);k=1;
for i=1:size(rr,1)
for j=1:size(rr,2)
r1(k,:)=[i,j,rr(i,j)*p];
k=k+1;
end
end
[r,s]=size(r1);
r2=ones(r,2);
ruleList=[r1,r2];
a=addrule(a,ruleList);
e1=ke*u(1);
de1=kc*u(2);
if e1>4
e1=4;%限制误差在基本论域
end
if e1<-4
e1=-4;
end
if de1>4
de1=4; %限制误差变化率
end
if de1<4
de1=-4;
end
in=[e1,de1];
sys=ku*evalfis(in,a); |