智慧型控制 Intelligent Control

範例: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 正大):

ė \ eN(超過目標)Z(在目標附近)P(還沒到)
N(e 在變小)NLNSPM
Z—ZR—
P(e 在變大)NMPSPL

MCKFZ2.fis Membership Functions

Mamdani 型(AND = min、蘊含 min、聚合 max、重心)。e 與 ė 各三個歸屬函數,輸出七個:

-1.501.501輸入 error(誤差 e)負零正-1.501.501輸入 derror(ė)負零正-1001001輸出 effort(F)負大零正大負小正小負中正中「正」的左端在 -0.199(不是 0)ė = 0 時「正」仍有 0.17
編註:規則表有 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(見下方比較圖的紅色點線)。
附檔的 6 條規則加上偏移的歸屬函數,等於給了一個接近「抵消彈簧力」的偏壓。對這個 k = 2 的系統剛好有效;換一個彈簧常數,偏差就會出現。根本的解法是加入積分作用,例如把誤差的積分也當成輸入。

模擬結果 Simulation

四種控制器的步階響應(t = 0 起步)比較如下。右圖是 ė = 0 時控制力隨誤差的變化,和彈簧力 2(1 − e) 的交點就是穩態:

024681000.20.40.60.811.21.4時間(s)位移 x(t = 0 起步)單輸入 Mamdani:峰值 1.33、穩態 0.933雙輸入 Mamdani:峰值 1.13、穩態 1.016雙輸入 Sugeno 零階:峰值 1.07、穩態 1.075雙輸入 Sugeno 一階:峰值 1.06、穩態 1.070雙輸入 Mamdani+規則表第 7 條:穩態 0.881-0.3-0.1500.150.301234誤差 e(ė = 0)靜止時的 F黃虛線:彈簧力 2(1−e)交點=穩態

加入 ė 後,峰值由 1.33 降到 1.13,穩態誤差由 6.7% 縮小到 1.6%。同一問題改用 Sugeno 型:零階、一階。