計算智能 — 模糊計算
1. 簡介
模糊計算涉及的就是依據模糊規則,從幾個控制變量的輸入得到最終輸出的過程。這個過程可以細分爲4個模塊:模糊規則庫、模糊化、推理方法和去模糊化。
模糊規則庫是專家提供的模糊規則。模糊化是根據隸屬度函數從具體的輸人得到對模糊集隸屬度的過程。由於規則是由模糊的自然語言表述的,而輸人是精確數值,沒有模糊化的過程,規則就難以被應用。推理方法是從模糊規則和輸人對相關模糊集的隸屬度得到模糊結論的方法。去模糊化就是將模糊結論轉化爲具體的、精確的輸出的過程。由於推理結論是用模糊隸屬度表示的,沒有去模糊化的過程,結論就無法被實際應用。
2. 實現
輸入1:
輸入2:
輸出:
建立的規則結果(49條):
規則庫:
3. 代碼
%模糊控制器設計
a=newfis('fuzzf'); %創建新的模糊推理系統
%輸入1
f1=1;
a=addvar(a,'input','e',[-13*f1,13*f1]);
%添加 e 的模糊語言變量
a=addmf(a,'input',1,'NB','zmf',[-13*f1,-8*f1]);
%添加 e 的模糊語言變量的隸屬度函數(z型)
a=addmf(a,'input',1,'NM','trimf',[-13*f1,-7*f1,0]);
%隸屬度函數爲三角形
a=addmf(a,'input',1,'NS','trimf',[-13*f1,-10*f1,1*f1]);
a=addmf(a,'input',1,'Z','trimf',[-12*f1,0,12*f1]);
a=addmf(a,'input',1,'PS','trimf',[-10*f1,10*f1,13*f1]);
a=addmf(a,'input',1,'PM','trimf',[0,5*f1,13*f1]);
a=addmf(a,'input',1,'PB','smf',[10*f1,13*f1]);
%輸入2
f2=1;
a=addvar(a,'input','ec',[-7*f2,7*f2]);
%添加 ec 的模糊語言變量
a=addmf(a,'input',2,'NB','zmf',[-3*f2,-1*f2]);
a=addmf(a,'input',2,'NM','trimf',[-4*f2,-1*f2,0]);
a=addmf(a,'input',2,'NS','trimf',[-7*f2,-3*f2,5*f2]);
a=addmf(a,'input',2,'Z','trimf',[-4*f2,0,4*f2]);
a=addmf(a,'input',2,'PS','trimf',[-5*f2,1*f2,7*f2]);
a=addmf(a,'input',2,'PM','trimf',[0,2*f2,6*f2]);
a=addmf(a,'input',2,'PB','smf',[1*f2,3*f2]);
%輸出
f3=1.5;
a=addvar(a,'output','u',[-5*f3,7*f3]);
%添加 u 的模糊語言變量
a=addmf(a,'output',1,'NB','zmf',[-5*f3,-1*f3]);
a=addmf(a,'output',1,'NM','trimf',[-5*f3,-2*f3,0]);
a=addmf(a,'output',1,'NS','trimf',[-4*f3,-1*f3,1*f3]);
a=addmf(a,'output',1,'Z','trimf',[-3*f3,0,3*f3]);
a=addmf(a,'output',1,'PS','trimf',[-5*f3,1*f3,5*f3]);
a=addmf(a,'output',1,'PM','trimf',[0,3*f3,5*f3]);
a=addmf(a,'output',1,'PB','smf',[1*f3,5*f3]);
%規則庫
rulelist=[1 1 1 1 1; %編輯模糊規則,後倆個數分別是規則權重和AND OR選項
1 2 1 1 1;
1 3 1 1 1;
1 4 2 1 1;
1 5 2 1 1;
1 6 3 1 1;
1 7 4 1 1;
2 1 1 1 1;
2 2 2 1 1;
2 3 2 1 1;
2 4 2 1 1;
2 5 3 1 1;
2 6 4 1 1;
2 7 5 1 1;
3 1 7 1 1;
3 2 6 1 1;
3 3 4 1 1;
3 4 4 1 1;
3 5 3 1 1;
3 6 3 1 1;
3 7 1 1 1;
4 1 1 1 1;
4 2 5 1 1;
4 3 3 1 1;
4 4 2 1 1;
4 5 4 1 1;
4 6 2 1 1;
4 7 1 1 1;
5 1 3 1 1;
5 2 2 1 1;
5 3 5 1 1;
5 4 4 1 1;
5 5 3 1 1;
5 6 7 1 1;
5 7 1 1 1;
6 1 5 1 1;
6 2 2 1 1;
6 3 4 1 1;
6 4 5 1 1;
6 5 1 1 1;
6 6 7 1 1;
6 7 6 1 1;
7 1 3 1 1;
7 2 6 1 1;
7 3 5 1 1;
7 4 4 1 1;
7 5 3 1 1;
7 6 2 1 1;
7 7 1 1 1;];
a=addrule(a,rulelist); %添加模糊規則函數
showrule(a) %顯示模糊規則函數
a1=setfis(a,'DefuzzMethod','centroid'); %設置解模糊方法
writefis(a1,'fuzzf'); %保存模糊系統
a2=readfis('fuzzf'); %從磁盤讀出保存的模糊系統
disp('fuzzy Controller table:e=[-13,+13],ec=[-7,+7]');%顯示矩陣和數組內容
%推理
Ulist=zeros(7,7); %全零矩陣
for i=1:7
for j=1:7
e(i)=-4+i;
ec(j)=-4+j;
Ulist(i,j)=evalfis([e(i),ec(j)],a2); %完成模糊推理計算
end
end
% Ulist=ceil(Ulist) %朝正無窮方向取整
Ulist %朝正無窮方向取整
%畫出模糊系統
figure(1); plotfis(a2);
figure(2);plotmf(a,'input',1);
figure(3);plotmf(a,'input',2);
figure(4);plotmf(a,'output',1);
4. 結論
該實驗的模糊控制有兩個輸入e和ec,一個輸出u,一共可以構造49條規則。