注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

易拉罐的博客

心静自然凉

 
 
 

日志

 
 

转 如何在MATLAB下把模糊推理系统转化为查询表  

2010-05-28 23:08:46|  分类: matlab仿真 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

摘  要:该文论述了将MATLAB下调试成功的模糊逻辑转换为查询表的一种技巧,这种技巧不直接使用MATLAB的矩阵计算方法,操作者多数情况下只需点击鼠标就可完成任务,效率比较高,该方法使用MATLAB下的系统测试工具,收集构造查询表所需的数据资料,文中以MATLAB中的水位模糊控制演示模型为例,把该系统的模糊控制推理模块用在其基础上生成的查询表代替后再进行水位控制仿真,控制效果与模糊推理模块在线推理控制是一致的。

关键词:模糊控制;查询表;MATLAB;Simulink; 系统测试  

Abstract:This article discuss a skill that make a translation from fuzzy logic system to Lookup Table in Matlab,It doesn't use matrix computing, user need only to drag and draw the mouse completing this task,It's a efficiency method which to collect data for Lookup Table construction from a fuzzy controller by SystemTest Toolbox in Matlab,in the article,I will discuss the skill by a demo which is the Water Level Control in Tank in the Fuzzy logic Toolbox,at last,I simulate the Water Control in Tank instead of the Fuzzy Controller with the Lookup Table which I have constructed,the test results is very well.

Keywords: Fuzzy Logic, Matlab,Simulink,Lookup Table,SystemTest 

(该文章内容在MATLAB R2007b上调试通过)

1.  引 言

在MATLAB/Simulink下,构建模糊逻辑系统模型和调试其推理规则都是很方便的[3][4],我们当然不希望在MATLAB下的仿真工作仅仅用于仿真目的,如果实际产品设计能继承仿真的工作成果,将事半功倍。在MATLAB里,还没有把模糊推理系统直接转化为查询表的工具,尽管Fuzzy Logic 提供的gensurf(FIS)指令可生成响应面的数据,但用这种方法获得的数据生成查询表控制效果不理想,借助于MATLAB下的系统测试工具是另一种实现这一目标的方法。因为查询表用于一些廉价的嵌入式系统效率比较高,也节省系统资源,所以在MATLAB下实现这种转化是非常有意义的。

我们知道,模糊逻辑推理系统是输入变量空间到输出变量空间的一种映射,而查询表也是实现输入变量空间到输出变量空间的一种映射,它们只不过是可实现非线性映射的两种方法而已。当通过Simulink/Fuzzy Logic Toolbox实现了一个模糊推理系统,不妨把它看成一个黑箱按系统辩识的思路来测试它,这时我们只关心它的输入与输出,每当在这个黑箱的输入端馈入一个输入,那么它的输出就相应有一个输出响应,能否在这个黑箱输入端送入所有输入变量的可能组合来观测输出呢?答案是肯定的,查询表的构造正需要这些输入输出数据组,有了这些数据,建立一个查询表就简单了。一般来说输入变量有一定义范围,计算机的A/D变换和模糊系统模糊化处理时都存在量化过程,在这个黑箱的输入端送入的测试变量值当然也是离散化了的,一个两变量的系统,如果每个变量被离散化为10个值,那么总共就需要100次测试,随着系统变量的增加或量化等级的提高,需做的输入测试成级数快数增长,借助与MATLAB里的系统测试工具,可以快速做这类测试并收集系统输出数据。

2.   系统测试准备

 下面以MATLAB下的一简单的模糊控制演示系统为例来阐述把模糊逻辑转化为查询表的过程。

      2.1 准备模糊控制系统模型 

     在MATLAB的Fuzzy Logic下打开Water Level Control in a Tank(水槽水位控制),另保存到一个不同的目录下,名字为sltankrule,该演示Simulink模型如下:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

                            图1 水槽水位模糊控制系统

该演示模型目的比较模糊控制和PID控制水位的效果,其中Fuzzy Controller with Ruleviever模块里的tank模糊推理系统已经做好了,这里不在熬述,在其两个输入中,水位误差输入变量范围是[-1 1],水位变化率输入变量范围是[-0.1 0.1],输出变量阀门开度范围是[-1 1]。

2.2 准备模糊控制系统测试模型

 在继续下面的工作前,请在SIMULINK里先运行一下Water Level Control in a Tank模型,然后再停止运行,这样做的目的是为了是模糊控制器里的模糊TANK被SIMULINK调用、被识别、在SIMULINK里被展开。

把这个模型修改成如下样字,另存为一个文件名,比如sltankruletotest。

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

                            图2 水槽水位模糊控制系统测试模型

 

修改成这种样字后,A、B(请在MATLAB命令窗定义A,B,比如A=0,B=0)分别模拟该模糊系统水位误差输入、水位变化率,Out1模拟阀门的开度,注意把Simulation Stop Time设置为0.02。

2.3 准备查询表模型

在Simulink下建一个二维查询表模型,另存为一个文件名,比如FuzzyLookup,这样做是为了以后查询表调试好后,可用Simulink的代码生产工具把它生成C代码,样子如下:

 

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

                                  图3 查询表模型

 3.  系统测试操作

模型切换到sltankruletotest ,点击Tools\SytemTest…样子如下:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

                                          图4 系统测试设置1

在系统测试main Test里加入Simulink组件,该组件Mappings下的Define Model overrides属性项可以把Simulink模型的输入参数映射到用户自定义的测试向量,该组件Mappings下的Define Map Simulink Data to Test Variables 属性项把Simulink模型的输出参数映射到用户自定义的测试变量,这里把被测试模糊模型sltankruletotest里的A、B映射到自定义测试向量TestVector1、TestVector2,TestVector1定义为[-1:0.2 : 1]、 TestVector2定义为[-0.1:0.01 :0.1],模糊模型输出out1映射到自定义测试变量st_signal.最后选择系统测试环境Test Browser下的Save Results项,设置成下面的样子:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

                                     图5 系统测试设置2

 在SystemTest环境下,点击Run,开始系统测试,系统进行迭代测试,测试结束后点击File\Save Test Results as保存测试结果在T.mat文件下,以备后用,测试结束后,可以查看如下系统输入输出曲面结果:

 

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

                 图6 水槽水位模糊系统测试输入输出结果

界面切换到MATLAB主界面,点击File/Open,打开T.mat,在命令窗下键入命令whos,会看到如下结构变量:

stresults  1x1  2268  struct,

该结构保存了模型sltankruletotest的输入变量的测试数据,输出变量响应数据,它们分别是:

两输入测试向量数据组:

stresults.testvector.TestVector1

stresults.testvector.TestVector2

一输出向量数据组:

stresults.variable.st_signal

可以在MATLAB命令行键入以上命令看这些变量具体数据内容。界面切换到FuzzyLookup,双击LookupTable (2-D),界面属性设置如下:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

                       图7 查询表模块参数设置

再点击该属性窗上的Edit…,Simulink自动生成如下样式的表格:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

                                      图8 查询表模块数据

查询表生成后样子如下: 

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

                         图9 生成查询表模块外观

4.  用查询表替代模糊控制器测试水位控制效果

把生成的查询表考贝到sltankrule,替换掉原来的模糊推理组件,样子如下:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

                               图10 用查询替换模糊控制器后的控制系统

查询表采用interplolation-extrapolstion查寻方法,现在再仿真该水位控制系统,通过看水位控制动画表示,查寻表水位的控制和原来的模糊规则控制效果已经相当,如果换一种查询表查询方法,比如use input nearest查寻方法,控制效果就差了,究其原因是在测试环节我们的测试向量量化等级不足所致,如果把测试向量修改一下,比如:TestVector1定义为[-1:0.08 : 1]、 TestVector2定义为[-0.1:0.01 :0.1]再做测试收集数据,生成查询表,那么查询表无论采用那一种查询方法,水位的控制效果都很好了,这时查询表表格变大了些。获得这个表格后,对于嵌入式系统,即使用汇编语言写出该表的查询程序也是很容易了。

5. 总结

本文讲述了在MATLAB 环境下,把模糊逻辑系统转化为查询表的一种方法,这种方法简单易行,查询表控制也达到了模糊控制的同样效果,按以上思路,也容易理解在MATLAB 下,用其它方法建立的部分系统模型,如果有必要的话,也可使用同样的的方法把它转化成查询表,从工程角度出发,这种方法使得工程技术人员在产品设计中轻松实现模糊逻辑建模仿真到实际应用的连贯设计流程。

 

http://foundy.blog.163.com/

在SIMULINK里把模糊逻辑生成查寻表

如何在MATLAB下把模糊推理系统转化为查询表(原创) 里,使用MATLAB2007b,同样的任务,使用新版本,其实操作更为简单,我还是以MATLAB下的模糊控制水位系统做演示(MATLAB 2009a),但有些操作或者解释被简化了,不清楚请参看如何在MATLAB下把模糊推理系统转化为查询表(原创)

    第一步:运行MATLAB 2009a

    第二步:在MATLAB菜单下Help 里点击Demo,到下面图示:

 

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

第三步:在Toolboxes里的Fuzzy Logic里打开Demo “Water Level Control in  a Tank”,把仿真停止时间设置为0.2,运行一次,停止。把该模型另存为桌面文件,使用默认文件名。

第四步:然后新建一个模型文件,把Water Level Control in  a Tank模型里的模糊控制模块考到新文件来。最后的样子如下,也把该文件保存在桌面,使用默认文件名。

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客
 

第五步:点SIMULINK界面里Tools\SystemTest 进入系统测试界面。

 

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

第六步:在红框栏右边把第四步保存的模型加进来,也就是这个模型是我们要测试的模型。鼠标选中Main Test项,在菜单象Insert\Test Element\Simulink,而后样子如下:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

第七步:在Test Vectors 项里定义两个测试向量,变量名使用默认的。TestVector1=[-1:0.1:1], TestVector1=[-0.1:0.02:0.1],在Test Variables 里定义测试变量,st_signal。 如下图:

 

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

 第八步:把测试向量TestVector1=[-1:0.1:1], TestVector1=[-0.1:0.02:0.1]分别映射到第四步所建模糊控制器的输入口in1, int2,做为输入测试信号。把测试变量st_signal映射到模糊控制器输出口out1.这就步操作是,在测试界面左端选中Simulink项。设置后的界面如下:

输入测试向量到模糊模型输入口映射:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

 

模糊控制器输出保存映射:

 

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

 

第九步,在测试界面点Save Results项,设置如下:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

 第十步,运行测试,注意在Main Test(231 Iterations)(231次迭代,运算代价),等待测试结束。

  第十一步,测试成功结束后,在系统测试界面点Tools\Test Results Viewer,点工具栏里的Surf Plot表面画,X,Y ,Z分别设置为TestVector1,TestVector1,st_signal.点Plot按钮,看到如下图:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

   

第十二步,把TestVector1,TestVector1,st_signal输出到MATLAB空间,在Test Results Viewer界面左端,右击st_signal跳出弹出菜单,点Export,同理对TestVector1,TestVector1执行同样操作。

第十三步,在MATLAB命令窗键入whos命令,点开变量st_signal.看看有什么?如下吧:

6个21X11个表,我们列出第六个:

 

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

   第十四步,回到第三步的SIMULINK水位模糊控制模型,从SIMULINK库里把二维查询表拖一个到模型,把原来模型的模糊控制器去掉,包括它前面的那个MUX也去掉。点开查询表如下设置:

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

第十五步:最后用查询表代替模糊控制器的模型如下,你可以模拟查看控制效果了,阶跃测试是一般的测试方法,自己去实验吧。

转 如何在MATLAB下把模糊推理系统转化为查询表 - 易拉罐bb - 易拉罐的博客

 

http://foundy.blog.163.com/blog/static/2633834420100150439615/

  评论这张
 
阅读(1006)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017