matlab用脚本实现模糊控制

前言

最近在学习模糊控制,遇到的一些小问题,特此记录一下。

准备

  • MATLAB R2020

参考

matlab中模糊控制

过程

参考文章中的模糊控制器已经是很老的版本了,所以我查阅了官方文档,将一些内容更新。

用Matlab中的脚本做一个简单的模糊控制,流程如下:

1、创建一个 FIS (Fuzzy Inference System ) 对象,

原来的newfis函数将在未来版本中删除,所以我们得替换成新的函数(mamfis 或者 sugfis),而newfis函数创建的FIS默认对象类型是mamdani,刚好mamfis函数默认对象类型是mamdani,所以可以直接替换。

%使用mamfis对象表示1型Mamdani模糊推理系统
fisMat = mamfis;

一般只用提供第一个参数即可,后面均用默认值。

2、增加模糊语言变量
模糊变量有两类:input 和 output。在每次增加模糊变量,都会按顺序分配一个 index,后面要通过该 index 来使用该变量。版本更新后,不再使用addvar,输入和输出都要用单独的函数来使用,如下所示

%使用一个或多个名称-值对参数配置输入\输出变量。
fisMat= addInput(fisMat,,range,Name,Value)
fisMat = addOutput(fisMat,range,Name,Value)

Value的值可以是输入的名称,所以不用特意去记index,后面只要把Value的值传进去,他就会自动排序。

3、增加模糊语言名称,即模糊集合。

%使用一个或多个名称-值对参数配置成员隶属度函数。
fisMat = addMF(fisMat,varName,type,parameters,Name,Value)

每个模糊语言名称(Name-Value)从属于一个模糊语言(varName)。Fuzzy 工具箱中没有找到离散模糊集合的隶属度表示方法,暂且用插值后的连续函数代替。(这句话不太懂,等下次更新,再来解决这个问题)

参数type即隶属度函数(Membership Functions),它可以是 Gaussmf、trimf、trapmf等,也可以是自定义的函数。

每一个语言名称也会有一个index,按加入的先后顺序得到,从 1 开始。(这里版本更新后,没有了varIndex,只要Value的值对应相同,它就会按加入的先后顺序开始)

4、增加控制规则,即模糊推理的规则。

%将筛选规则添加到指定的筛选。
fisMat = addRule(fisMat,rulelist);
%rulelist的各个参数
rulelist[first input;second input;first output;Rule weight;Fuzzy operator]
  • first input:第一个输入变量的索引
  • second input:第二个输入变量的索引
  • first output:第一个输出变量的索引
  • Rule weight:规则权重([0,1])
  • Fuzzy operator:操作符(1表示AND,2表示OR,负数代表NOT)

其中 rulelist 是一个矩阵,每一行为一条规则。
假定该 FIS 有 M个输入和 N 个输出,则每行有 M+N+2 个元素,前 M 个数分别表示 M 个输入变量的某一个语言名称的 index,没有的话用 0 表示,后面的 N个数也类似。以文末的代码为例

rulelist = [1 1 1 1;2 2 1 1];

第一行表示的是

If (E is small) , then (U is small).
%选择输入第一个索引,输出第一个索引,权重为1,操作符为AND

第二行表示的是

If (E is big) , then (U is big).
%选择输入第二个索引,输出第二个索引,权重为1,操作符为AND

注意,rulelist矩阵的最后两个一定是权重和操作符

举个例子,输入变量有两个语言名称(A,B),输出变量有四个语言名称(C,D,E,F)

If A and B , then C and D.
%[1 2 1 2 1 1]

If A , then F.
%[1 0 4 1 1]

5、给定输入,得到输出,即进行模糊推理。

%评估输入中输入值的模糊推理系统fisMat,并在输出中返回结果输出值
output = evalfis(fisMat,input)

其中 fisMat为前面建立的那个 FIS 对象。

一个完整的例子如下:

%模糊控制器实现示例
clear all;
fisMat = mamfis;

fisMat = addInput(fisMat,[0 7],'Name',"E");
fisMat = addMF(fisMat,'E','trimf',[0 1 4.333],'Name','small');
fisMat = addMF(fisMat,'E','trimf',[1.6667 6 7],'Name','big');

fisMat = addOutput(fisMat,[0 7],'Name',"U");
fisMat = addMF(fisMat,'U','trimf',[0 1 4.333],'Name','small');
fisMat = addMF(fisMat,'U','trimf',[1.6667 6 7],'Name','big');

rulelist = [1 1 1 1;2 2 1 1];
fisMat = addRule(fisMat,rulelist);

u = evalfis(fisMat,4)

在这里插入图片描述

赠人玫瑰,手有余香。点个赞啦!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值