漫談Simulink: 隱式和顯式的Solver
在進行模擬,或者數值求解微分方程的時候,首先需要選擇的是採用什麼樣的Solver(求解器)。Solver可以分為兩大類: implicit (隱式)和explicit (顯式),例如MATLAB/Simulink中的ode45就是一個explicit solver, 而ode23s則是一個implicit solver。
從概念上來講,這兩類solver的差別在哪裡呢?
請看下面的例子
考慮這樣一個微分方程
... (1)
1)如果要對它進行模擬,我們需要對x的導數進行數值逼近。explicit的方法採用的是前向逼近, 例如
...... (2)
2)implicit的方法則使用後向逼近,例如
...... (3)
可以看到,這裡唯一的區別是f(x)中的x是上一步的x還是下一步的x.
這兩種處理方法會有什麼樣的優缺點呢?
1) 首先看Explicit方法,由(2) 可以得到
... (4)
通過這個式子我們可以方便的遞推出所有離散時間點的x的值。但是,假如(1)可以寫成如下的形式,那麼我們看看會發生什麼
... (5)
根據上面的推導,這個時候(4)變為
... (6)
注意到(5)本身是一個穩定的系統(因為特徵根-100<0),但是(6)則不一定穩定,因為特徵根取決於步長, 如果步長大於0.02,那麼(6)會變成一個不穩定的離散系統。這就是所謂的數值不穩定性。
因此,對於這種增益非常大的系統,用explicit solver的時候,往往會感覺模擬比較慢。這是因為步長必須足夠的小。
在Simulink中,用ode45模擬如下系統
從0-10s這個區間內,產生的時間點大於300個。2) 我們再看看implicit的解法,由(3)可以得到
...... (7)
注意到式(7)中如果不用泰勒展開的話,是沒有辦法把顯式的表達出來的,因此這種方法被稱為implicit.
由此,(7) 可以繼續推導出
... (8)
觀察一下(8)我們可以看到,求解的過程中需要知道, 這是被模擬系統的梯度,也可以稱為Jacobian (雅克比矩陣). 這個矩陣在數值求解過程中可以通過解析表達式進行計算,或者通過數值方法擾動來近似。這也是為什麼在Simulink中,如果選擇了implicit solver,會出現一些關於Jacobian的選項, 如下圖。具體每個選項的含義這裡不展開講了。
另外,如果把(5)代入(8), 會得到
由此可看出,不管步長取多大,都不會有數值不穩定。
為驗證這一點,可以用ode23s來模擬同一個系統
由此,我們可以總結一下兩種solver的特點:
1. Explicit Solver 不需要計算系統的Jacobian, 但是可能會需要很小的步長來保持數值穩定性。這有可能會影響模擬的速度。
2. Implicit Solver 需要計算系統的Jacobian, 這個步驟本身會消耗一定的時間,但是由於步長相對可以取的比較大,在某些情況下有可能比Explicit Solver速度更快。
當然了,最終具體用哪種Solver來模擬, 還要根據模型自身的特性來決定。而這不是一個簡單的事情。
在MATLAB R2015b中, Simulink增加了Auto solver這個選項,可以幫助用戶選擇最合適的Solver, 詳見: Use Auto Solver to Select a Solver
推薦閱讀:
※MATLAB神經網路(六):GRNN
※對函數的輸入進行檢查和解析
TAG:MATLAB |