淺談線性化
1 為什麼要探討線性化?
很多人看到這個題目,或許第一感覺會是:「為什麼要研究線性化?線性化不就是一階泰勒展開嗎?這再簡單不過了,用小學數學就好啦!」
在理論上,這一點也沒錯。比如我們要在原點線性化如下的非線性模型,相信大多數人不假思索的就能告訴我:線性化的結果是 y = u
既然如此,我們為什麼還要探討線性化呢? 答案很簡單,上面一個例子是理論上的,也就是經過很大程度上簡化了的,幾乎完美的。那麼實際上,工程中需要線性化的問題是什麼樣的呢?看看下面的例子,假如有這樣一個遙控飛機的模型。工程師現在想把控制器參數優化一下。為此,他需要線性化從飛機控制器的輸入到導航控制器的輸入之間這個可能含有幾千個模塊,幾萬個信號的子系統。很顯然,想要解析的泰勒展開這樣一個模型,在實際中是相當費時費力的。
那麼,我們來看看難點都在哪吧:1) 沒有非線性方程:
理論上,動態系統總是可以用光滑的ODE來建模。而實際上,在工程應用中,系統往往是用框圖來搭建的,比如用Simulink等軟體。 用框圖來建模有非常多的好處,比如可以方便的模塊化,通過觀察某個具體的信號值來debug, 還有其他的好處就不一一列舉了。但是像這樣複雜的框圖模型是很難等價的轉化成一組非線性方程組的。甚至有些模塊,根本就不存在解析表達式。所以,很難對一個非線性方程去求偏導數來獲得泰勒一階展開項。
2) 不光滑:
有些模塊或許存在解析數學表達式,但是根本不可導;有些可能存在大量的奇異點;有些甚至導數無從定義,比如enabled subsystem, triggered subsystem等。
3)多重採樣時間:
在很多實際模型裡面,有些模塊是連續的,例如積分器。有些模塊是離散的,採樣時間可以是0.1秒,可以是10秒,甚至可以是無窮大,比如constant block。那麼,最後線性化出來的系統到底應該是連續的,還是離散的?
4) 牽一髮而動全局:
假設,在最理想的情況下:我們真的把這個模型對應的非線性方程組表示出來了, 並且最終驗證了模型的準確性,然後成功的進行了線性化。可是,第二天模型的作者表示:」我把某幾個子系統里的幾條信號刪掉了,然後把其它幾條信號的連接方式重新設計了一下,你再幫我泰勒展開一下吧「。很不幸,這很大程度上意味著我們之前的解析方程組被徹底改變了,所有的工作需要重頭在來過。這樣的分析方式在實際的工程開發中是很不現實的,因為時間成本太高。
2 數值擾動
既然解析方法不行,那麼應該怎麼做呢?一個比較傳統而且有效的方法是數值擾動。我們還是來看看第一個例子。
用數值擾動的方法,我們可以在輸入端輸入一個常數,比如說du = 0.1。 然後, 我們測量輸出信號,發現 dy = 0.0998, 兩者相除,我們得到了一個基於數值線性化的結果
y = 0.998*u
如果用更小的du,事實上我們可以得到更精確的結果。
現在這個方法看起來比解析方法好用了很多。在某種程度上,它的思想其實就是把整個系統當成是一個黑箱,通過輸入輸出來進行辨識。事實上,對於比較小和比較簡單的模型,數值擾動的效果都還是不錯的。
那麼,它有什麼問題呢?看幾個例子就能明白了。
2. 1 延時的處理
我們來看看下面這個例子:
在「黑箱」中,有一個隱藏的很深的延時模塊。在這種情況下,我們給這個系統提供擾動輸入,然後去測量輸出的時候,會發現輸出信號過了很久都沒有發生變化。由此,我們很有可能會錯誤的把這個系統線性化成一個 0 增益! 當然了,如果事先能知道其中有一個這樣的Delay block,是可以採取一些措施來進行更好的辨識的。但即使如此,自動控制原理告訴我們,在頻域上逼近一個Delay Block的一個很好的方式是用Pade Approximation。 但是這種逼近用數值擾動是很難做到的,特別是對於複雜的,含有多個具有不同時間長度的延時環節的系統。
現在,你也許已經可以看出此處存在的一個矛盾: 數值擾動是把整個模型當成一個黑箱,不需要知道黑箱裡面的信息。但是我們實際上是知道這個黑箱里所有模塊的具體情況的。可是這些信息在數值擾動的過程中沒法有效的利用上。
2.2 一些特殊的模塊
再看看下面這個例子
那麼,哪個結果是對的呢?答案是:都對,也都不對。這取決於用戶的具體問題。如果用戶故意用這樣一組quantizer, 目的就是想分析在一個很小的範圍內此模型的動態。在此情況下那麼1)是所期望的。還有一種可能,就是用戶本身是不想用Quantizer的,但是在用數字電路實現某個部件的時候,不得已的讓一個本來應該是線性增益的關係變成了這樣的Quantization的結果。那麼在這種情況,2)是用戶所期望的。
對於這樣一個特殊的模塊,我們的確可以通過調整干擾信號的大小來得到不同的結果。但是假設有無數多個類似這樣的模塊存在於某個模型中,有些模塊是屬於情況1)的,有些是屬於情況2)的,那麼整個基於數值擾動的線性化結果就無法如用戶所期望的了。
Simulink Control Design工具箱和Block-by-Block方法
Simulink Control Design 工具箱的一大特點就是它提供了Block-by-Block的線性化方法。這個方法有時也叫Exact Linearization (不同於基於微分幾何的全局線性化)。簡單來講,在線性化的過程中,每個模塊會先被線性化,算出各自的Jacobian矩陣。然後由Simulink Control Design工具箱把這些信息有效的整合在一起(這是一個非常複雜的過程),從而計算出整個模型的線性化結果。
在這個例子中,
線性化通路上有3個模塊,他們的Jacobian分別是 cos(0) = 1, n階的pade approximation的狀態空間表達式,和1. 那麼對於這個簡單的系統而言,整個線性化的結果就是這三個線性系統的級聯。
在第二個例子中
用戶可以打開Quantizer的窗口,然後
把 Treat as gain when linearizing 的選項打上勾,這樣就會使得這個模塊被線性化成一個線性增益。Simulink Control Design工具箱還帶有各種高級的功能。例如,對於一些很難線性化的模塊,用戶可以自己配置此模塊的線性化結果,用於整個模型或者子系統的線性化。
更多的內容請參考Simulink Control Design的官方文檔:
Simulink Control Design Documentation
推薦閱讀:
※Matlab如何製作屬於自己的縮寫詞典
※機器學習筆記25 —— 編程作業8異常檢測演算法和推薦系統
※MATLAB數據可視化[2]:heatmap
※機器學習筆記14 —— BP演算法相關編程與編程作業4神經網路後向傳播演算法
※【線性代數】對矩陣做初等變換