Using Simulink | ![]() ![]() |
ゼロクロッシングの検出
ダイナミックシステムのシミュレーション時に、Simulinkは、ゼロクロッシングの検出として知られる手法を使って、各時間ステップでシステムの状態変数の不連続性をチェックします。Simulinkがカレントの時間ステップ内で不連続性を検出した場合は、不連続性が生じる正確な時間を決定し、その前後に付加的な時間ステップをとります。この節では、ゼロクロッシングの検出がなぜ重要かを、またその機能について説明します。
状態変数の不連続性は、ダイナミックシステムの展開において意味のあるイベントと同時に起こることがあります。たとえば、ボールが床で跳ねるときにその位置で不連続性を伴います。不連続性は、ダイナミックシステムでの意味のある変化を表わすので、不連続点で正確にシミュレーションすることが重要です。そうでない場合は、シミュレーションは、調査中のシステムの挙動に関して間違った結論になることがあります。たとえば、跳ねるボールのシミュレーションを考えます。ボールが床と接触する点がシミュレーションステップ間である場合は、シミュレーションされたボールは空中の反対の位置に現れます。これは、跳ねるボールの物理現象に関して間違った結果を導きます。
このような結果のミスリードを防ぐために、シミュレーションステップが不連続点において生じることが重要です。シミュレーション時間の決定について純粋にソルバに依存するシミュレータは、この要求を十分に満足しません。たとえば、固定ステップソルバを考えます。固定ステップソルバは、固定ステップサイズの整数倍において状態変数の値を計算します。しかし、不連続点がステップサイズの整数倍であるという保証はありません。不連続点をヒットする可能性を増やすためにステップサイズを減らすことはできますが、これにより実行時間は大幅に増加します。
可変ステップソルバを利用すれば解が求まるように思えます。可変ステップソルバは、変数がゆっくり変化するときにはステップサイズを増加させ、急速に変化するときには減少させて、ステップサイズをダイナミックに調整します。不連続点付近で、変数は特に急速に変化します。そのため、理論では、可変ステップソルバは不連続点を正確にヒットできます。問題は、不連続点を正確に決定するためには、可変ステップソルバは小さいステップを多く取る必要があり、シミュレーションが遅くなることです。
ゼロクロッシング検出機能
Simulinkは、ゼロクロッシングの検出として知られる手法を使って、この問題に対処します。この手法を使うと、ブロックはSimulinkでゼロクロッシング変数を登録できます。それらは、不連続点をもつ状態変数の関数です。ゼロクロッシング関数は、対応する不連続が生じるとき正または負の値からゼロを渡します。シミュレーションステップの最後に、Simulinkは、ゼロクロッシング変数を登録したブロックに、変数をアップデートすることを確認します。その後、Simulinkは最終ステップ以降に変数の符号が変化したかどうかをチェックします。そのような変化は、不連続がカレントの時間ステップで生じたことを示します。
ゼロクロッシングが検出された場合、Simulinkは符号が変化した変数の前の値とカレント値の間で内挿を行い、ゼロクロッシングの時間(例、不連続点)を推定します。Simulinkは、各ゼロクロッシングを順番に進めます。この方法で、Simulinkは状態変数が未定義である不連続点でのシミュレーションを防ぎます。
ゼロクロッシングの検出を使って、Simulinkは過度に小さいステップサイズに並べ替えを行わずに正確に不連続点をシミュレートします。多くのSimulinkブロックは、ゼロクロッシング検出をサポートします。結果は、不連続をもつシステムを含むすべてのシステムのシミュレーションが高速で正確です。
実行の詳細
ゼロクロッシングを利用するSimulinkブロックの例は、Saturationブロックです。ゼロクロッシングは、Saturationブロックでつぎのような状態イベントを検出します。
それ自身の状態イベントを定義するSimulinkブロックは、厳密なゼロクロッシング をもっていると考えられます。ゼロクロッシングイベントを明示的に知らせる必要がある場合には、Hit Crossingブロックを使ってください、ゼロクロッシングを組み込んだブロックのリストについては、ゼロクロッシングをもつブロック を参照してください。
状態イベントの検出は、内部のゼロクロッシング信号の構成によって異なります。この信号をブロック線図から利用することはできません。Saturationブロックの場合、上限に対するゼロクロッシングを検出するために使われる信号は、zcSignal = UpperLimit - u
です、ここで、u
は入力信号です。
ゼロクロッシング信号は方向属性をもっており、つぎのような値をとります。
Saturationブロックの上限に対して、ゼロクロッシングの方向は、either です。これにより、同じゼロクロッシング信号を使って飽和イベントの切り替えを検出することができます。
誤差許容値が大きすぎる場合、Simulinkは、ゼロクロッシングを検出できない可能性があります。たとえば、ゼロクロッシングがある1つの時間ステップ内に生じ、ステップの開始時と終了時で値の符号変換を示すことがないような場合を想定してみましょう。このような場合、ソルバはゼロクロッシング部を検出できずに、その位置を横切ってしまいます。
つぎの図は、ゼロを横切る信号を示しています。最初の例では、積分はこのイベントを"飛び越えて"しまします。2番目の例では、ソルバはこのイベントを検出します。
最初の例のような状況が起きる可能性がある場合、ソルバが十分小さなステップをとるように、誤差許容値を小さくしてください。詳細は、誤差許容値を参照してください。
警告
不連続点に関して高周波変動(チャタリング)を示すモデルを作成することができます。たとえば質量のないバネのようなシステムは、一般に物理的には実現不可能です。チャタリングによってゼロクロッシングは繰り返し検出されるので、シミュレーションのステップサイズはきわめて小さくなり、実際上シミュレーションは停止します。
このような挙動がモデルに適用される恐れがある場合は、Simulation Parameters ダイアログボックスの Diagnostics ページ上の Disable zero crossing detection チェックボックスを選択することにより、ゼロクロッシングを無効にすることができます。ゼロクロッシング検出を無効にすることで、この問題の徴候を緩和することができますが、ゼロクロッシング検出が提供する精度向上の利点を利用することができなくなります。より良い解法は、モデルの根本的問題の原因を見つけることです。
ゼロクロッシングをもつブロック
![]() | ソルバ | 代数ループ | ![]() |