关于fuzzy Controller的用法.docx
《关于fuzzy Controller的用法.docx》由会员分享,可在线阅读,更多相关《关于fuzzy Controller的用法.docx(12页珍藏版)》请在冰点文库上搜索。
![关于fuzzy Controller的用法.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/81ab0a6f-1a82-4452-8db9-68942cbddace/81ab0a6f-1a82-4452-8db9-68942cbddace1.gif)
关于fuzzyController的用法
调用fuzzy工具箱,生成的是一个.fis的文件,文件名就是你在工具箱里边定义的名字,如图中的4位置。
通过调用file—import—fromfile可以导入使用文本编辑其编辑好的fis文件,进行修改。
可以把编辑好的模糊推理器导出到文件中。
File—export
如图中1位置,当选中一个模块的时候,相应的模块边框会变色。
双击就可以对他进行编辑,输入的模糊话,输出(图总位置3)的去模糊。
双击图中2位置的模块添加相应的模糊推理规则,对应生成的fis文件当中的[rules]下边的东东。
图中位置5和位置6对应的地方的内容基本不用变,目前模糊推理一般都用的这种方法。
图中位置7的位置是选中上边的模块的时候,相应的信息,可以修改名字,但不能编辑其他的内容。
这个图是模糊推理输入输出成员函数(membershipfunction)的编辑其,选中位置1的其中一个,就可以编辑对应的隶属度函数。
AddMFS是成组添加隶属度函数。
这种方式添加的时候,隶属度函数的类型是一样的,比如都用三角函数,或都用高斯函数。
用三角的多。
Addcustommf这个是单独添加一个隶属度函数。
其中涉及到得几个变量是:
模糊语言变量名称。
如图总共的mf1,mf2,对应实际用的NBNM之类的。
还有就是隶属度函数类型。
再一个就是隶属函数对应的几个端点。
高斯和三角都有三个,s型函数和z型函数有两个。
当然添加隶属度函数的时候,可以先确定形状,选用什么类型的函数,然后是用几个,完了先粗略的添加进来。
之后可以在上图位置2对应要修改的隶属函数,选中以后,移动各个小方块,再细改。
注意位置2右上角的,那个是函数曲线显示的点数,显示的越多,越精细,但是可能就越耗cpu。
我见过的一般都用三角,计算简单。
顶多最左边用z型函数,最右边用s函数。
中间用一个高斯。
输入输出隶属度函数确定后,完了就是编辑模糊规则
位置1为添加好的规则。
位置2为输入组合逻辑,mf1,mf2对应各个输入的模糊语言变量,具体看实际是定的名字。
如NB,NM。
。
。
。
。
可以对某个模糊语言变量执行not逻辑。
输入组合的时候可以选择and或者是or。
权重一般都是1。
。
。
。
位置3的地方是对应的左边的2的每个阻隔逻辑,输出要输出的那个模糊语言变量。
最红点addrule就可以在位置1看到相应的新添加的模糊规则。
完了点最上边模糊工具箱的file---export---toworkspace导入模糊推力器到工作空间
File—export—tofile是到出到文件。
最好导出到文件,这样下次还可以用,文件名就是你在simulink调用模糊逻辑块是要写的名字,加后缀,然后用单引号括起来。
到此,一个完整的模糊推理机(模糊控制器)就完成了。
下边是我用到的2输入3输出,输入、输出每个都有7个模糊语言变量,共有7*7共49条rules,下边是抓图。
下边是生成的fis文件。
在这个里边修改也可以达到同样的效果。
在fis文件当中,不能有注释什么的。
[System]这个是关键字
Name='fuzzypid'模糊推理机名字,这个最好和文件名字统一
Type='mamdani'类型,不用变
Version=2.0版本
NumInputs=2输入变量个数,按实际的来
NumOutputs=3输出变来那个个数,按实际的来
NumRules=49rules个数
AndMethod='min'不用变
OrMethod='max'不用变
ImpMethod='min'不用变
AggMethod='max'不用变
DefuzzMethod='centroid'不用变,解模糊方法
[Input1]不能变,第一个输入变量
Name='e'输入变量的名字
Range=[-33]论域范围
NumMFs=7模糊语言个数
MF1='NB':
'zmf',[-31]第一个模糊语言变来那个对应的隶属度函数,改后边的就成,分别是模糊语言变量名,隶属函数形状,关键点。
下同,输入变量,输出变量
MF2='NM':
'trimf',[-3-20]
MF3='NS':
'trimf',[-3-11]
MF4='Z':
'trimf',[-202]
MF5='PS':
'trimf',[-113]
MF6='PM':
'trimf',[023]
MF7='PB':
'smf',[-13]
[Input2]第二个输入
Name='ec'
Range=[-33]
NumMFs=7
MF1='NB':
'zmf',[-31]
MF2='NM':
'trimf',[-3-20]
MF3='NS':
'trimf',[-3-11]
MF4='Z':
'trimf',[-202]
MF5='PS':
'trimf',[-113]
MF6='PM':
'trimf',[023]
MF7='PB':
'smf',[-13]
[Output1]第一个输出
Name='kp'
Range=[-0.30.3]
NumMFs=7
MF1='NB':
'zmf',[-0.3-0.1]
MF2='NM':
'trimf',[-0.3-0.20]
MF3='NS':
'trimf',[-0.3-0.10.1]
MF4='Z':
'trimf',[-0.200.2]
MF5='PS':
'trimf',[-0.10.10.3]
MF6='PM':
'trimf',[00.20.3]
MF7='PB':
'smf',[0.10.3]
[Output2]
Name='ki'
Range=[-0.060.06]
NumMFs=7
MF1='NB':
'trimf',[-0.06-0.06-0.02]
MF2='NM':
'trimf',[-0.06-0.040]
MF3='NS':
'trimf',[-0.06-0.020.02]
MF4='Z':
'trimf',[-0.0400.04]
MF5='PS':
'trimf',[-0.020.020.06]
MF6='PM':
'trimf',[00.040.06]
MF7='PB':
'trimf',[0.020.060.06]
[Output3]
Name='kd'
Range=[-33]
NumMFs=7
MF1='NB':
'zmf',[-31]
MF2='NM':
'trimf',[-3-20]
MF3='NS':
'trimf',[-3-11]
MF4='Z':
'trimf',[-202]
MF5='PS':
'trimf',[-113]
MF6='PM':
'trimf',[023]
MF7='PB':
'smf',[-13]
[Rules]这个是模糊推理规则分别是输入,输出,
(1):
1这两个不用变。
比如用的是NB,NM,NS,Z,PS,PM,PB的话,NB就是1,依次类推7*7=49条模糊规则,主要是要遍历两个输入,每个输入有7个,就是49条了…..
11,715
(1):
1
12,713
(1):
1
13,621
(1):
1
14,621
(1):
1
15,531
(1):
1
16,442
(1):
1
17,445
(1):
1
21,715
(1):
1
22,713
(1):
1
23,621
(1):
1
24,532
(1):
1
25,532
(1):
1
26,443
(1):
1
27,344
(1):
1
31,614
(1):
1
32,623
(1):
1
33,623
(1):
1
34,532
(1):
1
35,443
(1):
1
36,353
(1):
1
37,354
(1):
1
41,624
(1):
1
42,623
(1):
1
43,533
(1):
1
44,443
(1):
1
45,353
(1):
1
46,263
(1):
1
47,264
(1):
1
51,524
(1):
1
52,534
(1):
1
53,444
(1):
1
54,354
(1):
1
55,354
(1):
1
56,264
(1):
1
57,274
(1):
1
61,547
(1):
1
62,445
(1):
1
63,355
(1):
1
64,255
(1):
1
65,265
(1):
1
66,275
(1):
1
67,177
(1):
1
71,447
(1):
1
72,447
(1):
1
73,256
(1):
1
74,266
(1):
1
75,265
(1):
1
76,175
(1):
1
77,177
(1):
1
用m文件进行模糊仿真的话,你那个pid书里边就有程序,大概过程是:
a=newfis('fuzzypid');添加模糊推理器a
a=addvar(a,'input','e',[-3,3]);给推力器a添加变量,input或output,变量名字,范围,下边这句是添加membershipfunction。
a=addmf(a,'input',1,'NB','zmf',[-3,1]);哪个模糊推理器,变量类型IN/OUT,顺序(在rule中用到),语言变量,函数类型,关键点。
输入输出都一样。
添加完输入输出变量得隶属度函数,下边就是添加模糊规则。
rulelist=[1171511;
1271311;
…….
7717711];
a=addrule(a,rulelist);
先输入模糊规则,然后调用addrule把模糊规则添加到指定的模糊推理器a。
a=setfis(a,'defuzzmethod','centroid');解模糊方法
writefis(a,'fuzzypid');保存模糊推理器a,到文件fuzypid后缀为.FIS
a=readfis('fuzzypid');可用可不用。
如果有现成的,上边的可以不用,直接用readfis就可以把保存的fis文件送给a
k_pid=evalfis([e_1,ec_1],a);这句是在仿真时候,进行模糊推理,送一组输入,经模糊推理后,得到一组输出。
模糊控制器的设计我认为最麻烦的是:
输入输出的匹配问题,隶属函数的划分,关键点的处理,还有模糊规则,没有可参照的程序,是个很麻烦的工作,得反复看曲线,然后修改,最终才可能得到有效的曲线。