声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2609|回复: 1

[综合讨论] 变论域模糊控制的S函数代码出错了

[复制链接]
发表于 2010-12-10 16:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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);
回复
分享到:

使用道具 举报

发表于 2012-4-10 15:26 | 显示全部楼层
不知道楼主的问题解决了没有  倒数第二行是in=【】 还是rr[]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 11:40 , Processed in 0.060636 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表