ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ゼロクロッシング検出

可変ステップ ソルバーは、変数がゆっくり変化するときにはタイム ステップ サイズを増加させ、急速に変化するときには減少させて、タイム ステップ サイズを動的に調整します。この動作によってソルバーが不連続点付近で小さいステップを取りますが、これは変数の変化が急であるためです。このため精度は向上しますが、シミュレーション時間が余分にかかることがあります。

Simulink® ソフトウェアはゼロクロッシング検出という手法を使用して、過度に小さいタイム ステップを取ることなく正確に不連続点を特定します。この技法を使うとシミュレーション実行時間は短縮されますが、意図した完了時間前に一部のシミュレーションが停止することがあります。

Simulink ソフトウェアでは、非適応アルゴリズムと適応アルゴリズムの 2 つのアルゴリズムが提供されています。これらの技法の詳細は、ゼロクロッシング アルゴリズムを参照してください。

過度のゼロクロッシング検出の影響を示すデモ

Simulink ソフトウェアには、ゼロクロッシングの動作を紹介する 3 つのモデル、sldemo_bounce_two_integratorssldemo_doublebouncesldemo_bounce が付いています。

  • sldemo_bounce_two_integrators モデルでは、適応アルゴリズムを使用しないと、過度のゼロクロッシングによって意図した完了時間前にシミュレーションが停止する場合を見ることができます。

  • sldemo_bounce モデルでは、sldemo_bounce_two_integrators より優れたモデル設計を使用しています。

  • sldemo_doublebounce モデルでは、適応アルゴリズムが 2 つの異なるゼロクロッシング要件を使用して複雑なシステムを正しく解く様子を見ることができます。

2 つの Integrator ブロックを使用する跳ね返りモデル

  1. MATLAB® コマンド プロンプトで、「sldemo_bounce_two_integrators」と入力して例を読み込みます。

  2. ブロック線図が表示されたら、[モデル コンフィギュレーション パラメーター][ソルバー][アルゴリズム] パラメーターを [非適応] に設定します。

  3. また、[ソルバー] ペインの [終了時間] パラメーターを 20 秒に設定します。

  4. モデルを実行します。Simulink エディターで、[シミュレーション][実行] を選択します。

  5. シミュレーションの完了後、Scope ブロック ウィンドウをクリックすると結果が表示されます。

    結果全体を表示するには [オートスケール] をクリックする必要があるかもしれません。

  6. スコープ ズーム コントロールを使用して、シミュレーションの最後の部分を調べます。最後の時間ポイントのゼロのすぐ上で速度が停止していることがわかります。

  7. Simulink エディター ツール バーのシミュレーションの [終了時間] エディット ボックスを 25 秒に変更して、再度シミュレーションを実行します。

  8. 今度は 20 秒の時間ポイントのシミュレーションを過ぎた直後にエラーが発生してシミュレーションが停止します。

    ボールが繰り返しゼロ速度に近づくにつれ、過度のチャタリングにより、シミュレーションが許可されている連続ゼロクロッシングの既定の 1,000 回を超えました。この制限は [モデル コンフィギュレーション パラメーター][ソルバー][連続的なゼロクロッシングの数] パラメーターを調整することによって増やすことができます。この場合は増やしても 25 秒間シミュレーションを実行することはできません。

  9. また、[ソルバー] ペインの [アルゴリズム] プルダウン メニューから [適応] アルゴリズムを選択します。

  10. シミュレーションを再び実行します。

  11. 今度は適応アルゴリズムによって過度のゼロクロッシング回数の発生が回避されたため、シミュレーションは最後まで実行されます。

2 次積分器を使用した跳ね返りモデル

Double-Bounce モデル

  1. MATLAB コマンド プロンプトで、「sldemo_doublebounce」と入力して例を読み込みます。モデルとアニメーション ウィンドウが開きます。アニメーション ウィンドウには、2 つのボールが 2 つの台の上に置かれています。

  2. アニメーション ウィンドウで、[Nonadaptive] ボタンをクリックして、非適応アルゴリズムで例を実行します。これは Simulink ソフトウェアがすべてのモデルに使用する既定の設定です。

  3. 右のボールにはより大きな初期速度が指定されています。その結果 2 つのボールは別の時間に地面にぶつかって跳ね返ります。

  4. シミュレーションは左側のボールがゼロクロッシングの制限回数を超えたため、14 秒後に停止します。右側のボールは空中に浮いたままです。

  5. エラー メッセージのダイアログが表示されます。[OK] をクリックして、ダイアログ ボックスを閉じます。

  6. [Adaptive] ボタンをクリックして、適応アルゴリズムでシミュレーションを実行します。

  7. 今度は左側のボールの下の地面が 20 秒後に移動しますが、シミュレーションは最後まで実行されます。

シミュレーターがゼロクロッシング イベントを見落とす場合

bounce モデルと double-bounce モデルから、不連続点周辺の高周波変動 (「チャタリング」) が、シミュレーションの早期停止を引き起こす可能性があることがわかります。

また、ソルバーの許容誤差が大きすぎる場合もソルバーがゼロクロッシングを完全に見落とすことがあります。これは、ゼロクロッシング検出技法では、信号の値によって符号が変更されたかどうかがメジャー タイム ステップの後にチェックされることが原因です。符号変更はゼロクロッシングが発生したことを示し、ゼロクロッシング アルゴリズムはその後に正確なクロッシングの時間を探します。しかし、ゼロクロッシングがある 1 つのタイム ステップの開始時と終了時で値の符号変化がない場合を想定してみましょう。このような場合、ソルバーがゼロクロッシング部を検出できずに、その位置を横切ってしまいます。

次の図は、ゼロを横切る信号を示しています。最初の例では、タイム ステップ間で符号が変わっていないため、積分はこのイベントを飛び越えてしまいます。2 番目の例では、ソルバーが符号変更を検出するため、ゼロクロッシング イベントが検出されます。

過度のゼロクロッシングの回避

次の表を使用して、モデルで過度のゼロクロッシング エラーを防ぎます。

変更内容変更方法...変更する理由...

ゼロクロッシングの許可数を増やす

[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインの [連続的なゼロクロッシングの数] の値を増やします。

ゼロクロッシングを解決する時間が十分与えられます。

[信号のしきい値] を緩める

[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインで [アルゴリズム] プルダウンを [適応] を選択し、 [信号のしきい値] オプションの値を増やします。

ソルバーがゼロクロッシングを正確に検出するための必要時間を短くします。こうすることでシミュレーション時間を短縮し、過度の連続ゼロクロッシング エラー数を減らします。ただし、[信号のしきい値] を緩めると精度が低下する可能性があります。

[適応] アルゴリズムを使用する

[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインで [アルゴリズム] プルダウンから [適応] を選択します。

このアルゴリズムは、ゼロクロッシングのしきい値を動的に調整します。これにより、精度が向上し、検出される連続ゼロクロッシングの数が減ります。このアルゴリズムには、[時間の許容誤差][信号のしきい値] の両方を指定するオプションがあります。

特定のブロックでゼロクロッシング検出を無効にする

  1. ブロックのパラメーター ダイアログ ボックスの [ゼロクロッシング検出を有効にする] チェック ボックスをオフにします。

  2. [コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインで [ゼロクロッシング コントロール] プルダウンから [ローカル設定を利用] を選択します。

ゼロクロッシング検出をローカルで無効にすると、特定のブロックでの過度の連続ゼロクロッシングによるシミュレーション停止を回避することができます。他のすべてのブロックには引き続きゼロクロッシング検出が有効で精度が向上します。

モデル全体でゼロクロッシング検出を無効にする

[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインで [ゼロクロッシング コントロール] プルダウンから [すべて無効] を選択します。

こうすると、モデルのあらゆる場所でゼロクロッシングが検出されなくなります。この結果、ゼロクロッシング検出が無効でモデルの精度は向上しません。

ode15s ソルバーを使用している場合は、数値微分式の順序を調整する

[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインで [Maximum order] プルダウンから値を選択します。

詳細については、最大次数を参照してください。

最大ステップ サイズを減らす

[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインの [最大ステップ サイズ] オプションに値を入力します。

こうすることで、ソルバーがゼロクロッシングの解決に必要なステップ数を抑えることができます。ただし、ステップ サイズを減らすとシミュレーション時間が増えます。適応アルゴリズムを使用している場合はほとんど必要ありません。

ゼロクロッシング アルゴリズム

Simulink ソフトウェアには、非適応アルゴリズムと適応アルゴリズムの 2 つのアルゴリズムが提供されています。

アルゴリズムを選択するには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインの [アルゴリズム] オプションを使用するか、ZeroCrossAlgorithm コマンドを使用します。コマンドは 'Nonadaptive''Adaptive' のいずれかに設定できます。

非適応アルゴリズムは、Simulink の前のバージョンとの下位互換性を取るために提供されており、既定の設定です。これはゼロクロッシング イベントを一括りにし、タイム ステップの数を徐々に減らしてゼロクロッシングの発生時間を特定します。非適応アルゴリズムは多くのタイプのシミュレーションに適しますが、高度な「チャタリング」(ゼロクロッシング点周辺の高周波数の振動) が存在する場合、シミュレーション時間が長くなることがあります。

適応アルゴリズムでは囲い込みのオンとオフが動的に切り替わり、次のような場合に適しています。

  • システムに大量のチャタリングが含まれている。

  • ゼロクロッシング検出周辺に保護周波数帯 (許容誤差) を指定したい。

適応アルゴリズムは、次のいずれかが満たされた場合、ゼロクロッシングの囲い込みをオフにします (反復を停止) します。

  • ゼロクロッシング誤差を超えた場合。これは [コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインの [信号のしきい値] オプションの指定値によって決定されます。ZCThreshold コマンドを使用して設定することもできます。既定の設定は Auto ですが、許容誤差には 0 よりも大きい任意の実数を入力できます。

  • システムが [コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインの [連続的なゼロクロッシングの許可数] オプションで指定された連続ゼロクロッシングの値を超えた場合。これは MaxConsecutiveZCs コマンドを使用して設定することもできます。

信号のしきい値について

適応アルゴリズムでは、ゼロクロッシング検出の許容誤差が自動設定されます。または、[コンフィギュレーション パラメーター] の [ソルバー] ペインの [Signal threshold] プルダウンに 0 以上の実数を入力して許容誤差を設定することもできます。このオプションは、ゼロクロッシング アルゴリズムが [適応] に設定されている場合にのみアクティブになります。

この図は、信号のしきい値がゼロクロッシング点周辺のウィンドウ領域を設定する状況を示しています。このウィンドウ内に収まる信号はゼロになると見なされます。

ゼロクロッシング イベントは、Tn-1 と Tn のタイム ステップで囲い込まれています。ソルバーは、状態変数が信号のしきい値で設定された帯域内に収まる、または連続ゼロクロッシングの数が [コンフィギュレーション パラメーター] の [ソルバー] ペインの [Number of consecutive zero crossings] プルダウンの値以上になるまでタイム ステップを繰り返し減らし続けます。

信号のしきい値を増やすことで、実行されるタイム ステップ間の距離が増えることがこの図からわかります。こうするとシミュレーション時間は高速化されますが、精度は低下する可能性があります。

ゼロクロッシング検出におけるブロックの動作

ブロックはゼロクロッシング変数のセットを登録できます。それらは、不連続点をもつ状態変数の関数です。ゼロクロッシング関数は、対応する不連続が生じるとき正または負の値からゼロを渡します。登録されたゼロクロッシング変数は各シミュレーション ステップの最後に更新され、符号が変わった変数はゼロクロッシング イベントとして特定されます。

ゼロクロッシングが検出された場合、Simulink ソフトウェアは符号が変化した変数の前の値と現在の値の間で内挿を行い、ゼロクロッシングの時間 (不連続点) を推定します。

メモ

ゼロクロッシング検出アルゴリズムは、データ型が double の信号に対してのみ、ゼロクロッシング イベントをまとめることができます。

ゼロクロッシングを登録するブロック

次の表で、ゼロクロッシングを登録するブロックのリストとブロックがどのようにしてゼロクロッシングを使用するかについて説明します。

ブロックゼロクロッシングの詳細

Abs

1: 正方向または負方向に向かう入力信号がゼロと交わる瞬間を検出。

Backlash

2: 1 つは上限しきい値に到達する瞬間を検出し、もう 1 つは下限しきい値に到達する瞬間を検出。

Compare To Constant

1: 信号が定数と等しくなる瞬間を検出。

Compare To Zero

1: 信号がゼロと等しくなる瞬間を検出。

Dead Zone

2: 1 つは不感帯に入る瞬間 (入力信号から下限値を差し引いたもの) を検出し、もう 1 つは不感帯から出る瞬間 (入力信号から上限値を差し引いたもの) を検出。

Enable

1: イネーブル端子が Subsystem ブロックの中にあるときに、ゼロクロッシング検出機能を提供。Enable Subsystem ブロックの詳細は、Enabled Subsystem の使用を参照してください。

From File

1: 正方向または負方向に向かう入力信号がゼロと交わる瞬間を検出。

From Workspace

1: 正方向または負方向に向かう入力信号がゼロと交わる瞬間を検出。

Hit Crossing

1 または 2。出力端子がない場合、入力信号がしきい値に達した場合に検出されるゼロクロッシングは 1 つだけです。出力端子が存在する場合、2 番目のゼロクロッシングは、出力を 1 から 0 に戻して、インパルス状の出力を生成するために使われます。

If

1: If 条件が満たされる瞬間を検出。

Integrator

リセット端子がある場合、リセットが生じる瞬間を検出。

出力に制限がある場合、3 つのゼロクロッシングが存在します。1 つは、飽和上限に到達する瞬間を検出し、1 つは飽和下限に到達する瞬間を検出し、もう1 つは飽和状態でなくなる瞬間を検出します。

MinMax

1: 出力ベクトルの各要素に対して、入力信号が新しい最小値または最大値となる瞬間を検出。

Relational Operator

1: 設定した関係が真である瞬間を検出。

Relay

1: リレーがオフの場合、スイッチがオンになる時点を検出。リレーがオンの場合、スイッチがオフになる時点を検出。

Saturation

2: 1 つは上限に到達するかまたは上限を離れる瞬間を検出し、1 つは下限に到達するかまたは下限を離れる瞬間を検出。

Second-Order Integrator

5: 2 つは状態 x の上限または下限に到達する瞬間を検出し、2 つは状態 dx/dt の上限または下限に到達する瞬間を検出し、1 つは状態が飽和から出る瞬間を検出。

Sign

1: 入力がゼロを横切る瞬間を検出。

Signal Builder

1: 正方向または負方向に向かう入力信号がゼロと交わる瞬間を検出。

Step

1: ステップ時間を検出。

Switch

1: スイッチ条件が発生する瞬間を検出。

Switch Case

1: case 条件が満たされる瞬間を検出。

Trigger

1: Triggered 端子が Subsystem ブロックの中にあるときに、ゼロクロッシング検出機能を提供。Triggered Subsystem ブロックの詳細は、以下を参照してください。 Triggered Subsystem の使用.

Enabled and Triggered Subsystem

2: 1 つはイネーブル端子、もう 1 つはトリガー端子の検出。Enabled and Triggered Subsystem ブロックの詳細については、Enabled and Triggered Subsystem の使用を参照してください。

メモ

ゼロクロッシング検出は、連続時間モードを使用する Stateflow® チャートでも使用できます。詳細については、連続時間シミュレーション用の Stateflow チャートの設定 (Stateflow)を参照してください。

実装例: Saturation ブロック

ゼロクロッシングを登録する Simulink ブロックの例には、Saturation ブロックがあります。ゼロクロッシング検出は、Saturation ブロックで次の状態イベントを特定します。

  • 入力信号が上限に到達する。

  • 入力信号が上限から離れる。

  • 入力信号が下限に到達する。

  • 入力信号が下限から離れる。

それ自身の状態イベントを定義する Simulink ブロックは、"厳密なゼロクロッシング" をもっていると考えられます。Hit Crossing ブロックを使用して、ゼロクロッシング イベントの明示的な通知を受け取ることができます。ゼロクロッシングが含まれるブロックのリストについては、ゼロクロッシングを登録するブロックを参照してください。

状態イベントの検出は、内部のゼロクロッシング信号の構成によって異なります。この信号をブロック線図から使用することはできません。Saturation ブロックの場合、上限に対するゼロクロッシングを検出するために使われる信号は、zcSignal = UpperLimit - u です。ここで、u は入力信号です。

ゼロクロッシング信号は方向属性をもっており、次のような値を取ります。

  • rising — ゼロクロッシングは、信号が負からゼロに向かう瞬間またはゼロを通過する瞬間、あるいはゼロから正になる瞬間で発生します。

  • falling — ゼロクロッシングは、信号がゼロに下がる、またはゼロを通過する瞬間、あるいはゼロから負になる瞬間で発生します。

  • either — ゼロクロッシングは、rising と falling のいずれかの条件が発生した場合に発生します。

Saturation ブロックの上限に対して、ゼロクロッシングの方向は、either です。これにより、同じゼロクロッシング信号を使って飽和イベントの切り替えを検出することができます。

参考

| |