範例:水槽液位的 Simulink 模型
老師錄製的操作示範:水槽液位控制的 Simulink 模型(附檔 sltank.mdl,控制器讀入 tank.fis)。
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 2 節 sltank.mdl),可以直接在瀏覽器執行、修改參數。⬇ 下載 Fuzzy_control.ipynb
模型內容 Model
(以下依附檔整理並模擬,為補充)
- 設定值:1 m 加上振幅 0.5 m 的方波(0.1 rad/s,每 31.4 s 在 1.5 m 與 0.5 m 間切換)。
- 控制器輸入:水位誤差(設定 − 實際),以及水位變化率(經飽和方塊限制在 ±0.1 m/s)。
- 閥:FIS 的輸出是閥的開關速度,經限幅積分器(0~1,初值 0 即全關)得到開度;進水量 = 0.5 × 開度。
- 水槽:底面積 1 m²、槽高 2 m、出水口 0.05 m²、初始水位 0.5 m;出水量 = 0.05·√(2 × 9.8 × h)。
模型裡另有 PID Controller 方塊(P = 2、I = 0、D = 1)、切換開關與名為 Comparison 的示波器,看來是用來和 PID 控制比較;本站沒有重建這部分。
模擬結果 Simulation
以相同參數模擬 130 s:
- 每次設定值切換後,約 6 s 回到 ±5 cm 以內。升到 1.5 m 時超越約 1 cm;降到 0.5 m 時下衝約 3 cm,之後慢慢回升。
- 穩態誤差約 1 cm:每段結束時,水位 1.5 m 段停在 1.490,0.5 m 段在 0.488(仍在緩慢收斂)。閥開度分別穩定在 0.54 與 0.31,正是出水量 ÷ 0.5(解析值見 水槽液位控制)。
編註:控制器輸出的是閥的速度,閥開度是它的積分,迴路內含積分作用,照理穩態誤差應為 0。實際停在誤差 +1.0 cm,原因在輸出歸屬函數不對稱:慢關的中心在 −0.5,慢開卻在 +0.3。
- 水位剛好、變化率為 0 時,「上升」「下降」兩個高斯函數的尾巴仍各有 0.004 的歸屬度,規則 4、5 同時微弱觸發。
- 慢關離原點較遠,重心被拉向負值,輸出 −0.00076,閥會慢慢關。
- 水位因此略低於設定,等「過低 → 快開」的尾巴補回來才平衡。平衡點是誤差 +0.010 m,與設定值無關。
verify_fzex.py 核對)。互動模擬 Try It
可以改成手動設定值,觀察水位變化與五條規則的激發強度(畫面時間加速 6 倍):