海浪语 发表于 2009-7-28 21:46

编的控制器报错,请帮助解决,谢谢!

是一个三输入两输出的模糊控制,运行报错。
%定义输入和输出变量及隶属度函数
a=newfis('wenkongqi');
a=addvar(a,'input','e1',[-6 6]);
a=addmf(a,'input',1,'NB','trimf',[-6,-4.5,-3]);
a=addmf(a,'input',1,'NM','trimf',[-4.5,-3,-1.5]);
a=addmf(a,'input',1,'NS','trimf',[-3,-1.5,0]);
a=addmf(a,'input',1,'ZO','trimf',[-1.5,0,1.5]);
a=addmf(a,'input',1,'PS','trimf',);
a=addmf(a,'input',1,'PM','trimf',);
a=addmf(a,'input',1,'PB','trimf',);
a=addvar(a,'input','e2',[-6 6]);
a=addmf(a,'input',2,'NB','trimf',[-6,-4.5,-3]);
a=addmf(a,'input',2,'NM','trimf',[-4.5,-3,-1.5]);
a=addmf(a,'input',2,'NS','trimf',[-3,-1.5,0]);
a=addmf(a,'input',2,'ZO','trimf',[-1.5,0,1.5]);
a=addmf(a,'input',2,'PS','trimf',);
a=addmf(a,'input',2,'PM','trimf',);
a=addmf(a,'input',2,'PB','trimf',);
a=addvar(a,'output','u',);
a=addmf(a,'output',1,'NB','trimf',[-4,-4,-2]);
a=addmf(a,'output',1,'NM','trimf',[-4,-2,0]);
a=addmf(a,'output',1,'NS','trimf',[-4,-2,0]);
a=addmf(a,'output',1,'ZO','trimf',[-2,0,2]);
a=addmf(a,'output',1,'PS','trimf',);
a=addmf(a,'output',1,'PM','trimf',);
a=addmf(a,'output',1,'PB','trimf',);
a=addvar(a,'output','A1',);
a=addmf(a,'output',2,'NB','trimf',);
a=addmf(a,'output',2,'NM','trimf',);
a=addmf(a,'output',2,'NS','trimf',);
a=addmf(a,'output',2,'ZO','trimf',);
a=addmf(a,'output',2,'PS','trimf',);
a=addmf(a,'output',2,'PM','trimf',);
a=addmf(a,'output',2,'PB','trimf',);
a=addvar(a,'output','A2',);
a=addmf(a,'output',3,'NB','trimf',);
a=addmf(a,'output',3,'NM','trimf',);
a=addmf(a,'output',3,'NS','trimf',);
a=addmf(a,'output',3,'ZO','trimf',);
a=addmf(a,'output',3,'PS','trimf',);
a=addmf(a,'output',3,'PM','trimf',);
a=addmf(a,'output',3,'PB','trimf',);
%模糊规则矩阵
kk=[1 0 1 7 0 1 1
    2 0 2 6 0 1 1
    3 0 3 5 0 1 1
    4 0 4 4 0 1 1
    5 0 5 3 0 1 1
    6 0 6 2 0 1 1
    7 0 7 1 0 1 1
   
    0 1 1 7 0 1 1
    0 2 2 6 0 1 1
    0 3 3 5 0 1 1
    0 4 4 4 0 1 1
    0 5 5 3 0 1 1
    0 6 6 2 0 1 1
    0 7 7 1 0 1 1
   
    1 1 1 7 1 1 1
    2 2 2 6 6 1 1
    3 3 3 5 5 1 1
    4 4 4 4 4 1 1
    5 5 5 3 3 1 1
    6 6 6 2 2 1 1
    7 7 7 1 1 1 1];
r1=zeros(numel(size(kk)),3);k=1;
for i=1:size(kk,1)
    for j=1:size(kk,2)
      r1(k,:)=;
      k=k+1;
    end
end
=size(r1);
r2=ones(r,2);
rulelist=;
a=addrule(a,kk);
%采用模糊控制器的二阶系统仿真
e1=0;e2=0;N=100;
ku1=1;ku2=1;ku3=1;
for k=1:N
    %输入变量变换至论域
    if e1>=6
      e1=6;
    elseif e1<=-6
      e1=-6;
    end
    if e2>=6
      e2=6;
    elseif e2<=-6
      e2=-6;
    end
      %模糊推理,计算出被控对象的控制输入
    in=;
   
    u=ku1*evalfis(in,a);
    A1=ku2*evalfis(in,a);
    A2=ku3*evalfis(in,a);
   
end
错误显示:

Total area is zero in defuzzCentroid() for output 1.
Average of the range of this output variable is used as the output value.
Total area is zero in defuzzCentroid() for output 1.
Average of the range of this output variable is used as the output value.
Total area is zero in defuzzCentroid() for output 1.
Average of the range of this output variable is used as the output value.
Total area is zero in defuzzCentroid() for output 1.
Average of the range of this output variable is used as the output value.
Total area is zero in defuzzCentroid() for output 1.
Average of the range of this output variable is used as the output value.
这是什么原因造成的,给大侠们告知,不胜感谢!

海浪语 发表于 2009-8-2 13:52

求帮助,模糊控制器evalfis函数问题。

求助,如何解决这个问题,谢谢啦!
是一个IF语句,e1不为0,e2不为0,de1不为0,de2不为0
??? Operands to the || and && operators must be convertible to logical scalar values.
Error in ==> wenkongqi3 at 142
    if (~e1==0)&&(~e2==0)&&(~de1==0)&&(~de2==0)

写成这样:
    if (e1~=0)&(e2~=0)&(de1~=0)&(de2~=0)
就不报错了,是不是这样为正确的。

还有一个问题是这样的:我参照以下的例子
ke=30;kd=0.2;ku=1;
num=20;
den=;
=tf2ss(num,den);
x=;%the init2*1 vector
T=0.01;h=T; %step
N=250;
R=1.5*ones(1,N);

a=newfis('simple');
a=addvar(a,'input','e',[-6,6]);
a=addmf(a,'input',1,'NB','trapmf',[-6,-6,-5,-3]);
a=addmf(a,'input',1,'NS','trapmf',[-5,-3,-2,0]);
a=addmf(a,'input',1,'ZR','trimf',[-2,0,2]);
a=addmf(a,'input',1,'PS','trapmf',);
a=addmf(a,'input',1,'PB','trapmf',);
a=addvar(a,'input','de',[-6,6]);
a=addmf(a,'input',2,'NB','trapmf',[-6 -6 -5 -3]);
a=addmf(a,'input',2,'NS','trapmf',[-5 -3 -2 0]);
a=addmf(a,'input',2,'ZR','trimf',[-2 0 2]);
a=addmf(a,'input',2,'PS','trapmf',);
a=addmf(a,'input',2,'PB','trapmf',);
a=addvar(a,'output','u',[-3,3]);
a=addmf(a,'output',1,'NB','trapmf',[-3 -3 -3 -2]);
a=addmf(a,'output',1,'NS','trimf',[-2 -1 0]);
a=addmf(a,'output',1,'ZR','trimf',[-1 0 1]);
a=addmf(a,'output',1,'PS','trimf',);
a=addmf(a,'output',1,'PB','trapmf',);

rr=[5 5 4 4 3
    5 4 4 3 3
    4 4 3 3 2
    4 3 3 2 2
    3 3 2 2 1];
r1=zeros(prod(size(rr)),3);k=1;
for i=1:size(rr,1)
    for j=1:size(rr,2)
      r1(k,:)=;
      k=k+1;
    end
end
=size(r1);
r2=ones(r,2);
rulelist=;
a=addrule(a,rulelist);

e=0;de=0;


for k=1:N
    e1=ke*e;
    de1=kd*de;
    if e1>=6
      e1=6;
    elseif e1<=-6
      e1=-6;
    end
    if de1>=6
      de1=6;
    elseif de1<=-6
      de1=-6;
    end
    %fuzzy controler
    in=
    u=ku*evalfis(in,a);
    uu(1,k)=u;
    %under control system
    k0=a1*x+b*u;
    k1=a1*(x+h*k0/2)+b*u;
    k2=a1*(x+h*k1/2)+b*u;
    k3=a1*(x+h*k2)+b*u;
    x=x+(k0+2*k1+2*k2+k3)*h/6;
    y=c*x+d*u;
    yy(1,k)=y;
   
    e1=e;
    e=y-R(1,k);
    de=(e-e1)/T;
end

kk=*T;
figure(1);
plot(kk,R,'k',kk,yy,'r');grid on
xlabel('time(s)');ylabel('output');

在我的程序里面,有3个FIS,3个控制量输出,后面是模型,报错在后。
if (e1~=0)&(e2~=0)&(de1~=0)&(de2~=0)
    %输入变量变换至论域
    if e1>=6
      e1=6;
    elseif e1<=-6
      e1=-6;
    end
    if e2>=6
      e2=6;
    elseif e22<=-6
      e2=-6;
    end
    if de1>=6
      de1=6;
    elseif de1<=-6
      de1=-6;
    end
    if de2>=6
      de2=6;
    elseif de2<=-6
      de2=-6;
    end
   
    %模糊推理,计算出被控对象的控制输入
    in1=;
    in2=;
    in3=;

??? Error using ==> vertcat
CAT arguments dimensions are not consistent.
Error in ==> wenkongqi3 at 166
    in1=;
格式是相同的,是什么原因呢?

[ 本帖最后由 海浪语 于 2009-8-2 14:47 编辑 ]

ChaChing 发表于 2009-8-2 14:51

LZ的版本是多少? 有支援&&? 若没有, 改为&

[ 本帖最后由 ChaChing 于 2009-8-2 15:14 编辑 ]

海浪语 发表于 2009-8-2 14:56

谢,我现在用的是2007a,现在是in1=;报错
提示我:??? Error using ==> vertcat
CAT arguments dimensions are not consistent.
Error in ==> wenkongqi3 at 166
    in1=;
不大清楚怎么解决。

ChaChing 发表于 2009-8-2 15:14

回复 板凳 海浪语 的帖子

检查一下e1及e2的size, 看看in1=;是否合理!

海浪语 发表于 2009-8-2 15:43

我这个模糊控制器,是多输入多输出的,但是模糊控制箱里的函数都是二维的,所以我用了3个IF语句判断选择,基本结构和我举得例子一样,只不过例子是1个FIS,我是3个FIS,SIZE应该是相同的,我这里面   
in1=;
    in2=;
    in3=;
也是对应的
e11=e1;e1=x7-TIN1;de1=(e1-e11)/i;
    e22=e2;e2=x8-TIN2;de2=(e2-e22)/i;
在考虑怎么解决这个错误,希望能得到你的指点,谢谢。

ChaChing 发表于 2009-8-2 15:56

模糊控制个人外行! 从报错告知e1及e2不同大小!
LZ可使用debug看看e1及e2的确实大小, 或在报错前一行增加size(e1), size(e2)!

海浪语 发表于 2009-8-2 16:09

前面加入一行size(e1), size(e2),运行结果:

ans =

         1       10000


ans =

   1   1

??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

Error in ==> wenkongqi3 at 167
    in1=;
能帮我分析一下吗,谢谢。

ChaChing 发表于 2009-8-2 21:55

size(e1)=1*10000, size(e2)=1*1, 可以in1=吗?
看起来好像e1有问题, 不应该为1*10000? 是吗?
页: [1]
查看完整版本: 编的控制器报错,请帮助解决,谢谢!