範例:水槽液位控制的 FIS
老師錄製的操作示範:開啟並檢視水槽液位控制的 FIS(附檔 tank.fis)。問題說明見 水槽液位控制。
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 2 節 tank.fis 與平衡誤差),可以直接在瀏覽器執行、修改參數。⬇ 下載 Fuzzy_control.ipynb
歸屬函數 Membership Functions
(以下整理自附檔,為補充)Mamdani 型;AND = prod、OR = probor、蘊含 prod(縮放而非截頂)、聚合 max、解模糊化 centroid。
| 變數 | 範圍 | 歸屬函數 |
|---|---|---|
| 輸入 level(水位誤差) | −1~1 m | high 過高、okay 剛好、low 過低:gaussmf σ = 0.3,中心 −1、0、1 |
| 輸入 rate(水位變化率) | −0.1~0.1 m/s | negative 下降、none 不變、positive 上升:gaussmf σ = 0.03,中心 −0.1、0、0.1 |
| 輸出 valve(閥速度) | −1~1 | close_fast 快關 [−1 −0.9 −0.8]、close_slow 慢關 [−0.6 −0.5 −0.4]、no_change 不動 [−0.1 0 0.1]、open_slow 慢開 [0.2 0.3 0.4]、open_fast 快開 [0.8 0.9 1](trimf) |
level 是「期望 − 實際」,所以誤差為負(中心 −1)代表水位過高,為正代表過低。
規則 Rules
- If level is okay, then valve is no_change.(水位剛好就不動)
- If level is low, then valve is open_fast.(水位過低就快開)
- If level is high, then valve is close_fast.(水位過高就快關)
- If level is okay and rate is positive, then valve is close_slow.(水位剛好但還在上升,就慢慢關)
- If level is okay and rate is negative, then valve is open_slow.(水位剛好但還在下降,就慢慢開)
前三條只看誤差,像一個比例控制;後兩條在接近目標時依變化率提前修正,避免衝過頭。五條規則就涵蓋了整個操作範圍,這正是模糊控制的優點:規則直接寫出操作員的經驗。
互動模擬 Try It
下方動畫使用同一個 tank.fis,可以看到每條規則的激發強度隨水位變化(推論程式與本站 Python 模組逐點比對一致,見 verify_fzex.py):