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

  模糊控制表的计算有多种方式,手工编程计算会很繁琐。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下把模糊推理系统转化为查询表

用MATLAB生成模糊控制离线查询表的更多相关文章

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

    1.打开模糊控制工具箱,编辑输入输出变量的隶属度函数和模糊控制规则,如下图所示,导出为fuzzy_control.fis文件. 2.打开Simulink模块,建立下图所示的系统框图,两输入,一输出,处 ...

  2. 如何将Matlab中“模糊控制设计器”的隶属度函数导出图片(figure)

    如何将Matlab中"模糊控制设计器"的隶属度函数导出图片(figure)详情参考matlab官方帮助手册:plotmf()函数https://www.mathworks.com/ ...

  3. [转载]Matlab生成Word报告

    最近在进行一批来料的检验测试,一个个手动填写报告存图片太慢了,就有了种想要使用Matlab在分析完后数据可以自动生成PDF报告的想法,于是就去网上搜索了相关的资料,发现Matlab中文论坛上有xiez ...

  4. Matlab生成M序列的伪随机码

    伪随机编码中较常用的是m序列,它是线性反馈移位寄存器序列的一种,其特点是在相同寄存器级数的情况下输出序列周期最长.线性反馈移位寄存器的工作原理是,给定所有寄存器一个初始值,当移位脉冲到来时,将最后一级 ...

  5. asp.net下调用Matlab生成动态链接库

    对于这次论文项目,最后在写一篇关于工程的博客,那就是在asp.net下调用matlab生成的dll动态链接库.至今关于matlab,c/c++(opencv),c#(asp.net)我总共写了4篇配置 ...

  6. c++调用matlab生成的Dll动态连接库

    点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R ...

  7. 利用Matlab生成一个网格化的三维球面(生成直角坐标)

    利用Matlab生成一个网格化的三维球面,分别对径向方向.经度方向和纬度方向进行网格化,代码如下: %生成一个笛卡尔坐标系下球面网格的x,y,z坐标 %r为球面距离 %nJingdu,nWeidu分别 ...

  8. 【转】利用matlab生成随机数函数

    原文地址:利用matlab生成随机数函数 rand(n):生成0到1之间的n阶随机数方阵  rand(m,n):生成0到1之间的m×n的随机数矩阵 (现成的函数) betarnd:贝塔分布的随机数生成 ...

  9. 使用matlab生成sine波mif文件

    使用matlab生成sine波mif文件 作者:lee神 在使用altera 的FPGA中的rom过程中常常会使用到.mif文件或.hex文件.对于初学者,无论mif还是hex都是很令人疑惑的东西,这 ...

随机推荐

  1. JavaScript错误:Maximum call stack size exceeded错误

    错误的表面意思是,因为递归次数太多而内存溢出, 当然引起溢出的原因很多 找了下问题来源,发现引用了两个版本的jquery,在layout.cshtml母模块页中和视图中都引用了jq.导致循环调用,从而 ...

  2. Kibana加载样本数据

    kibana 6.2 加载样本数据 kibana loading sample data 下载样本数据 # 莎士比亚经典作品 wget https://download.elastic.co/demo ...

  3. 【Java】 剑指offer(37) 序列化二叉树

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现两个函数,分别用来序列化和反序列化二叉树. 思路 一般情况下 ...

  4. 为什么macos开机黑屏但是有声音?

    一般使用时间久了,或者升级系统就会出现这个情况.完全关机,然后按开机键,再按command+option+R+P.不要松手,等重启几次,响几次(3次左右).然后松手等它自己重启即可.   mac开机黑 ...

  5. Windows10 下安装scrapy 日志

    Windows10 下安装scrapy 日志 1.下载python3.6 2.添加python.exe和pip.exe的路径到系统环境变量path中 如c:\python36_64 C:\Python ...

  6. 优化 --cache

    注意:配置成cache的地址段就不能再放入data and code,因为链接的时候,是不包含cache地址段的,如果想使用L1DSRAM或L1P SRAM,则应该相应减小cache段大小. 1:Ke ...

  7. 学机器学习,不会数据处理怎么行?—— 一、NumPy详解

    最近学习强化学习和机器学习,意识到数据分析的重要性,就开始补Python的几个科学计算库,并总结到博客中.本篇博客中用到的代码在这里下载. 什么是Numpy? NumPy是Python数值计算最重要的 ...

  8. js数据结构之栈和队列的详细实现方法

    队列 队列中我们主要实现两种: 1. 常规队列 2. 优先队列(实际应用中的排队加急情况等) 常规队列的实现方法如下: // 常规队列 function Queue () { this.queue = ...

  9. ACM差分约束笔记

    https://www.cnblogs.com/31415926535x/p/10463112.html 很早之前学最短路的时候就看了一眼差分约束,,当时以为这种问题不怎么会出现,,而且当时为了只为了 ...

  10. 线程、对称多处理和微内核(OS 笔记三)

    线程.对称多处理 ​ 这一部分继续深入探讨与进程管理相关的高级概念并了解多处理机的对称多处理技术. 进程和线程 到目前为止提出的进程的概念包含两个特点: 资源所有权 存放进程映像的虚拟地址空间 调度/ ...