利用simulink仿真控制系统遇到的问题
有擅长控制系统的没?我做的是模糊自适应控制系统,结构如下仿真遇到的问题是输出曲线保持0状态不变化,改变量化因子和比例因子也没有变化
请问是模糊规则的问题还是三个因子选取有问题?
[ 本帖最后由 insectking 于 2007-5-22 19:57 编辑 ] 输出曲线保持0状态不变化,这个现象不是量化因子的问题,而且你的模糊规则一般用的别人基础上的,所以只能是输出曲线不对,但不能输出为0
你这个系统太多M文件组成了,把我吓到了:@)
你这个必须用M文件来写么?这样不容易让别人看到你的思路。
你得先测试你每个模块都是通的,连接的。
你这个基本也没什么反馈,所以主要问题应该是不通,这么多环节不能一下子知道错误
你只能先一个模块一个模块的测试下先。 对,规则是利用别人的,你说的简单结构应该象这样吧,这个是利用之前我问你的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 编辑 ] Wu=1;Wec=1;We=1;
你这个地方是不是不对? 如果不在这定义初始值的话也会提示错误了,实在是不理解
在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 编辑 ] 你没有定义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 谢谢提醒了,你编的没问题,我是在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]