技術(shù)干貨 | Modelica建模秘籍之狀態(tài)變量
在很多領(lǐng)域都有“系統(tǒng)”這個概念,它描述的往往是一些復(fù)雜關(guān)系的總和。假如我們將系統(tǒng)看做一個黑箱,那么,在系統(tǒng)的作用下,外界的輸入有時會產(chǎn)生令人意想不到的輸出,“蝴蝶效應(yīng)”就是其中的典型案例。

“蝴蝶效應(yīng)”的實質(zhì)是在一個確定性系統(tǒng)中,存在著看似隨機(jī)的不規(guī)則運動,其行為直觀表現(xiàn)為不確定性、不可重復(fù)、不可預(yù)測,即混沌系統(tǒng)。此時將混沌系統(tǒng)理解為黑盒系統(tǒng)是遠(yuǎn)遠(yuǎn)不夠的,我們需要通過系統(tǒng)的初始狀態(tài)求解系統(tǒng)未來時刻的狀態(tài)。
基于同樣的原理,我們在Modelica中進(jìn)行系統(tǒng)建模時,通過求解狀態(tài)變量確定系統(tǒng)狀態(tài),對系統(tǒng)進(jìn)行動態(tài)仿真。假如你還存在如下疑問:
1.?如何實現(xiàn)動態(tài)系統(tǒng)建模?
2.?如何規(guī)定狀態(tài)變量?
3.?為什么系統(tǒng)初值非常重要?
4.?怎樣建??梢蕴岣呦到y(tǒng)計算效率?
那么請你一定認(rèn)真讀完本篇技術(shù)干貨,小編帶你全面認(rèn)識Modelica建模中的狀態(tài)變量。
一、什么是動態(tài)系統(tǒng)?
首先,大家需要理解一點:系統(tǒng)可以分為動態(tài)系統(tǒng)和靜態(tài)系統(tǒng),狀態(tài)變量只有在動態(tài)系統(tǒng)中才有意義。我們可以舉一個簡單電路系統(tǒng)的例子,下圖分別為只含有電阻的電路與只含有電容的電路,其中u(t)為輸出電壓,i(t)為輸入電流,那么電路系統(tǒng)的方程可以寫為如下形式:

顯然,對于含容電路來說,系統(tǒng)的狀態(tài)受到過去影響隨時間變化,這樣的系統(tǒng)就被稱為動態(tài)系統(tǒng)。
二、?什么是狀態(tài)變量?
狀態(tài)變量首先由控制學(xué)科中引入,定義為動態(tài)系統(tǒng)的狀態(tài)變量為確定動態(tài)系統(tǒng)的最小一組變量。只要知道時刻這組變量以及
時的輸入,就可以完全確定系統(tǒng)的在任何
時刻的行為。
那么,由這些狀態(tài)變量組成的一個向量稱為狀態(tài)向量,而狀態(tài)向量存在的空間稱為狀態(tài)空間。動態(tài)系統(tǒng)的任何狀態(tài)都可以用狀態(tài)空間中的一個點來表示,動態(tài)系統(tǒng)的狀態(tài)變化可以描述為狀態(tài)矢量端點隨時間變化描繪出的路徑。
上述定義有些抽象復(fù)雜,下面舉一個簡單案例以幫助大家理解。將一封閉容腔中裝滿水并且對水進(jìn)行加熱,若已知水的壓力和溫度,我們就可以推斷出當(dāng)前水的狀態(tài)是液態(tài)還是氣態(tài),還可以計算出當(dāng)前水的密度、粘度等參數(shù)。此時,壓力與溫度就構(gòu)成了當(dāng)前封閉容腔系統(tǒng)的一組狀態(tài)變量。

那么,微分方程中狀態(tài)變量是如何表示的呢?
如果只考慮集中參數(shù)模型,不同領(lǐng)域工程物理系統(tǒng)的物理本構(gòu)通常由常微分方程(Ordinary Differentical Equations-ODE)描述,系統(tǒng)組件之間的約束一般用代數(shù)方程(Algebraic Equations)表示。
但是對于Modelica 語言,其面向?qū)ο蟮慕L攸c導(dǎo)致物理本構(gòu)體現(xiàn)在其組件的建模上,組件之間的約束以連接器的連接方式表現(xiàn)。此時,表達(dá)本構(gòu)模型的微分方程與連接轉(zhuǎn)化的代數(shù)方程之間耦合將形成一般形式的微分-代數(shù)方程 ( Differentical - AlgebraicEquations -DAE)。
一般來說,常微分方程組可以表示為以下形式:
由于因變量x的導(dǎo)數(shù)以獨立瞬態(tài)變量t和因變量x的形式顯式表示,此時將數(shù)組視為一組狀態(tài)變量,只要函數(shù)f具有足夠的連續(xù)性,總能找到初值問題的唯一解。
例如:
對于微分-代數(shù)方程組,導(dǎo)數(shù)一般沒有顯式表示,甚至一些因變量的導(dǎo)數(shù)可能不出現(xiàn)在這些方程中。而在表達(dá)式中不顯式包含變量y的任何導(dǎo)數(shù)的變量,這些變量稱為代數(shù)變量。
在微分-代數(shù)方程組中,我們同樣選取x為狀態(tài)變量,但是與常微分方程組不同的是,微分代數(shù)方程組內(nèi)數(shù)組
的各分量之間可能存在隱式的約束關(guān)系,需要通過選擇數(shù)組的部分分量作為系統(tǒng)的狀態(tài)變量。
總而言之,我們可以得出一條規(guī)律,狀態(tài)變量的一大特征是其對時間的導(dǎo)數(shù)已知。即:
而對于Modelica語言,其實質(zhì)是解決微分-代數(shù)方程問題,在求解前需要對微分-方程系統(tǒng)的狀態(tài)變量進(jìn)行選擇。
三、如何通過狀態(tài)變量描述系統(tǒng)?
引言中我們提到了將系統(tǒng)看做一個黑盒模型,輸入變量經(jīng)過與黑盒的交互產(chǎn)生輸出。通過上述的狀態(tài)空間方法,我們可以推導(dǎo)其輸入、輸出與狀態(tài)變量之間的表達(dá)式。
下面我們以一個稍微復(fù)雜的電路系統(tǒng)為例,解釋由狀態(tài)變量推導(dǎo)動態(tài)系統(tǒng)狀態(tài)空間方程。

上圖所示為一線性時不變電路,設(shè)輸入為,輸出為
,電阻為
,電容為
。
設(shè)兩端電壓為
,
兩端電壓為
,則:
(2.1a)
(2.1b)
選擇狀態(tài)變量,由式(2.1a)與式(2.1b)可得:
(2.2a)
(2.2b)
將上式轉(zhuǎn)化為矩陣形式:
(2.3a)
(2.3b)
由式(2.3a)、(2.3b)中我們可以看出,在系統(tǒng)狀態(tài)空間分析中涉及三種類型的變量,即輸入變量、狀態(tài)變量
與
、系統(tǒng)輸出量y。
對于更為一般的多輸入多輸出的系統(tǒng)狀態(tài)方程,有興趣的讀者可以參考《現(xiàn)代控制工程》,其狀態(tài)空間表達(dá)式為:
(2.4a)
(2.4b)
式中:為狀態(tài)矩陣,
為輸入矩陣,
輸出矩陣,
為直接傳輸矩陣。不難發(fā)現(xiàn),此時式(2.3a)、(2.3b)與式(2.4a)、(2.4b)具有相同的形式,即上述電路為線性定常系統(tǒng)單輸入、單輸出兩個狀態(tài)變量的狀態(tài)空間方程實例。
四、如何選擇合適的狀態(tài)變量?
對于一個實際系統(tǒng)來說,狀態(tài)變量的選取方式并不唯一。比如上文提到的燒水過程,我們可以選擇水的壓力、溫度作為一組狀態(tài)變量,也可以選擇水的壓力、密度作為一組狀態(tài)變量。在Modelica建模過程中,一方面系統(tǒng)會自動選擇狀態(tài)變量,另一方面我們可以手動干預(yù)狀態(tài)變量的選擇,合適的狀態(tài)變量選擇有利于系統(tǒng)的求解。
狀態(tài)變量設(shè)置代碼方法為stateSelect=StateSelect.xxx。stateSelect是實型變量的一個內(nèi)置屬性,用于控制狀態(tài)變量的選取,其值有如下5種形式:

從always到never,對應(yīng)變量被選作狀態(tài)變量的優(yōu)先級依次降低。即在指標(biāo)約簡之后模型的所有微分變量中,總是選取stateSelect屬性值為always的變量作為狀態(tài)變量,總是不選stateSelect屬性值為never的變量作為狀態(tài)變量,在prefer、default與avoid中,根據(jù)需要從prefer到avoid依次選取。下面我們以兩個案例說明狀態(tài)變量選取的方式:
案例1:
在以上示例中,變量y的stateSelect值為缺省值,即為StateSelect.default,而變量x的stateSelect值為StateSelect.prefer。x與y均作為微分變量出現(xiàn),且存在關(guān)于二者的代數(shù)方程x =y。方程x = y在指標(biāo)約簡過程中將求一次導(dǎo)數(shù),最終在x與y中只有一個變量作為狀態(tài)變量。由于x的stateSelect值的優(yōu)先級高于y,故最終x被選作狀態(tài)變量。
案例2:
為了讓x作為狀態(tài)變量,將對下列方程求導(dǎo),使得x的導(dǎo)數(shù)顯式出現(xiàn)
此時y因其導(dǎo)數(shù)不再出現(xiàn),而成為代數(shù)變量。
由此可見,將一個代數(shù)方程約束的兩個變量的stateSelect屬性值均設(shè)置為always是錯誤的。此外,default與avoid對代數(shù)變量而言等同于never,即使在編譯過程中可能引入其導(dǎo)數(shù),也不會將其選作狀態(tài)變量。
五、建模方法如何影響狀態(tài)變量?
前面我們已經(jīng)引入了狀態(tài)變量、狀態(tài)空間并且以線性時不變的電路系統(tǒng)為例導(dǎo)出了一般情況下狀態(tài)空間表達(dá)式。下面我們就以一個簡單的機(jī)械系統(tǒng)為例說明不同的建模方式是如何影響狀態(tài)變量的選取。

以一個單擺的笛卡爾坐標(biāo)運動方程為例,其運動學(xué)方程可以寫出如下形式:
(3.1a)
(3.1b)
(3.1c)
式中m為小球質(zhì)量,x為水平方向位移,y為豎直方向位移,L為繩長,g為重力加速度,為x的二階導(dǎo)數(shù),物理含義為小球在水平方向上的加速度,
與之同理。
上述式(3.1a)至式(3.1c)形成了一個典型的隱式微分代數(shù)方程系統(tǒng)(Implict-DAE),為了正確求解我們需要將上述方程轉(zhuǎn)化為顯式常微分方程(Explicit-ODE),步驟如下:
首先我們需要對式(3.1c)進(jìn)行兩次求導(dǎo),才能顯式地暴露變量與
的約束關(guān)系,但是與此同時又增加了
與
的約束方程:
(3.2a)
(3.2b)
此時為了避免模型求解時雅克比矩陣奇異,狀態(tài)變量在選擇時需要進(jìn)行動態(tài)切換,即當(dāng)x為0時,我們就必須選取y為狀態(tài)變量,如果y=0時,則必須選取x為狀態(tài)變量。
狀態(tài)變量的動態(tài)切換問題是一個組合問題,如果狀態(tài)變量的排列組合數(shù)目很大,從而使雅克比矩陣奇異檢測條件非常復(fù)雜,此時就會拖慢求解器的求解效率。
應(yīng)用MWORKS.Sysplorer,我們將上述物理模型利用Modelica語言表達(dá)形成如下代碼:
打開“仿真設(shè)置-調(diào)試-動態(tài)狀態(tài)變量”選擇并啟動仿真,我們可以在輸出欄中發(fā)現(xiàn)求解器一直在進(jìn)行狀態(tài)變量的切換,仿真10s的時間為0.02s。


假如我們將單擺運動的運動方程做一些改變,引入轉(zhuǎn)角變量 ,重新建立單擺運動方程:
(3.3a)
(3.3b)
(3.3c)
(3.3d)
與上述方程同理,對式(3.3c)、式(3.3d)進(jìn)行求導(dǎo):
通過引入轉(zhuǎn)角變量,其自動被選為狀態(tài)變量,原來的x和y不再被選為狀態(tài)變量,使得系統(tǒng)動態(tài)自由度為零,避免由于動態(tài)狀態(tài)變量選擇導(dǎo)致的計算效率下降。
應(yīng)用MWORKS.Sysplorer,我們將上述物理模型利用Modelica語言表達(dá)形成如下代碼:
輸出窗口中,動態(tài)狀態(tài)變量切換已經(jīng)消失,仿真時間也由0.02s縮短至0.004s,仿真效率提高了5倍!

六、?狀態(tài)變量初始化
在狀態(tài)空間表達(dá)式中,我們已知了狀態(tài)變量的導(dǎo)數(shù),為了避免差分法對于小時間步長的局限性,因此利用積分方法對于狀態(tài)變量進(jìn)行求解。為了簡單的說明求解原理,本文只以顯式歐拉法表示,即:
式中:為第n步計算所得狀態(tài)變量,
依賴于時間步長和特定積分方法使用的常數(shù)。因此狀態(tài)變量的求解依賴于求解器內(nèi)置的積分器。
狀態(tài)變量在積分求解時,一方面依賴于其導(dǎo)數(shù)值,另一方面狀態(tài)變量初始值也同樣重要,初始值不同會導(dǎo)致同一Modelica模型的計算結(jié)果不同,甚至導(dǎo)致其求解失敗。
Modelica語言中初始化方式有兩種,分別為初始值初始化與穩(wěn)態(tài)初始化:
a) 初始值初始化:直接為狀態(tài)變量設(shè)定初始值。
上式狀態(tài)變量x的初始值就即為1。如果用戶沒有為某個變量設(shè)定初始值屬性,那么該變量的初始值被缺省地設(shè)置為0。
b) 穩(wěn)態(tài)初始化:為變量的導(dǎo)數(shù)設(shè)定初始值,例如:
根據(jù)上述初始條件可以求得x的初始值為:
在大型Modelica模型系統(tǒng)狀態(tài)變量初始化時,使用不同的初始化方式會對計算結(jié)果產(chǎn)生不同影響。
對于初始化過程計算速度而言,穩(wěn)態(tài)初始化的計算速度要遠(yuǎn)遠(yuǎn)慢于初始值初始化的計算速度。這是因為初始值初始化直接為變量賦值,而穩(wěn)態(tài)初始化過程還需要通過變量的導(dǎo)數(shù)以及非線性方程組求解變量的值。
對于初始化后計算結(jié)果的穩(wěn)定性而言,穩(wěn)態(tài)初始化的效果要遠(yuǎn)好于初始值初始化。這是由于穩(wěn)態(tài)初始化時,狀態(tài)變量的值根據(jù)其導(dǎo)數(shù)為零時求得。此時系統(tǒng)中的狀態(tài)變量更加接近于系統(tǒng)穩(wěn)定時狀態(tài)變量的值。
七、總結(jié)
本文是一篇Modelica建模秘籍,在最后小編給大家總結(jié)了此篇秘籍的口訣心法,請記牢:
1.設(shè)置狀態(tài)變量選取,盡量選擇數(shù)量級較大且接近同時變化較小的參數(shù)。熱流系統(tǒng)中,一般情況下我們選擇壓力、比焓的組合會好于選擇溫度、密度的狀態(tài)變量組合;而在機(jī)械系統(tǒng)中我們通常選擇相對位移(運動副)作為狀態(tài)變量。
2.減少系統(tǒng)狀態(tài)變量自由度,避免狀態(tài)變量的切換。
3.明確狀態(tài)變量初始值。
4.將非線性量選作狀態(tài)變量可以有效降低模型系統(tǒng)代數(shù)環(huán)大小。
狀態(tài)變量是動態(tài)系統(tǒng)建模的重中之重,關(guān)系著系統(tǒng)能否正常求解以及求解的效率,小編希望大家看完這篇秘籍,可以成為Modelica建模的高手高高手!
參考材料
1.KatsuhikoOgata,尾形克彥,盧伯英,等.現(xiàn)代控制工程:第四版[M].電子工業(yè)出版社,2007.
2.周凡利.工程系統(tǒng)多領(lǐng)域統(tǒng)一模型編譯映射與仿真求解研究[D].華中科技大學(xué),2011.
3.丁建完.陳述式仿真模型相容性分析與約簡方法研究[D].華中科技大學(xué),2006.
原文鏈接:https://mp.weixin.qq.com/s/zUk_iAz9kP2bP8JAZaA6eA