模糊(Fuzzy)控制是用語言歸納操作人員的控制策略,運用語言變量和模糊集合理論形成控制算法的一種控制。模糊控制的最重要特征是不需要建立被控對象精確的數(shù)學(xué)模型,只要求把現(xiàn)場操作人員的經(jīng)驗和數(shù)據(jù)總結(jié)成較完善的語言控制規(guī)則,從而能夠?qū)哂胁淮_定性、不精確性、噪聲以及非線性、時變性、時滯等特征的控制對象進行控制。模糊控制系統(tǒng)的魯棒性強,尤其適用于非線性、時變、滯后系統(tǒng)的控制。模糊控制的基本結(jié)構(gòu)如圖所示。
1.模糊控制器的輸入變量與輸出變量
(1)模糊控制器的輸入、輸出變量
模糊控制器是模仿人的一種控制。在對被控對象進行控制的過程中,一般根據(jù)設(shè)定值與被控量的偏差、偏差變化EC和偏差變化的速率ER進行決策。人對偏差最敏感,其次是偏差的變化,再次是偏差變化的速率。因此,模糊控制器的輸入變量通常取、和EC或者, EC和ER,分別構(gòu)成所謂一維、二維和三維模糊控制器。一維模糊控制器的動態(tài)性能不佳,通常用于一階被控對象,二維模糊控制器的控制性能和控制復(fù)雜性都比較好,是目前廣泛采用的一種形式。并且,一般選擇增量算法作為模糊控制器的輸出變量。
(2)描述輸入、輸出變量的詞匯
在模糊控制中,輸入、輸出變量大小是以語言形式描述的,因此要選擇描述這些變量的詞匯。我們的日常語言中對各種事物和變量的描述,總是習(xí)慣于分為三個等級,例如,物體的大小分為大、中、小;運動的速度分為快、中、慢;年齡的大小分為老、中、青。實際應(yīng)用中一般都選用“大、中、小”三個詞匯來描述模糊控制器的輸入、輸出變量的狀態(tài),再加上正、負兩個方向和零狀態(tài),共有7個詞匯,即{負大,負中,負小,零,正小,正中,正大} 一般用這些詞的英文字頭縮寫,即{NB, NM, NS, O, PS, PM, PB}。一般情況下,選擇上述7個詞匯比較合適,但也可以多選或少選。選擇較多的詞匯,可以精確描述變量,提高控制精度,但會使控制規(guī)則變得復(fù)雜;選擇的詞匯過少,則對變量的描述過于粗糙,導(dǎo)致控制器的性能變差。
(3)變量的模糊量
某個變量變化的實際范圍稱為該變量的基本論域。記偏差的基本論域為[ ? X e , X e ] [-Xe,Xe][?Xe,Xe],偏差變化的基本論域為[ ? X c , X c ] [-Xc,Xc][?Xc,Xc],模糊控制器的輸出變量(系統(tǒng)的控制量)的基本論域為[ ? Y u , Y u ] [-Yu,Yu][?Yu,Yu]。顯然,基本論域內(nèi)的量是精確量,因而模糊控制器的輸入和輸出都是精確量,但是模糊控制算法需要模糊量。因此,輸入的精確量(數(shù)字量)需要轉(zhuǎn)換為模糊量,這個過程稱為“模糊化”(Fuzzification);另一方面,模糊算法所得到的模糊控制量需要轉(zhuǎn)換為精確的控制量,這個過程稱為“清晰化”或者“反模糊化”(Defuzzification)。
比較實用的模糊化方法是將基本論域分為n個檔次,即取變量的模糊子集論域為
從基本論域到模糊子集論域的轉(zhuǎn)換公式為
增加論域中的元素個數(shù)可以提高控制精度,但增大了計算量,而且模糊控制效果的改善并不明顯。一般選擇模糊論域中所含元素的個數(shù)為模糊語言詞集總數(shù)的兩倍以上,以確保各模糊集能較好地覆蓋論域,避免出現(xiàn)失控現(xiàn)象。例如在選擇上述7個詞匯的情況下,可選擇E和EC的論域均為
選擇模糊控制器的輸出變量即系統(tǒng)的控制量U的論域為(4)隸屬度
為了實現(xiàn)模糊化,要在上述離散化了的精確量與表示模糊語言的模糊量之間建立關(guān)系,即確定論域中的每個元素對各個模糊語言變量的隸屬度。
隸屬度是描述某個確定量隸屬于某個模糊語言變量的程度。例如,在上述和EC的論域中,+6隸屬于P B PBPB(正大),隸屬度為1.0;+5也隸屬于P B PBPB,但隸屬度要比+6差,可取為0.8;+4隸屬于的程度更小,隸屬度可取為0.4;顯然-6~0就不隸屬于了P B PBPB,所以隸屬度取為0。
確定隸屬度的值要根據(jù)實際問題的具體情況而定。實驗研究結(jié)果表明,人進行控制活動時的模糊概念一般可以用正態(tài)型模糊變量描述。下面給出常用的確定模糊變量隸屬度的賦值表,如表3.1、表3.2和表3.3所示。
2.建立模糊控制規(guī)則
模糊控制是語言控制,因此要用語言歸納專家的手動控制策略,從而建立模糊控制規(guī)則表。手動控制策略一般都可以用條件語句加以描述。條件語句的基本類型為
if A or B and C or D then U
下面介紹一種根據(jù)系統(tǒng)輸出的誤差及誤差的變化趨勢,消除誤差的模糊控制規(guī)則。該規(guī)則用下述21條模糊條件語句來描述。
[1]if E = NB or NM and EC = NB or NM then U = PB
[2]if E = NB or NM and EC = NS or O then U = PB
[3]if E = NB or NM and EC = PS then U = PM
[4]if E = NB or NM and EC = PM or PB then U = O
[5]if E = NS and EC = NB or NM then U = PM
[6]if E = NS and EC = NS or O then U = PM
[7]if E = NS and EC = PS then U = O
[8]if E = NS and EC = PM or PB then U = NS
[9]if E = NO or PO and EC = NB or NM then U = PM
[10]if E = NO or PO and EC = NS then U = PS
[11]if E = NO or PO and EC = O then U = O
[12]if E = NO or PO and EC = PS then U = NS
[13]if E = NO or PO and EC = PM or PB then U = NM
[14]if E = PS and EC = NB or NM then U = PS
[15]if E = PS and EC = NS then U = O
[16]if E = PS and EC = O or PS then U = NM
[17]if E = PS and EC = PM or PB then U = NM
[18]if E = PM or PB and EC = NB or NM then U = O
[19]if E = PM or PB and EC = NS then U = NM
[20]if E = PM or PB and EC = O or PS then U = NB
[21]if E = PM or PB and EC = PM or PB then U = NB
以上21條模糊條件語句可以歸納為模糊控制規(guī)則表3.4。
3.模糊關(guān)系與模糊推理
模糊控制規(guī)則實際上是一組多重條件語句,可以表示為從偏差論域到控制論域的模糊關(guān)系矩陣R RR,通過偏差的模糊向量E ′ E'E
′
和偏差變化的模糊向量 E C ′ EC'EC
′
,與模糊關(guān)系矩陣R RR的合成進行模糊推理,得到控制量的模糊向量,然后采用“反模糊化”方法將模糊控制向量轉(zhuǎn)換為精確量。
根據(jù)模糊集合和模糊關(guān)系理論,對于不同類型的模糊規(guī)則可用不同的模糊推理方法。下面僅介紹其中的對if A then B類型的模糊規(guī)則的推理。
若已知輸入為A AA,則輸出為B BB ;若現(xiàn)在已知輸入為A ′ A'A
′
,則輸出B ′ B'B
′
用合成規(guī)則求?。?
其中模糊關(guān)系R RR定義為B ′ = A ′ ? R B'=A'*RB
′
=A
′
?R
例如,已知當(dāng)輸入的模糊集合和輸出的模糊集合分別為
這里采用模糊集合的Zadeh表示法,其中 a i aiai, b i bibi 表示模糊集合所對應(yīng)的論域中的元素,而 u i uiui 表示相應(yīng)的隸屬度,“— ——”不表示分?jǐn)?shù)的意思。
在上述運算中,“∪”為取小運算,“∩”為取大運算。
由于系統(tǒng)的控制規(guī)則庫是由若干條規(guī)則組成的,因此對于每一條推理規(guī)則都可以得到一個相應(yīng)的模糊關(guān)系。n條規(guī)則就有n個模糊關(guān)系:R 1 , R 2... R n R1,R2...RnR1,R2...Rn ,對于整個系統(tǒng)的全部控制規(guī)則所對應(yīng)的模糊關(guān)系可對 n個模糊關(guān)系 (R i , i = 1 , 2 , 3... n Ri,i=1,2,3...nRi,i=1,2,3...n)取“并”操作得到,即
4.模糊控制向量的模糊判決
由上述得到的控制量是一個模糊集合,需要采用“反模糊化”方法將模糊控制項轉(zhuǎn)換為精確量。下面介紹兩種簡單實用的方法。
(1)最大隸屬度法
這種方法是在模糊控制向量中,取隸屬度最大的控制量作為模糊控制器的輸出。例如,當(dāng)?shù)玫侥:刂葡蛄繛?
由于控制量隸屬于等級5的隸屬度為最大,所以取控制量為
這種方法的優(yōu)點是簡單易行,缺點是完全排除了其他隸屬度較小的控制量的影響和作用,沒有充分利用取得的信息。
(2)加權(quán)平均判決法
為了克服最大隸屬度法的缺點,可以采用加權(quán)平均判決法,即
例如
則
5.模糊控制表
模糊關(guān)系、模糊推理以及模糊判決的運算可以離線進行,最后得到模糊控制器輸入量的量化等級 , EC與輸出量即系統(tǒng)控制量的量化等級之間 的確定關(guān)系,這種關(guān)系通常稱為“控制表”。對應(yīng)于前面介紹的21條控制規(guī)則的“控制表”如表3.5所列。
模糊控制表可以離線求出,作為文件存儲在計算機中,計算機實時控制時只要將A/D轉(zhuǎn)換得到的偏差和偏差變化 ec 進行量化,得到相應(yīng)的等級 E 和 EC ,然后從文件中直接查詢所需采取的控制策略。
6.確定實際的控制量
顯然,實際的控制量 應(yīng)為從控制表中查到的量化等級 乘以比例因子。設(shè)實際的控制量 的變化范圍為[ a , b ] [a, b][a,b],量化等級為? n , ? n + 1 , . . . , 0 , . . . , n ? 1 , n { -n,-n+1,...,0,...,n-1,n}?n,?n+1,...,0,...,n?1,n,則實際的控制量應(yīng)為
若
則
例如在上述二維模糊控制器中,當(dāng) E 和 EC 的量化等級分別為-3和+1時,由控制表查得 U = 3 U=3U=3,則模糊控制器輸出的實際控制量應(yīng)為
模糊控制器的設(shè)計步驟
選擇輸入和輸出模糊集
定義輸入輸出隸屬度函數(shù)
建立模糊控制表
建立模糊控制規(guī)則
模糊推理
反模糊化
模糊邏輯實現(xiàn)
以洗衣機洗衣粉投放量控制為例,令污漬stain和油漬oil為輸入變量,洗衣粉powder為輸出。假定輸入和輸出范圍均為1~10。步驟如下:
引用相關(guān)模塊并設(shè)置各個變量范圍
定義輸入輸出模糊集和其隸屬度函數(shù)(使用三角函數(shù)),同時定義輸出解模糊規(guī)則。
建立模糊控制規(guī)則
測試:系統(tǒng)建立完成后,通過輸入變量值來查看系統(tǒng)的輸出
令輸入污漬為5,油漬為6
完整代碼:
import numpy as np
import skfuzzy as fuzz
import skfuzzy.control as ctrl
x_stain_range=np.arange(1,11,1,np.float32)
x_oil_range=np.arange(1,11,1,np.float32)
y_powder_range=np.arange(1,11,1,np.float32)
# 創(chuàng)建模糊控制變量
x_stain=ctrl.Antecedent(x_stain_range, 'stain')
x_oil=ctrl.Antecedent(x_oil_range, 'oil')
y_powder=ctrl.Consequent(y_powder_range, 'powder')
# 定義模糊集和其隸屬度函數(shù)
x_stain['N']=fuzz.trimf(x_stain_range,[1,1,5])
x_stain['M']=fuzz.trimf(x_stain_range,[1,5,10])
x_stain['P']=fuzz.trimf(x_stain_range,[5,10,10])
x_oil['N']=fuzz.trimf(x_oil_range,[1,1,5])
x_oil['M']=fuzz.trimf(x_oil_range,[1,5,10])
x_oil['P']=fuzz.trimf(x_oil_range,[5,10,10])
y_powder['N']=fuzz.trimf(y_powder_range,[1,1,5])
y_powder['M']=fuzz.trimf(y_powder_range,[1,5,10])
y_powder['P']=fuzz.trimf(y_powder_range,[5,10,10])
# 設(shè)定輸出powder的解模糊方法——質(zhì)心解模糊方式
y_powder.defuzzify_method='centroid'
# 輸出為N的規(guī)則
rule0 = ctrl.Rule(antecedent=((x_stain['N'] & x_oil['N']) |
(x_stain['M'] & x_oil['N']) ),
consequent=y_powder['N'], label='rule N')
# 輸出為M的規(guī)則
rule1 = ctrl.Rule(antecedent=((x_stain['P'] & x_oil['N']) |
(x_stain['N'] & x_oil['M']) |
(x_stain['M'] & x_oil['M']) |
(x_stain['P'] & x_oil['M']) |
(x_stain['N'] & x_oil['P']) ),
consequent=y_powder['M'], label='rule M')
=# 輸出為P的規(guī)則
rule2 = ctrl.Rule(antecedent=((x_stain['M'] & x_oil['P']) |
(x_stain['P'] & x_oil['P']) ),
consequent=y_powder['P'], label='rule P')
# 環(huán)境初始化
system = ctrl.ControlSystem(rules=[rule0, rule1, rule2])
sim = ctrl.ControlSystemSimulation(system)
sim.input['stain'] = 5
sim.input['oil'] = 6
sim.compute() # 運行系統(tǒng)
output_powder = sim.output['powder']
# 打印輸出結(jié)果
print(output_powder)