標籤:

漫談Simulink:什麼是代數環?

All comments and opinions expressed on Zhihu are mine alone and do not necessarily reflect those of my employers, past or present.

本文內容所有內容僅代表本人觀點,和Mathworks無關

在使用Simulink模擬的過程中,往往會看到關於代數環的錯誤提示或者警告信息。例如

Block diagram xxx contains 1 algebraic loop(s). To see more details about the loops...

那麼到底什麼是代數環呢?

這篇文章目的就是來科普一下這個問題。為了介紹代數環,我們先來期待一下這個暑期即將上映的電影 《The Secrete Life of Pets》, 其中有一幕非常適合來解釋什麼是代數環。請看下圖:

圖中有四隻可愛的狗狗,他們首尾相連,形成一個環路。

現在,我們可以把每隻狗定義成為一個系統。這個系統有輸入(食物)和輸出(排泄物),很顯然每個系統的輸出會成為下一個系統的輸入。

進一步的,我們假設每個系統的輸入和輸出是沒有延時的。也就是說,在t時刻,每隻狗的輸入會立刻成為輸出。對於這樣的系統,我們稱其具有Direct Feedthrough。

在這樣的假設下,

第一隻狗t時刻的輸入 u1(t) ----> 第一隻狗t時刻的輸出 y1(t)

第一隻狗t時刻的輸出 y1(t)---> 第二隻狗t時刻的輸入u2(t)--> ... -> 第一隻狗t時刻的輸入u1(t)

現在問題來了,第一隻狗t時刻的輸入u1(t)到底應該是多少?這個數值不能隨便定義,因為他自己會決定自己。這樣的邏輯就構成了一個代數環。

這個代數環能不能解呢? 如果假設每隻狗的輸出都是輸入的一半,我們會得到這樣一個關係

u1(t) = 0.5*0.5*0.5*0.5*u1(t)

也就是說,只有u1(t) = 0解。

如果每隻狗的輸入都等於輸出,那麼這個u1(t) 可以取任何數。

如果每隻狗的輸入和輸出都是一個非常複雜的非線性函數,那麼我們就需要用數值方法來解這個非線性關係。

請注意,這只是在t時刻。一旦模型存在代數環,那麼在模擬的每個時間點,我們都要進行這樣複雜的代數運算, 這會大大的影響模擬的速度。另外,如果我們想把模型轉換成c/c++代碼用到硬體上的時候,是不允許出現有代數環的情況的。

所以,對於搭建好的模型,我們需要檢查一下有沒有代數環。

從MATLAB R2015b開始,有如下的功能可以方便的幫你找到系統中的代數環。

>> Simulink.BlockDiagram.getAlgebraicLoops(ModelName) n

現在問題又來了: 1. 找到代數環以後該怎麼處理呢?2. 圖中的實線和虛線的代數環有什麼區別呢?這些問題的答案請見下篇:真假代數環


推薦閱讀:

研究電力電子化電力系統穩定性的利器——阻抗法
MATLAB App Designer教程連載5: App Designer和MVC模式
MATLAB+seconds(1)
MATLAB 高級數據結構連載 3:金融時間序列Financial Time Series (Part C) 跟蹤股票賬戶權益的變動
The Trinity: MATLAB Mobile, MATLAB Online, and MATLAB Drive

TAG:MATLAB |