声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1361|回复: 6

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

[复制链接]
发表于 2007-5-22 19:54 | 显示全部楼层 |阅读模式

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

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

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

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

simulink仿真

simulink仿真
回复
分享到:

使用道具 举报

发表于 2007-5-22 20:11 | 显示全部楼层
输出曲线保持0状态不变化,这个现象不是量化因子的问题,而且你的模糊规则一般用的别人基础上的,所以只能是输出曲线不对,但不能输出为0
你这个系统太多M文件组成了,把我吓到了:@)
你这个必须用M文件来写么?这样不容易让别人看到你的思路。
你得先测试你每个模块都是通的,连接的。
你这个基本也没什么反馈,所以主要问题应该是不通,这么多环节不能一下子知道错误
你只能先一个模块一个模块的测试下先。
 楼主| 发表于 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 [Wu,We,Wec] = quanxishu(e,ec)
Wu=1;Wec=1;We=1;
function [Wu,We,Wec] = 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 编辑 ]

评分

1

查看全部评分

发表于 2007-5-24 11:15 | 显示全部楼层
Wu=1;Wec=1;We=1;
你这个地方是不是不对?
 楼主| 发表于 2007-5-25 09:41 | 显示全部楼层
如果不在这定义初始值的话也会提示错误了,实在是不理解
在m文件这样写的话
function [Wu,We,Wec] = 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 编辑 ]
发表于 2007-5-25 11:25 | 显示全部楼层
你没有定义e而且与也不对
我没具体的看,只是帮你改地系统不报错了哈
function [Wu,We,Wec] = 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
 楼主| 发表于 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 [sys,x0,str,ts]=mineke(t,x,u,flag)

switch flag,
    case 0,
       [sys,x0,str,ts]=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[sys,x0,str,ts]=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;
我试过很多次,应该还是没有实现这个功能,还请指正
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-29 09:21 , Processed in 0.085768 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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