範例:MCK 系統模糊控制 II(雙輸入)
同一個 MCK 系統(m = 1、c = 1、k = 2),控制器改用兩個輸入:誤差 e 與誤差的變化率 ė(Simulink 以 Derivative 方塊求得,再用 Mux 和 e 合併送入 FIS)。下方是老師錄製的示範,附檔為 MCKFuzzy2.zip(FuzzyMCK2.mdl、MCKFZ2.fis)。
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 1 節:四種 MCK 模糊控制器的比較),可以直接在瀏覽器執行、修改參數。⬇ 下載 Fuzzy_control.ipynb
規則的想法 Rule Design
原講義用下圖說明規則:質量塊從左邊出發往右走向目標,此時誤差為正、誤差在減小(ė 為負);衝過目標後誤差變負,往回走時 ė 為正。

(以下表格與說明為補充)依誤差與 ė 的組合排成規則表(N 負、Z 零、P 正;輸出 NL 負大、NM 負中、NS 負小、ZR 零、PS 正小、PM 正中、PL 正大):
| ė \ e | N(超過目標) | Z(在目標附近) | P(還沒到) |
|---|---|---|---|
| N(e 在變小) | NL | NS | PM |
| Z | — | ZR | — |
| P(e 在變大) | NM | PS | PL |
- 還沒到目標、而且正在接近(e 正、ė 負):給「正中」而非「正大」,提早收力,避免衝過頭。
- 還沒到、卻在遠離(e 正、ė 正):給「正大」把它拉回來。
- 在目標附近時只依 ė 小幅修正(正小/負小),作用像阻尼。
MCKFZ2.fis Membership Functions
Mamdani 型(AND = min、蘊含 min、聚合 max、重心)。e 與 ė 各三個歸屬函數,輸出七個:
編註:規則表有 7 條,但附檔 MCKFZ2.fis 只有 6 條,少了紅字的「e 零 且 ė 零 → ZR」。ė 的「零」雖然有定義,卻沒有任何規則用到。另外 ė 的「正」左端在 −0.199,而不是像 e 的「正」從 0 開始。這兩點合起來決定了穩態(以
verify_fzex.py 模擬確認):
- 若把「正」改回從 0 開始,起步瞬間 e = 1、ė = 0,ė 既不屬於「負」也不屬於「正」,6 條規則全部不觸發,控制器輸出範圍中點 0,系統完全不動。
- 照附檔(左端 −0.199):ė = 0 時「正」仍有 0.17。靜止在目標時,「e 零 且 ė 正 → PS」觸發,輸出 PS 的重心 3。這個力大於彈簧在 x = 1 時需要的 2,結果穩態停在 x = 1.016,誤差僅 1.6%。
- 若照規則表補上第 7 條,靜止時 ZR 與 PS 一起觸發,力被拉低到約 0.6,穩態反而退到 x = 0.881(見下方比較圖的紅色點線)。
模擬結果 Simulation
四種控制器的步階響應(t = 0 起步)比較如下。右圖是 ė = 0 時控制力隨誤差的變化,和彈簧力 2(1 − e) 的交點就是穩態:
加入 ė 後,峰值由 1.33 降到 1.13,穩態誤差由 6.7% 縮小到 1.6%。同一問題改用 Sugeno 型:零階、一階。