ゼロクロッシングの削減
ゼロクロッシングを削減する理由
リアルタイムでの展開では、固定ステップ ソルバーを使用する必要があります。通常、デスクトップ シミュレーションには可変ステップ ソルバーを使用します。可変ステップ ソルバーでは、ゼロクロッシング イベントが検出されると、ステップが小さくなります。ステップを小さくすると、ゼロクロッシングを引き起こすダイナミクスを正確にキャプチャするのに役立ちます。固定ステップ ソルバーでは、使用するステップのサイズは変化しません。モデルがゼロクロッシング検出に大きく依存していると、ダイナミクスを正確にキャプチャするために、非常に小さな固定ステップ サイズを指定しなければならない場合があります。小さいステップ サイズは、リアルタイム シミュレーション時のオーバーランの原因となる可能性があります。ゼロクロッシングの数を削減することで、可変ステップと固定ステップのどちらの展開でも、より大きいステップ サイズを使用するようにソルバーを構成することができると同時に、十分な精度を備えた結果を生成できます。
参照結果の取得とシミュレーション ステップ サイズのプロット
モデルをシミュレートして、次の作業に使用できるデータを生成します。
ゼロクロッシング イベントの数を削減するために変更するモデル要素の決定。
修正モデルの精度の評価。
このモデルを開くには、MATLAB® コマンド プロンプトで次を入力します。
model = 'ssc_pneumatic_rts_stiffness_redux'; open_system(model)
モデルをシミュレートします。
sim(model)
データをワークスペースに保存します。
simlogRef = simlog; timeRef = tout;
ステップ サイズを、シミュレーション時間に対してプロットします。
h1 = figure; semilogy(timeRef(1:end-1),diff(timeRef),'-x') title('Solver Step Size') xlabel('Time (s)') ylabel('Step Size (s)')
シミュレーションは、開始時点と t = 約 1、4、5、8、9 秒の時点で、繰り返し遅くなります。
ズームして、t = 0.8 ~ 1.03 秒の間のデータを調べます。
h1; xStart = 0; xEnd = 10; yStart = 0; yEnd = 10e0; xZoomStart1 = 0.8; xZoomEnd1 = 1.03; yZoomStart1 = 10e-20; yZoomEnd1 = 10e-1; axis([xZoomStart1 xZoomEnd1 yZoomStart1 yZoomEnd1])
Figure 内の青色の
x
のマーカーは、シミュレーションがステップの実行を完了したことを示しています。円で囲まれたマーカーは非常に小さいステップ サイズを示し、ゼロクロッシング イベントを表しています。ステップ サイズは、ゼロクロッシングを検出するたびに、約 10e-15 秒まで減少します。モーター回転数の参照結果を取得するには、Measurements サブシステムを開きます。Ideal Rotational Motion Sensor ブロック を選択します。ブロックを選択した状態で、関数
simscape.logging.findNode
を使用し、W
(モーターの角速度を表す信号) のデータが含まれるノードを検出して保存します。nRef = simscape.logging.findNode(simlogRef,gcbh)
nRef = Node with properties: id: 'Ideal_Rotational_Motion_Sensor' savable: 1 exportable: 0 phi: [1×1 simscape.logging.Node] C: [1×1 simscape.logging.Node] R: [1×1 simscape.logging.Node] A: [1×1 simscape.logging.Node] w: [1×1 simscape.logging.Node] t: [1×1 simscape.logging.Node] W: [1×1 simscape.logging.Node]
関数
simscape.logging.plot
を使用して、W
の参照結果をプロットします。.simscape.logging.plot(nRef.W);
ゼロクロッシングを引き起こす要素の特定と修正
シミュレーション データを解析して、ゼロクロッシングの原因となっている要素を特定します。モデルを修正して、これらの要素が引き起こすゼロクロッシングの数を削減します。
Simscape™ の関数
sscprintzcs
を使用して、ログに記録したシミュレーション データのゼロクロッシング情報を出力します。sscprintzcs(simlogRef)
この結果から、検出された 50 個のゼロクロッシングが、Directional 5-way valve ブロック (46 個のクロッシング) と Pneumatic Motor ブロック (4 個のクロッシング) で発生していることがわかります。ssc_pneumatic_rts_stiffness_redux (42 signals, 50 crossings) +-Directional_5_way_valve (38 signals, 46 crossings) | +-Variable_Area_Orifice_1 (9 signals, 13 crossings) | +-Variable_Area_Orifice_2 (9 signals, 10 crossings) | +-Variable_Area_Orifice_3 (9 signals, 14 crossings) | +-Variable_Area_Orifice_4 (11 signals, 9 crossings) +-Pipe_1 (2 signals, 0 crossings) | +-Constant_Chamber (2 signals, 0 crossings) +-Pneumatic_Motor (2 signals, 4 crossings)
関数
sscexplore
を使用して Simscape 結果エクスプローラーを開き、ログに記録されたシミュレーション データに対話的にアクセスします。sscexplore(simlogRef)
結果ツリーで、[Pneumatic Motor] をクリックして、モーターの結果を確認します。
ほとんどのゼロクロッシングは、t = 0 秒から t =1 秒の間で、ブロックの他の信号がゼロに近いときに発生しています。残りの少数のゼロクロッシングは、およそ t = 5 秒で発生しています。
いくつかのゼロクロッシングを引き起こしているソース コードを特定するために、[Directional 5-way valve] 、 [Variable Area Orifice 2] 、 [SimulationStatistics (ZeroCrossings)] 、 [zc_1 - 8 crossings] を選択します。ウィンドウの左下隅に表示される [Pneumatic.Elements.VariableOrifice] リンクをクリックします。
Pneumatic Motor ブロックのソース コードが開き、カーソルが次のコードの上に表示されます。
% Area - limit to be greater than Area0 AreaL = if Area<Area0, Area0 else Area end;
ゼロクロッシングの原因となっている条件ステートメントは、オリフィスの面積に関連するものです。
Directional 5-way valve のオリフィスの最大面積を減らすことによって、ゼロクロッシングの数を削減します。Directional 5-way valve ブロックのプロパティ インスペクターを開き、[Maximum orifice area (mm^2)] パラメーターに
995
を指定します。
修正モデルの結果の解析
結果を参照結果と比較し、修正モデルの精度を確保します。修正モデルのゼロクロッシングの数が減ったことを確認します。
モデルをシミュレートして、ゼロクロッシングのデータを出力します。
sim(model) sscprintzcs(simlog)
ssc_pneumatic_rts_stiffness_redux (42 signals, 30 crossings) +-Directional_5_way_valve (38 signals, 26 crossings) | +-Variable_Area_Orifice_1 (9 signals, 7 crossings) | +-Variable_Area_Orifice_2 (9 signals, 6 crossings) | +-Variable_Area_Orifice_3 (9 signals, 8 crossings) | +-Variable_Area_Orifice_4 (11 signals, 5 crossings) +-Pipe_1 (2 signals, 0 crossings) | +-Constant_Chamber (2 signals, 0 crossings) +-Pneumatic_Motor (2 signals, 4 crossings)
ゼロクロッシングの総数は 50 から 30 まで減少しています。
関数
simscape.logging.plot
を使用して結果を比較し、参照結果と修正モデルの結果を単一のプロットに描画します。simscape.logging.plot... ({simlogRef.Measurements.Ideal_Rotational_Motion_Sensor.W... simlog.Measurements.Ideal_Rotational_Motion_Sensor.W}, ... 'names', {'Reference','Modified'})
結果は同じように見えます。
ズーム コントロールを使用して、t = 約 5 秒の時点での変曲点を詳しく調べます。
xStart = 0; xEnd = 10; yStart = -400; yEnd = 400; xZoomStart1 = 4.75; xZoomEnd1 = 5.15; yZoomStart1 = -20; yZoomEnd1 = 30; axis([xZoomStart1 xZoomEnd1 yZoomStart1 yZoomEnd1])
このズーム レベルでは、修正モデルの結果にわずかな違いがみられます。しかしながら、シミュレーション結果は、実測データと理論データに基づく予測と一致するのに十分な精度を備えています。
このモデルでリアルタイム シミュレーション ワークフローを実行する前にシミュレーション速度をさらに改善するには、次を試します。
この例で説明されている手法を繰り返して、小さいステップの原因となるゼロクロッシングを引き起こしている他の要素を特定して調整する
ステップが小さくなる原因となっている数値的剛性を軽減する
参考
simscape.logging.plotxy
| simscape.logging.findNode
| sscexplore
| sscprintzcs
| Simscape 結果エクスプローラー