• 用MATLAB生成模糊控制离线查询表


      实时采样得到的数据经过模糊化处理后输入机器,通过查询模糊规则表便可得到应有的输出模糊量,从而避免了近似推理过程。实际应用中,特别是在控制系统较为简单而采用单片机控制时,常常采用这种查表法。

      模糊控制表的计算有多种方式,手工编程计算会很繁琐。MATLAB中提供了evalfis函数进行模糊推理计算,也可以用SystemTest自动生成模糊控制表。注意MATLAB 2016a以后不再包含这个功能,可以用Unit Test Framework或Simulink Test代替。

      以双输入—单输出系统为例,计算模糊控制器的查询表。假设控制器输入为误差e和误差变化率ec,输出为控制量u,其基本论域分别为[emin,emax],[ecmin,ecmax],[umin,umax],对应的语言变量E、EC和U的论域为{-6,-5,…,-1,0,1,…,5,6},E、EC和U都选7个语言值{NB,NM,NS,Z,PS,PM,PB},各语言值的隶属函数采用三角函数。其分布可用表1表示,控制规则如表2所示。

    表1 语言变量E、EC和U的赋值表

    表2 模糊控制规则表

      1. 在MATLAB中输入fuzzy打开模糊控制工具箱,编辑输入输出变量的隶属度函数和模糊控制规则,然后将模糊推理系统保存为test.fis。

     

      解模糊用(最大隶属度) 最大值法(lom)。如果在模糊集合的论域上,有多个点u的隶属度都取最大值,可取这些点中坐标绝对值最大的点ulom作为模糊集合的代表点,这个方法称为最大隶属度最大值法。

      输入输出量的隶属度函数均采用三角形函数,如下图所示:

      并根据模糊控制规则表在Rule Editor中逐条添加规则:

      2. 打开Simulink模块,建立下图所示的系统框图。添加两个输入和一个输出端口,处理模块是Fuzzy Logic Controller (或Fuzzy Logic Controller with Ruleviewer)。

      

      在MATLAB命令窗口中输入fuzzy_control=readfis(‘test’)将之前建立的模糊控制器加载到工作空间,将Simulink中模糊控制模块的参数设置为fuzzy_control,保存该模型为fuzzy_model.mdl。

      3. 在Simulink界面菜单栏的Tools下拉菜单中找到SystemTest,打开测试界面。选中Main Test,菜单栏 Insert→Test Element → Simulink,选择第二步中建立的模型 fuzzy_model 。

      在Test Vectors 项里添加两个测试向量(点击New新建):变量名分别为input1和input2,编辑两个输入变量的取值范围为[-6:1:6],根据输入向量维度测试会循环169次;在Test Variables 里定义测试变量,变量名为output。

      接下来进行变量映射。把测试向量input1、input2分别映射到模糊控制器的输入口In1、In2,做为输入测试信号。把测试变量output 映射到模糊控制器输出口Out1。设置后的界面如下图所示。

     

      最后选择要保存的测试数据。在测试界面点Save Results项,设置如下:

      

      4. 点击Run运行测试,Main Test会进行169次迭代,等待测试结束。

     

      测试成功结束后,可以查看测试结果数据集:

      系统测试结果保存在 stresults.ResultsDataSet.output 中,为169*1 cell的单元数组(cell为 [n*1 double] 结构,表示系统被测试了n次)。在matlab中输入下面的命令,将第6次测试结果保存在变量table_data中。

    test_data=stresults.ResultsDataSet.output; 
    temp=zeros(169,1); 
    for i=1:169 
        temp(i)=test_data{i}(6); 
    end 
    table_data=reshape(a,13,13); 

      Workspace窗口中右击table_data变量,选择Open Selection可以查看模糊控制查询表:

      

      SystemTest还提供了图形化的结果查看功能。在系统测试界面点Tools→Test Results Viewer,点工具栏里的Surf Plot绘制三维曲面。X、Y 、Z分别设置为input1、input2和output。点Plot按钮,根据输入输出绘制的曲面如下图所示:

     

       在这里也可以输出控制表:右击输出变量output,在弹出的菜单中点击Export输出到工作空间中。

     

       output包含6个13X13的二维表,我们列出第六个:

     

      输入table=output(:,:,6); 生成table变量后点击Open Selection查看模糊控制表:

       5. 使用evalfis函数也可以根据给定输入计算模糊系统的输出。例如下面的语句计算模糊系统test在E=6,EC=3时的输出,可以看到结果与上面模糊控制查询表中的一致。

    fuzzy_control = readfis('test');
    evalfis([-6 3], fuzzy_control)
    ans =
       -4.9200

      evalfis也可以同时计算多组输入的结果,比如:

    evalfis([-3 6;-2 6],fuzzy_control)
    ans =
        3.0000
        2.0400

    参考:

    计算模糊控制离线查询表

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

    基于Matlab的模糊查询表生成方法探讨

    如何利用matlab将模糊逻辑转化为查询表

    使用MATLAB生成模糊控制的离线查询表

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

  • 相关阅读:
    线程总结(1)
    (转)远程线程DEMO
    VCL 中TList源码分析
    MVC Controller向View传值(ViewData与ViewBag)
    ASP.NET MVC 下拉框的传值的两种方式(第二种方式未完成)
    将数据在[Excel]和[任何数据源]之间导入导出_可临时保存查询结果
    服务器控件之二
    关闭窗口动画,加速窗口
    让XP控制台字符编码在UTF8与GBK之间切换
    WCF应用的编码实现
  • 原文地址:https://www.cnblogs.com/21207-iHome/p/9035559.html
Copyright © 2020-2023  润新知