範例:水槽液位控制
這是 Fuzzy Logic Toolbox 手冊的經典範例(原講義節錄英文說明,以下改寫為中文)。
想像一個水槽,一條管子進水、一條管子出水。進水管上有閥可以調整;出水量則由出水管的口徑(固定)和槽內壓力(隨水位變化)決定。要控制水位,控制器必須知道目前的水位,也必須能調整進水閥。
控制器的輸入是水位誤差(期望水位減實際水位),輸出是閥開啟或關閉的速度。注意輸出不是閥的開度本身,而是開度的變化率;開度是這個速度的積分。
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 2 節水槽液位控制),可以直接在瀏覽器執行、修改參數。⬇ 下載 Fuzzy_control.ipynb
出水量 Outflow
槽頂與出水口都通大氣(壓力 \(P_a\)),由白努利方程式,水位 H 處的水以速度 V 流出:

(以下依附檔 sltank.mdl 的參數整理,為補充)出水量 = 出水口面積 × V。設槽的底面積為 A、進水量為 \(q_{in}\),水位的變化為
$$A\,\frac{dh}{dt} = q_{in} - a\sqrt{2gh}$$模型中 A = 1 m²、出水口 a = 0.05 m²、槽高 2 m,進水量 = 0.5 × 閥開度(開度 0~1)。水位 1.5 m 時出水 0.271 m³/s,閥要開 54% 才能維持;水位 0.5 m 時出水 0.157 m³/s,閥開 31%。出水量隨 \(\sqrt h\) 變化,所以這是一個非線性系統。
除了誤差,tank.fis 還把水位的變化率當作第二個輸入,用來在水位接近目標時提早減速,作用像 PD 控制的微分項。規則與歸屬函數見 水槽液位控制的 FIS,Simulink 模型與模擬結果見 水槽液位的 Simulink 模型。