實時采樣得到的數據經過模糊化處理后輸入機器,通過查詢模糊規則表便可得到應有的輸出模糊量,從而避免了近似推理過程。實際應用中,特別是在控制系統較為簡單而采用單片機控制時,常常采用這種查表法。
模糊控制表的計算有多種方式,手工編程計算會很繁瑣。MATLAB中提供了evalfis函數進行模糊推理計算,也可以用SystemTest自動生成模糊控制表。注意MATLAB 2016a以后不再包含這個功能,可以用Unit Test Framework或Simulink Test代替。
以雙輸入—單輸出系統為例,計算模糊控制器的查詢表。假設控制器輸入為誤差e和誤差變化率ec,輸出為控制量u,其基本論域分別為[emin,emax],[ecmin,ecmax],[umin,umax],對應的語言變量E、EC和U的論域為{-6,-5,…,-1,0,1,…,5,6},E、EC和U都選7個語言值{NB,NM,NS,Z,PS,PM,PB},各語言值的隸屬函數采用三角函數。其分布可用表1表示,控制規則如表2所示。
表1 語言變量E、EC和U的賦值表

表2 模糊控制規則表

1. 在MATLAB中輸入fuzzy打開模糊控制工具箱,編輯輸入輸出變量的隸屬度函數和模糊控制規則,然后將模糊推理系統保存為test.fis。

解模糊用(最大隸屬度) 最大值法(lom)。如果在模糊集合的論域上,有多個點u的隸屬度都取最大值,可取這些點中坐標絕對值最大的點ulom作為模糊集合的代表點,這個方法稱為最大隸屬度最大值法。
輸入輸出量的隸屬度函數均采用三角形函數,如下圖所示:

並根據模糊控制規則表在Rule Editor中逐條添加規則:

2. 打開Simulink模塊,建立下圖所示的系統框圖。添加兩個輸入和一個輸出端口,處理模塊是Fuzzy Logic Controller (或Fuzzy Logic Controller with Ruleviewer)。

在MATLAB命令窗口中輸入fuzzy_control=readfis(‘test’)將之前建立的模糊控制器加載到工作空間,將Simulink中模糊控制模塊的參數設置為fuzzy_control,保存該模型為fuzzy_model.mdl。

3. 在Simulink界面菜單欄的Tools下拉菜單中找到SystemTest,打開測試界面。選中Main Test,菜單欄 Insert→Test Element → Simulink,選擇第二步中建立的模型 fuzzy_model 。

在Test Vectors 項里添加兩個測試向量(點擊New新建):變量名分別為input1和input2,編輯兩個輸入變量的取值范圍為[-6:1:6],根據輸入向量維度測試會循環169次;在Test Variables 里定義測試變量,變量名為output。

接下來進行變量映射。把測試向量input1、input2分別映射到模糊控制器的輸入口In1、In2,做為輸入測試信號。把測試變量output 映射到模糊控制器輸出口Out1。設置后的界面如下圖所示。


最后選擇要保存的測試數據。在測試界面點Save Results項,設置如下:

4. 點擊Run運行測試,Main Test會進行169次迭代,等待測試結束。

測試成功結束后,可以查看測試結果數據集:

系統測試結果保存在 stresults.ResultsDataSet.output 中,為169*1 cell的單元數組(cell為 [n*1 double] 結構,表示系統被測試了n次)。在matlab中輸入下面的命令,將第6次測試結果保存在變量table_data中。
test_data=stresults.ResultsDataSet.output;
temp=zeros(169,1);
for i=1:169
temp(i)=test_data{i}(6);
end
table_data=reshape(a,13,13);
Workspace窗口中右擊table_data變量,選擇Open Selection可以查看模糊控制查詢表:

SystemTest還提供了圖形化的結果查看功能。在系統測試界面點Tools→Test Results Viewer,點工具欄里的Surf Plot繪制三維曲面。X、Y 、Z分別設置為input1、input2和output。點Plot按鈕,根據輸入輸出繪制的曲面如下圖所示:

在這里也可以輸出控制表:右擊輸出變量output,在彈出的菜單中點擊Export輸出到工作空間中。

output包含6個13X13的二維表,我們列出第六個:

輸入table=output(:,:,6); 生成table變量后點擊Open Selection查看模糊控制表:

5. 使用evalfis函數也可以根據給定輸入計算模糊系統的輸出。例如下面的語句計算模糊系統test在E=6,EC=3時的輸出,可以看到結果與上面模糊控制查詢表中的一致。
fuzzy_control = readfis('test');
evalfis([-6 3], fuzzy_control)
ans =
-4.9200
evalfis也可以同時計算多組輸入的結果,比如:
evalfis([-3 6;-2 6],fuzzy_control)
ans =
3.0000
2.0400
參考:
