insectking 发表于 2007-5-22 19:54

利用simulink仿真控制系统遇到的问题

有擅长控制系统的没?我做的是模糊自适应控制系统,结构如下
仿真遇到的问题是输出曲线保持0状态不变化,改变量化因子和比例因子也没有变化
请问是模糊规则的问题还是三个因子选取有问题?

[ 本帖最后由 insectking 于 2007-5-22 19:57 编辑 ]

cdwxg 发表于 2007-5-22 20:11

输出曲线保持0状态不变化,这个现象不是量化因子的问题,而且你的模糊规则一般用的别人基础上的,所以只能是输出曲线不对,但不能输出为0
你这个系统太多M文件组成了,把我吓到了:@)
你这个必须用M文件来写么?这样不容易让别人看到你的思路。
你得先测试你每个模块都是通的,连接的。
你这个基本也没什么反馈,所以主要问题应该是不通,这么多环节不能一下子知道错误
你只能先一个模块一个模块的测试下先。

insectking 发表于 2007-5-23 09:45

对,规则是利用别人的,你说的简单结构应该象这样吧,这个是利用之前我问你的s函数编写的,

在mdlUpdate里面写这个式子ke(k-1)=ke(k)+We*M*ke0 ,

在mdlOutputs写这个式子sys=ke(K)*e;但是实现不了

simulink仿真的时候通过不了,这样表达有些欠缺,现在把他们分开利用s函数写前面一部分,MATLAB FUN写后面一句

这样似乎和模版上面意义比较吻合,所以结构上相对比较复杂.也极有可能是其中的一些出错了,你的意见很好,我只能一个一个试了,:'( 先帮我看下下面的if语句,为什么提示Error in ==> quanxishu1 at 3 if(e<=-600&&ec>0)
function = quanxishu(e,ec)
Wu=1;Wec=1;We=1;
function = quanxishu(e,ec)
Wu=1;Wec=1;We=1;
if(e<=-600&&ec>0)
       We=0.9,Wec=0.0,Wu=1.0;
   elseif(-600<e<-100&&ec>0)
       We=0.5,Wec=0.6,Wu=0.8;
   elseif(-100<e<=100&&ec>0)
         We=0.8,Wec=1.0,Wu=0.5;
   elseif (100<e&&ec>0)
            We=1.0,Wec=0.5,Wu=0.9;
   elseif(100<e&&ec<0)
            We=0.8,Wec=1.0,Wu=0.9;
   elseif(-100<e<=100&&ec<0)
                  We=0.8,Wec=1.0,Wu=0.9;
   elseif(e<=-100&&ec<0)
                  We=0.6,Wec=1.0,Wu=0.8;
    end

[ 本帖最后由 insectking 于 2007-5-23 09:53 编辑 ]

cdwxg 发表于 2007-5-24 11:15

Wu=1;Wec=1;We=1;
你这个地方是不是不对?

insectking 发表于 2007-5-25 09:41

如果不在这定义初始值的话也会提示错误了,实在是不理解
在m文件这样写的话
function = quanxishu(e,ec)
if(e<=-600&&ec>=0)
       We=0.9,Wec=0.0,Wu=1.0;
   elseif(-600<e<-100&&ec>=0)
       We=0.5,Wec=0.6,Wu=0.8;
   elseif(-100<e<=100&&ec>=0)
         We=0.8,Wec=1.0,Wu=0.5;
   elseif (100<e&&ec>=0)
            We=1.0,Wec=0.5,Wu=0.9;
   elseif(100<e&&ec<0)
            We=0.8,Wec=1.0,Wu=0.9;
   elseif(-100<e<=100&&ec<0)
                  We=0.8,Wec=1.0,Wu=0.9;
   elseif(e<=-100&&ec<0)
                  We=0.6,Wec=1.0,Wu=0.8;
    end
也提示??? Input argument "e" is undefined.
Error in ==> quanxishu1 at 3
if(e<=-600&&ec>=0) 也不能定义初始值,该如何定义?

[ 本帖最后由 insectking 于 2007-5-25 09:56 编辑 ]

cdwxg 发表于 2007-5-25 11:25

你没有定义e而且与也不对
我没具体的看,只是帮你改地系统不报错了哈
function = quanxishu(e,ec)
global e ec
if(e<=-600&ec>=0)
       We=0.9,Wec=0.0,Wu=1.0;
   elseif(-600<e<-100&ec>=0)
       We=0.5,Wec=0.6,Wu=0.8;
   elseif(-100<e<=100&ec>=0)
         We=0.8,Wec=1.0,Wu=0.5;
   elseif (100<e&ec>=0)
            We=1.0,Wec=0.5,Wu=0.9;
   elseif(100<e&ec<0)
            We=0.8,Wec=1.0,Wu=0.9;
   elseif(-100<e<=100&ec<0)
                  We=0.8,Wec=1.0,Wu=0.9;
   elseif(e<=-100&ec<0)
                  We=0.6,Wec=1.0,Wu=0.8;
    end

insectking 发表于 2007-5-25 23:35

谢谢提醒了,你编的没问题,我是在embedfded matlab fuction ,里面不支持&与方式
最后一个用else(代替else if)好象就没什么问题了,你说的方法很好,再次谢过了,说来惭愧啊
自己基础太差了 啥也不懂啊:@L :@L
现在主要的问题还是那三个s函数,搞定一个就行了,我现在用s函数实现的是ke(k)=ke(k-1)+We*m*ke0;
现在在s函数里面update这个地方写sys=x+u(2)*u(1)*0.006;全部的如下
function =mineke(t,x,u,flag)

switch flag,
    case 0,
       =mdlInitializeSizes;
    case 2,
      sys=mdlUpdate(t,x,u);
    case 3,
      sys=mdlOutputs(t,x,u);
    case 9,
      sys=[];
    otherwise
      error(['Unhandled flag = ',num2str(flag)]);
end

function=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates= 0;
sizes.NumDiscStates= 0;
sizes.NumOutputs   = 1;
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;   
sys = simsizes(sizes);
x0 =[];
str = [];               
ts = [-1 0];

function sys=mdlUpdate(t,x,u)
sys=x+u(2)*u(1)*0.006;
function sys=mdlOutputs(t,x,u)
sys=x;
我试过很多次,应该还是没有实现这个功能,还请指正
页: [1]
查看完整版本: 利用simulink仿真控制系统遇到的问题