本次教程基于 MATLAB R2020a
1 一般定義
過零檢測指的是在交流系統中,當波形從正半周向負半周轉換時,經過零位時,系統作出的檢測,可作開關電路或者頻率檢測,
2 MATLAB中的過零檢測
當SIMULINK仿真一個動態系統的時候,其在每一個時間步使用過零檢測技術來檢測系統狀態變數的間斷點,如果檢測到不連續的點(前后兩個采樣點的值變化大),則找到發生不連續的精確時間點,并且在該時間點前后增加附加的時間步(縮小采樣步長)
即:可變步長求解器可動態調整時間步大小,使其在某個變數緩慢變化時增加,在該變數迅速變化時減小,此行為使求解器在不連續點的附近執行許多小的時間步,因為該變數在此區域中迅速變化,這可以提高精確性,但可能會導致過多的仿真時間,
作用: Simulink使用過零檢測技術來精確定位不連續點,以免仿真時步長過小導致仿真時間太長,一般情況下能夠提高仿真速度,但有可能使得仿真到達規定時間長度之前就停止,當采用變步長解算方法仿真時,如果遇到步長自動變得很小導致仿真時間很長或基本沒有進度,可以考慮勾選開啟過零檢測功能,
一句話概括: Simulink? 使用一種稱為過零檢測的技術來準確定位不連續性,無需借助于過小的時間步,通常這種方法可以縮短仿真運行時間,但它可能會導致某些仿真在預期完成時間之前停止,
——Mathworks 中國
詳細可參考:https://ww2.mathworks.cn/help/simulink/ug/zero-crossing-detection.html
2.1 Simulink中過零檢測的作業原理
一個模塊能夠通過Simulink注冊一些列的過零變數,每一份變數就是一個狀態變數(含有不連續點)的函式,當相應的不連續發生之后,過零函式從正值或負值傳遞零值,每一個仿真步結束時,Simulink通過呼叫每一個注冊了過零變數的模塊來更新變數,然后Simulink檢測是否有變數的符號發生改變(相對于上一仿真時間點的結果),如果有改變就說明當前時間步有不連續發生,如果檢測到零點, Simulink 就會在每一個發生符號改變的變數的前一時刻值和當前值之間插入新值以評估過零點的個數,然后逐步增加內插點數目并使其值依次越過每一個過零點
2.2 代數環
詳細請參考:https://ww2.mathworks.cn/help/simulink/ug/algebraic-loops.html
在數字計算中,輸入信號決定輸出信號,同時輸出信號也決定輸入信號,由于數字計算的時序性,導致沒有輸出信號無法計算輸入信號,沒有輸入信號又反過來無法計算輸出信號,形成一個死鎖(deadlock)或死回圈,這就是代數環,
在 Simulink? 模型中,當存在信號環并且信號環中只存在直接饋通模塊時,將出現代數環,直接饋通表示 Simulink 需要模塊輸入信號的值來計算當前時間步的輸出,這種信號回圈會在同一時間步中產生模塊輸出和輸入的回圈依存關系,這會導致一個需要在每個時間步求解的代數方程,從而增加仿真的計算成本,
—— Mathworks 中國
簡單地說,代數環其實就是一個輸入信號包含輸出信號,同時輸出信號也包含輸入信號的特殊反饋回路,在Simulink 中,這是由于直通模塊(無延時的模塊)的原因造成的,Simulink 中大部分的模塊都是直通模塊,因此很容易形成代數環,在整個回路中,只包含直通模塊就會形成代數環,反饋回路有延時模塊就會消除代數環,
示例:

上圖是代數環的一個示例,Sum 模塊是一個代數變數 x a xa xa ,該變數必須等于第一個輸入 u u u 減去 x a xa xa(例如 x a = u – x a xa = u – xa xa=u–xa),
此簡單回圈的解為 x a = u / 2 xa = u/2 xa=u/2,
2.3 展示過零檢測實體1——雙積分器單彈球系統
在 MATLAB 命令列里輸入:
>> example_bounce_two_integrators
出現如下:

點擊下劃線上的內容,系統打開檔案如下,這是一個球在平面上彈跳的仿真:

我們可以看到:它使用兩個單個積分器來計算仿真程序中球的垂直速度和位置,
關于積分器:
我們雙擊積分器出現下圖
復位
在這里可以設定外部復位為none,rising,falling,either或者level,復位就是將積分器清零,選擇none,將永遠不對積分器清零,rising則表示在上升沿觸發時,清零積分器,
積分器初始值
積分器積分時都從一個初始值開始,可以選擇內部設定初始值(internal),也可以選擇外部設定,一般來說外部設定方式更為方便,
積分器限幅
在這里你可以設定你的積分器輸出的上下限,使得你的積分器輸出不會超過該值,
飽和狀態
這個埠用以提供輸出飽和資訊,0表示輸出沒有達到飽和值,1表示輸出已經達到飽和值,用該輸出口從0~1的跳變可作為積分器的復位信號.
使能過零檢測 (Enable zero-crossing detection)
狀態埠
state port的輸出與output port的輸出相同,但是在復位時,state port的輸出要比output port的輸出要早,因此當要采用積分器的輸出來進行復位時,就可以采用狀態口的輸出作為復位信號以避免代數環,
則我們回到原來那幅圖:

-
觀察系統模塊構建:
-
Velocity 積分模塊初始速度為15( x 0 x_0 x0? )
-
恢復系數(Coefficient of Restitution):
恢復系數(e)是碰撞前后兩物體沿接觸處法線方向上的分離速度與接近速度之比,只與碰撞物體的材料有關,彈性碰撞時e=1;完全非彈性碰撞時e=0,
-
關于 Initial value,詳情查看下面官方描述
https://ww2.mathworks.cn/help/simulink/slref/ic.html
-
則我們可以推出,第一個積分器初始值為15,表示小球以15m/s的速度上拋,后面落到地面每次當距離地面為0的時候以相反的速度方向,即-0.8的恢復系數向上彈起,初始位置為距離地面十米,重力加速度的值為9.81,方向向下
-
-
觀察仿真結果:
點擊仿真,我們看到如下圖表

仔細檢查仿真的最后一部分,您將看到速度略高于零,
將仿真 Stop time 更改為 25 秒,然后對模型進行仿真,由于 Compare To Zero 和 Position 模塊連續發生過多的過零事件,仿真將停止并顯示錯誤,

雖然可以通過調整 Model Configuration Parameters > Solver > Number of consecutive zero crossings 引數來增加此限制,但進行此更改后仍不能使仿真持續 25 秒,
將模型配置引數的 Solver 窗格中的 Solver details > Zero-crossing options > Algorithm 引數更改為
Adaptive,并再次仿真該模型 25 秒,

放大仿真的最后 5 秒,您可以看到結果更完整,更接近彈球動態的預期決議解,您看到的震顫量是系統狀態接近零時的效果,這在數值仿真的預期之內,

為何會出現上面錯誤?仿真器如何錯過過零事件?
小球與地面發生碰撞的時候,它的位置會發生急劇的變化,不連續常常會導致動態系統的顯著變化,因此對不連續點進行精確的仿真非常重要,否則會導致仿真得到錯誤的系統行為,
到了后面,小球會與地面發生震顫,如果不能合理選擇過零點時間,則會檢測不到零點導致仿真結果錯誤,
-
彈球的仿真顯示了有關不連續性的高頻率波動(震顫)可能會導致仿真過早停止,
-
如果求解器誤差容限太大,求解器還可能會完全錯過過零點,這可能是因為過零檢測方法會檢查信號值在主時間步之后是否發生變化,符號變化指示出現過零,然后過零演算法將搜索精確的過零時間,但是,如果某個時間步內發生過零,但該時間步開始和結尾的值沒有指示符號變化,則求解器將越過過零而不檢測它,
-
下圖顯示過零的信號,在第一個實體中,積分器越過該事件,因為符號在時間步之間沒有變化,在第二實體中,求解器檢測到符號變化,因此檢測過零事件,

如何避免過多過零錯誤?
-
增加允許的過零數量
增加 Configuration Parameters 對話框中 Solver 窗格上 Number of consecutive zero crossings 選項的值,這可能會給您的模型提供足夠多的時間來解決過零情況,
-
放寬 Signal threshold
在 Configuration Parameters 對話框的 Solver 窗格上,從 Algorithm 下拉串列中選擇 Adaptive,并增加 Signal threshold 選項的值,求解器需要較少的時間來準確定位過零點,這可以縮短仿真時間,并消除過多的連續過零錯誤數,不過,放寬 Signal threshold 可能會降低精度,
-
使用 Adaptive 演算法
在 Configuration Parameters 對話框的 Solver 窗格上,從 Algorithm 下拉串列中選擇 Adaptive,此演算法會動態調整過零閾值,這可提高準確性,并減少檢測到的連續過零點數,借助該演算法,您可以同時指定 Time tolerance 和 Signal threshold,
-
對特定模塊禁用過零檢測
清除模塊引數對話框上的 Enable zero-crossing detection 復選框,在 Configuration Parameters 對話框的 Solver 窗格上,從 Zero-crossing control 下拉串列中選擇
Use local settings,在本地禁用過零檢測可以防止特定模塊由于出現過多連續過零點而停止仿真,所有其他模塊將繼續受益于過零檢測所提供的更高準確性,
-
對整個模型禁用過零檢測
在 Configuration Parameters 對話框的 Solver 窗格上,從 Zero-crossing control 下拉串列中選擇
Disable all,這可防止在您模型中的任意位置檢測到過零點,結果是您的模型將無法再受益于過零檢測所提供的更高準確性, -
如果使用
ode15s求解器,請考慮調整數值微分公式的階次在 Configuration Parameters 對話框的 Solver 窗格上,從
Maximum order下拉串列中選擇一個值,有關詳細資訊,請參閱 Maximum order, -
減小最大步長大小
在 Configuration Parameters 對話框的 Solver 窗格上,為
Max step size選項輸入一個值,求解器可以采用足夠小的步長來解決過零情況,但是,減小步長大小可能會增加仿真時間,在使用自適應演算法時很少有必要這么做,
2.4 展示過零檢測實體2——雙彈球系統
同理,詳細可參考:https://ww2.mathworks.cn/help/simulink/slref/double-bouncing-ball-use-of-adaptive-zero-crossing-location.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229330.html
標籤:其他
上一篇:逆置字串陣列
下一篇:表格化資料挖掘





