关键字:模糊控制;隶属函数;Matlab。
系列文章目录
模糊控制——(一)理论基础
模糊控制——(二)设计流程
模糊控制——(三)模糊洗衣机
模糊控制——(四)模糊自适应整定PID控制
模糊控制——(五)Sugeno模糊模型
模糊控制——创建与添加自定义的隶属函数
文章目录
- 系列文章目录
- 前言
- 一、工程环境
- 二、创建自定义隶属函数
- 三、添加自定义隶属函数
- 总结
前言
前些天有小伙伴对如何创建并添加自定义隶属函数有一些问题,故有此文进行一些问题答复。
一、工程环境
以下的案例基于:
- PC操作系统:WIN11
- MATLAB:2019a
二、创建自定义隶属函数
首先在命令行输入help addmf
:
在addmf的帮助文档中,可以看到隶属函数也支持自定义的算法,可使用自定义算法的字符串名称、字符向量名称和函数句柄(对于函数句柄不太明白的小伙伴可以走传送门——函数句柄传送门)。
在addmf参考页点击Build Fuzzy Systems Using Custom Functions,如图2.3转跳的参考页提供了自定义隶属函数的模板:
如图函数的形参有两个x、params分别是绘图时的很坐标向量、函数生成时需要的参数,在上述案例中params就是一个有八个元素的向量,其产生的函数效果如图2.4:
根据模板上隶属函数的定义形式创建一个脉冲函数:
% 模糊函数在范围内的横坐标向量不一定包含我们需求的点
% 比如x=5:1:10,params=2.1
% 故我们选择距离我们需求点最近的一个点当作脉冲产生点
function res=Func_ImpulseMF(x,params)y=zeros(1,length(x));% 当前脉冲产生点不在范围内 if params<x(1)||params>x(length(x))res=zeros(1,length(x));return;end% 当前脉冲产生点在范围内min=abs(x(1)-params); % 横坐标与脉冲产生点的最小距离set=1; % 与脉冲产生点最近的横坐标位置for k=2:1:length(x)% 当前点与脉冲产生点的距离更近if abs(x(k)-params)<min% 更新标记点set=k;% 更新最小距离min=abs(x(k)-params);endend% 在标记的点处产生脉冲for k=1:1:length(x)if k==sety(k)=1;elsey(k)=0;endendres=y;
end
三、添加自定义隶属函数
首先需要保证,自定义隶属函数文件与模糊控制程序文件在同一路径下:
创建一个模糊接口系统,并添加自定义隶属函数:
clc;
clear;
close all;
% t=-5:0.1:5;
% impulse1=t==0;
% figure(1);
% plot(t,impulse1);
% figure(2);
% impulse2=t==2;
% stem(t,impulse2);% Use a mamfis object to represent a Mamdani fuzzy inference system
% newfis指令未来将被移除 详情通过help newfis参见帮助页
% a=newfis('fuzz tank');
% a=mamfis('Name','fuzz tank');
a=mamfis();
a.Name='fuzz tank';
%%
% 创建模糊函数
% addvar未来将被移除 详情通过help addvar参见帮助页
% a=addvar(a,'input','e',[-3,3]);
a=addInput(a);
%%
% 创建第一个输入模糊变量与隶属度函数
a.Input(1).Name='e';
a.Input(1).Range=[-3,3];
a=addMF(a,'e','zmf' ,[-3,-1] ,'Name','NB');
a=addMF(a,'e','trimf',[-3,-1,1],'Name','NS');
a=addMF(a,'e','trimf',[-2,0,2] ,'Name','Z' );
a=addMF(a,'e','trimf',[-1,1,3] ,'Name','PS');
a=addMF(a,'e','smf' ,[1,3] ,'Name','PB');
figure(3);
plotmf(a,"input",1);
%%
% 创建第二个输入模糊变量与隶属度函数
% a=addvar(a,'input','ec',[-4,4]);
a.Output(1).Name='u';
a.Output(1).Range=[-4,4];
a=addMF(a,'u','zmf' ,[-4,-1] ,'Name','NB');
a=addMF(a,'u','trimf',[-4,-2,1] ,'Name','NM');
a=addMF(a,'u','trimf',[-2,0,2] ,'Name','Z' );
a=addMF(a,'u','trimf',[-1,2,4] ,'Name','PS');
a=addMF(a,'u','Func_ImpulseMF',3,'Name','PB');
figure(4);
plotmf(a,"output",1);
注意这里a.Output(1).Range=[-4,4]
为模糊接口系统添加输出的范围,同时会自动生成一个绘图时的横坐标向量,也就是我们自定义隶属函数里需要的参数x
;a=addMF(a,'u','Func_ImpulseMF',3,'Name','PB');
其中的参数3
就是自定义隶属函数里需要的参数params
。运行后得到图像:
由图3.2可知,产生脉冲的点不是我们期望的x=3,原因就是模糊接口系统生成在 x = [ − 4 , 4 ] x=[-4,4] x=[−4,4]范围的横坐标向量时,不包括 x = 3 x=3 x=3这个点,故我们的程序在x=2.9778处产生了脉冲。
总结
本文针对如何创建与添加自定义隶属函数给出了流程。