範例:MCK 系統模糊控制 I(單輸入)
把模糊控制器接到質量–彈簧–阻尼(MCK)系統上,讓質量塊的位移追上單位步階。這一頁是最簡單的版本:控制器只看誤差一個輸入。下方是老師錄製的建模與模擬示範,附檔為 MCKFuzzy1.zip(含 FuzzyMCK1.mdl、MCK 方塊所在的 mylib.mdl 與 MCKFZ.fis)。
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 1 節:FuzzyMCK1.mdl 與 MCKFZ.fis),可以直接在瀏覽器執行、修改參數。⬇ 下載 Fuzzy_control.ipynb
系統與控制器 Plant and Controller
(以下依附檔整理並模擬,為補充)受控體是 Simulink 的 MCK_System 方塊(m = 1、c = 1、k = 2):
$$m\ddot x + c\dot x + kx = F$$MCKFZ.fis 是 Mamdani 型(min/max/重心),只有三條規則:
| 誤差 e(範圍 −1.2~1.2) | → 力 F(範圍 −10~10) |
|---|---|
負 trapmf [−2.06 −1.3 −1.1 0] | 負力 NF trimf [−18 −10 0] |
零 trimf [−0.1 0 0.1] | 零 ZF trimf [−2 0 2] |
正 trapmf [0 1.1 1.3 2.06] | 正力 PF trimf [0 10 18] |
模擬結果 Simulation
單輸入的模糊控制器其實就是一條非線性曲線 F(e),作用像一個「非線性的比例控制」。左圖畫出這條曲線;右圖是步階(t = 1 s 起)的響應:
- 位移衝到 1.33(超越量 33%),振盪後停在 0.933,不會回到 1。
- 靜止時彈簧要 kx = 2x 的力才撐得住,這個力只能來自誤差:F(e) = 2(1 − e)。兩條線的交點就是穩態,e = 0.067。和線性比例控制一樣,沒有積分作用就有穩態誤差。
- 「零」的三角形很窄(±0.1),誤差稍大一點,控制力就從 0 跳到「正力」,所以曲線在原點附近很陡,像增益很大的比例控制,因此超越量大。
下一頁加入誤差的微分,相當於加上阻尼,可以壓低超越量:MCK 模糊控制 II。
模擬時的錯誤與排除 Boolean Logic Signals
原講義的截圖顯示,在當時的 Simulink 版本執行這個模型,會出現錯誤 “MinMax blocks do not accept 'boolean' signals”。原因是 FIS 方塊內部解模糊化子系統裡的「Zero Strength」比較器輸出 boolean,接到 Max 方塊。排除方法:
- Simulation → Simulation parameters…
- 切到 Advanced 頁籤,把 Optimizations 中的 Boolean logic signals 由 On 改為 Off,按 Apply。
這樣比較器改輸出 double,就能執行。新版 Matlab 已沒有這個問題。比較器等關係運算方塊的說明見附檔 Relational Operator(PDF)。




