5.1 模型的配置仿真
由各種模塊所構建的可視化邏輯連接,只是模型的外在表現,模型仿真的核心驅動器是被稱作解算器(Solver)的組件,相當於Simulink仿真過程的心臟,驅動着模型仿真,它在每一個采樣時間點更新模型中所有的狀態和信號變量,並計算下一步的步長。除此之外,模型還具有一個參數配置集合(Configuration Parameter Set),它提供了一系列的參數,用戶通過這些參數可以選擇模型的解算方法,配置硬件目標,優化配置,設置異常響應及診斷,以及配置代碼聲稱等。參數設置集合相當於Simulink軟件各個環節的開關控制器,在細節處影響着模型的行為和表現方式。模型的可視化建模方法,解算器及參數配置結合共同構成一個“有血有肉”的Simulink模型。
5.1.1 解算器
分類 | 步長可變否 | 離散連續性 | 顯式隱式 | 解算步長 | 階數 |
1 | 固定步長 | 離散 | 顯式 | 單步 | 單階 |
2 | 可變步長 | 連續 | 隱式 | 多步 | 多階 |
步長可變否
步長是前后兩個相鄰采樣點之間的時間間隔。
變步長:當模塊狀態值變化很快是減小步長,反之增大步長,可以根據誤差容限調整步長大小,使整個仿真過程中需要計算的采樣點數減少,從而使得仿真在較短時間內結束。
二者沒有絕對的優劣,在不同的應用場合酌情采用,但在生成嵌入式代碼並下載到硬件中去執行時,解算器必須采用固定步長,因為實時硬件的時鍾源都是提供穩定頻率的時鍾源,無法提供變步長解算器的采樣時刻計算方式。
離散連續性
這兩種解算器都依賴於模型中的具有連續/離散狀態變量的模塊來工作。具有離散狀態變量的模塊負責在離散解算器作用下的每個采樣時間點計算離散狀態變量的值,具有連續狀態變量的模塊在連續解算器作用下使用連續數值積分方法求解連續狀態變量的值。
不具有連續狀態模塊的模型如果使用連續解算器仿真時,Simulink自動切換到離散解算器進行計算;具有連續狀態模塊的模型,如果選擇離散解算器進行仿真,會發生錯誤。
顯式隱式
這里所說的顯式和隱式是指求解方程式是顯式或隱式的。
通常,隱式解算器用於求解剛性系統,顯式解算器用於求解非剛性系統。
所謂剛性系統,是指在時間間隔很小的情況下才會穩定,時間間隔稍大一點就不再穩定的系統。
相對於顯式解算器,隱式解算器對於震盪行為的求解具有更高的穩定性;但是,由於解算過程中產生Jacobian矩陣,使用牛頓法在每一個采樣時刻計算代數方程,所以很費時間。
解算步長
單步解算器在計算y(t)時只需要使用y(t-1),連續系統使用y(t-1),y(t-2),…,y(t-m)等多值來計算當前輸出y(t)。
階數
隱式變步長解算器ode15s可以使用1階到5階方程,顯式變步長解算器oed113可以使用1階到13階方程。
總結
變步長
固定步長
方法特點
解算器 | 應用場合 |
ode45(顯式) | 推薦用於模型的首次仿真,具有最好的普適性以及不錯的精度。 如果發現仿真速度極慢,可改為ode15s。 |
ode23(顯式) | 在誤差要求不是特別嚴格或模型中存在輕微剛性時比ode45具有更高的效率。 |
ode113(顯式) | 對於具有嚴格誤差容限和計算密集型的問題,此方法比oed45更合適更高效。 |
ode15s(隱式) | 基於數值差分方程(NDFs)求解,產生雅可比矩陣,通常從階數為2開始嘗試。 |
ode23s(隱式) | 一步解算器,在粗差問題上比ode15s更高效。 |
ode23t(隱式) | 適應於無數值阻尼的中性剛度模型求解。 |
ode23tb(隱式) | 跟ode23s類似,在粗差剛性模型中更高效。 |
5.1.2 參數的配置
解算器的參數設置
變步長解算器參數
參數名 | 作用說明 |
Max step size | 解算器可以采用的最大步長 |
Min step size | 解算器可以采用的最小步長 |
Initial step size | 解算器第一步采用的步長 |
Relative tolerance | 可接受的最大相對誤差容限 |
Absolute tolerance | 可接受的最大絕對誤差容限 |
Shape preservation | 開啟時可使用微分信息提升積分的精確度 |
Number of consecutive min step | 當步長超出了最大步長或者小於最小步長時稱為步長違例。此選項用於設置連續出現步長違例的步數,一旦超過這個步數就報警或報錯。默認為1。 |
參數名 | 作用說明 |
zero-crossing control | 使能過零檢測功能,對大部分模型而言,可以提升仿真速度,因為精確定位過零點,便可以增大變步長解算器的步長。 UseLocalSettings表示根據模塊中是否設置開啟過零檢測功能來決定,EnableAll和DisableAll則表示全體開啟或全體關閉 |
Time telerance | 時間容限,規定過零檢測要在容限相關的時間范圍內檢測連續性,用於控制過零檢測發生頻度 |
Algorithm | 指定一種過零檢測的算法,分為自適應算法和非自適應算法 |
固定步長解算器參數
參數名 | 作用說明 |
Fixed-step size | 固定步長 |
參數名(僅ode14x使用) | 作用說明 |
Solver Jacobian method | 提供雅可比算法的4個選項 |
Extrapolation order | 設置外插階數,可設置1~4 |
Number of Newton's iterations | 設置牛頓迭代算法的迭代次數 |
方法:用於判斷所選的變步長解算器的仿真結果是否可以接受
將Relative tolerance由1e-3改為1e-4再次仿真,如果和之前的結果沒有明顯差異,應當對當前的解算方法和仿真結果抱有信心。
數據導入/導出的設置
導入:結合In模塊進行
導出:
標簽名 | 作用說明 |
Time | 保存模型的仿真時間采樣 |
States | 保存模型的狀態量 |
Output | 保存模型的輸出量 |
Final states | 保存模型仿真最后一個采樣時刻的狀態量 |
Format | 保存的時間、狀態和輸出量存儲到工作空間時的數據格式選擇 |
Limit data points to last | 勾選后只保存最新N個采樣點的數據 |
Decimation | 每間隔多少個采樣點保存一組數據 |
模型某次仿真后保存的Final states參數,可以作為下一次仿真的Initial states參數來使用,從而將兩次分開的仿真首尾相接。
示例:
5.2 模型仿真數據記錄
5.2.1 信號日志
右擊模型中希望記錄過程的信號線,打開屬性對話框,勾選Log signal data。設置之后的信號上出現了一個淺藍色探針符號,表示此信號的數據記錄功能已開。
仿真后會在工作空間中得到名為logsout的變量。
>> logsout logsout = Simulink.SimulationData.Dataset 'logsout' with 1 element Name BlockPath ____ _____________ 1 [1x1 Signal] '' mymodel/Clock - Use braces { } to access, modify, or add elements using index.
5.2.2 Simulinnk Data Inspector
Inspector需要與信號日志功能聯合使用,不僅可以一次記錄多個信號數據,還可以記錄多次仿真的數據過程。
選中信號線,單擊Log/Unlog Selected Signals也可以增設/刪除信號日志功能點。
Inspect用於記錄信號,Compare用於比較信號的差別。
勾選Overwrite可使仿真數據被覆蓋。
5.3 仿真過程的調試
5.3.1 Debugger的啟動
Simulink→Debug→Debug Model即可啟動。
Debug模式將仿真過程變得可控,單步或多步執行,或者全速執行到斷點停下來。過程中每個采樣時刻所執行的模塊及方法名都可以觀察到。
在Sorted List界面可以觀察到模塊的執行順序。
5.3.2 Debugger的單步方法
- step into the current method:單步進入當前方法的子方法。
- step over the current method:單步跨過當前方法。
- step out of the current method:單步跳出當前子方法。
- go to first method at start of next time step:運行至下一個采樣時間的首個方法。
- go to the next block method:運行至下一個模塊的方法。
- start/continue the debug:開始/繼續調試。
- pause the debug:暫停調試。
- stop the debug:停止調試。
當單步執行某個模塊的某個方法涉及數據的輸入輸出或狀態量的更新計算時,可以將其顯示出來。
%----------------------------------------------------------------% [TM = 5.5 ] chap05_01_15.Outputs.Major (sldebug @18): probe: Data of 0:3 Scope block 'chap05_01_15/Scope': U1 = [5.08980000000000032] (sldebug @18):
5.3.3 Debugger的斷點設置方法
無條件斷點
模型在調試模式下運行后,所執行的各種子方法通過標簽也羅列出來。模型名后有一列復選框控件,用來設置無條件斷點。
直接勾選對應方法就設定了斷點,每次運行到這個方法都會停止。
initialzationPhase和terminationPhase分別在模型初始化和結束階段執行一次,simulationPhase及內部的各個子方法在每個采樣時間都會執行一次。
條件斷點
使用BreakPoints控件來除法條件斷點。
- zero crossings:仿真過程中遇到非采樣過零檢測時會停止。
- Step size limited by state:仿真過程中如果采用變步長解算器並且遇到一個狀態會限制步長大小時會停止。
- Solver Error:當解算器遇到可以恢復的錯誤時會停止。
- NaN values:仿真過程中出現無窮大數或者溢出時會停止。
- Break at time:在仿真達到設定時間時會停止。
通過Simulink Debugger,可以更細致地掌握模型運行的每一個步驟,從而精確找到問題發生的位置、時間以及問題出現之前模型中信號與模塊輸入輸出的變化趨勢。
5.4 仿真的加速
仿真速度慢的可能原因:
- 模型中包含Interpreted MATLAB Function模塊,這個模塊在每一個步長內都會調用MATLAB解釋器,可更換為Simulink內建模塊。
- 模型中包含了M語言編寫的S函數模塊,可采用C mex S函數或者由基本模塊搭建的子系統來代替。
- 最大步長或誤差容限太小。
- 模型中存在Memory模塊。
- 模型中使用Random Number block作為Integrator的輸入,可使用Band-Limited White Noise代替。
- 模型中包含可以解算的代數環,應解除代數環。
- 模型中存在不是其他任何一個采樣速率整數倍的采樣速率,應采用成倍數的采樣時間組合,可以降低采樣數,縮短計算時間。