%动力定位模糊控制算法:仅控制艏向的情况
%艏向角偏差X实际论域[-0.6,0.6]
%艏向偏转角速度偏差Y实际论域[-0.2,0.2]
%控制量为转矩T,其实际论域为[-2,2]
%新建名为“dynamic”的模糊推理系统
a = newfis('dynamic');
%在新建推理系统中,添加名为“X”,论域为[-0.6,0.6]的输入变量,
a = addvar(a,'input','X',[-0.6,0.6]);
%为X添加模糊集合,数字1代表是第一个输入,如果是多输入,第二个输入则为2,以此类推。
a = addmf(a,'input',1,'NB','zmf',[-0.6,-0.2]);
a =addmf(a,'input',1,'NS','trimf',[-0.6,-0.2,0.2]);
a =addmf(a,'input',1,'ZO','trimf',[-0.4,0,0.4]);
a =addmf(a,'input',1,'PS','trimf',[-0.2,0.2,0.6]);
a = addmf(a,'input',1,'PB','smf',[0.2,0.6]);
%在新建推理系统中,添加名为“Y”,论域为[-0.2,0.2]的输入变量,
a = addvar(a,'input','Y',[-0.2,0.2]);
%为Y添加模糊集合,数字1代表是第一个输入,如果是多输入,第二个输入则为2,以此类推。
a = addmf(a,'input',2,'NB','zmf',[-0.2,-0.1]);
a =addmf(a,'input',2,'NS','trimf',[-0.2,-0.1,0]);
a =addmf(a,'input',2,'ZO','trimf',[-0.1,0,0.1]);
a =addmf(a,'input',2,'PS','trimf',[0,0.1,0.2]);
a = addmf(a,'input',2,'PB','smf',[0.1,0.2]);
%在新建推理系统中,添加名为“T”,论域为[-2,2]的输出变量
a = addvar(a,'output','T',[-2,2]);
%为T添加模糊集合,数字1代表是第一个输出,如果是多输出,第二个输出则为2,以此类推。
a = addmf(a,'output',1,'NB','zmf',[-2,-1]);
a =addmf(a,'output',1,'NS','trimf',[-2,-1,0]);
a =addmf(a,'output',1,'ZO','trimf',[-1,0,1]);
a =addmf(a,'output',1,'PS','trimf',[0,1,2]);
a = addmf(a,'output',1,'PB','smf',[1,2]);
%建立模糊规则,列数=输入变量的数量+输出变量的数量+2:如下
%第一列代表第一个输入变量的各个模糊集合,若是多变量,则后续输入变量随其后
%第二列代表输出变量的模糊集合。
%行数:多输入:行数=各输入变量的模糊集合数量的乘积。
%倒数第二列表示规则权重,其值介于0-1之间,通常保留为1
%最后一列表示该条规则的先行项的模糊运算符,1 表示 AND,2 表示 OR
rulelist=[1 1 1 1 1;
1 2 1 1 1;
1 3 2 1 1;
1 4 2 1 1;
1 5 3 1 1;
2 1 1 1 1;
2 2 2 1 1;
2 3 2 1 1;
2 4 3 1 1;
2 5 4 1 1;
3 1 2 1 1;
3 2 2 1 1;
3 3 3 1 1;
3 4 4 1 1;
3 5 4 1 1;
4 1 2 1 1;
4 2 3 1 1;
4 3 4 1 1;
4 4 4 1 1;
4 5 5 1 1;
5 1 3 1 1;
5 2 4 1 1;
5 3 4 1 1;
5 4 5 1 1;
5 5 5 1 1;];
a = addrule(a,rulelist);
%设置反模糊化算法:DefuzzMethod
%centroid:面积重心法;
% bisector:面积等分法;
% mom:最大隶属度平均法;
% som:最大隶属度取最小法;
% lom:最大隶属度取最大法
a1 = setfis(a,'DefuzzMethod','mom');
%生成dynamic.fis文件
writefis(a1,'dynamic');
%读出.fis文件
a2 = readfis('dynamic');
figure(1);
plotfis(a2);
figure(2);
plotmf(a,'input',1);
figure(3);
plotmf(a,'input',2);
figure(4);
plotmf(a,'output',1);
showrule(a);
ruleview('dynamic');
%模糊推理,并输出对应输入的模糊推理结果
b=evalfis([-0.3,-0.15],a2);
fprintf(' %d ',b);
模糊规则:
输出:-1