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)

在这里插入图片描述

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

以下是一个简单的 Matlab 模糊控制代码示例: ``` % 模糊控制器 function output = fuzzy_controller(error, delta_error) % 定义模糊变量和隶属度函数 error_mf = [0, 0.25, 0.5, 0.75, 1]; % 误差模糊变量 delta_error_mf = [0, 0.25, 0.5, 0.75, 1]; % 误差变化率模糊变量 output_mf = [-1, -0.5, 0, 0.5, 1]; % 输出模糊变量 error_fuzzy = fuzzify(error, error_mf); delta_error_fuzzy = fuzzify(delta_error, delta_error_mf); % 定义规则库 rules = [ 3, 5, 5, 4, 3; 3, 4, 5, 4, 3; 2, 3, 4, 3, 2; 1, 2, 3, 2, 1; 1, 1, 2, 1, 1; ]; % 模糊推理 output_fuzzy = zeros(length(output_mf), 1); for i = 1:length(output_mf) activation = min(error_fuzzy(rules(:, i)), delta_error_fuzzy); output_fuzzy(i) = sum(activation .* output_mf(i)); end % 去模糊化 output = defuzzify(output_fuzzy, output_mf); end % 模糊化函数 function fuzzy = fuzzify(x, mf) fuzzy = zeros(length(mf), 1); for i = 1:length(fuzzy) if x <= mf(1) fuzzy(i) = 1; elseif x >= mf(end) fuzzy(i) = 0; elseif x > mf(i-1) && x <= mf(i) fuzzy(i) = (mf(i) - x) / (mf(i) - mf(i-1)); elseif x > mf(i) && x < mf(i+1) fuzzy(i) = (x - mf(i-1)) / (mf(i+1) - mf(i-1)); end end end % 去模糊化函数 function crisp = defuzzify(fuzzy, mf) crisp = sum(fuzzy .* mf) / sum(fuzzy); end ``` 该模糊控制器接受两个输入参数:误差和误差变化率。它使用模糊变量和隶属度函数来模糊化输入,并使用规则库和模糊推理来计算输出模糊变量。最后,它使用去模糊化函数将输出模糊变量转换为一个实数输出。您可以根据您的需求修改模糊变量、隶属度函数和规则库。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值