ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

動的システムのシミュレーション

モデルのコンパイル

シミュレーションの最初の段階の処理は、システムのモデルを開いて、モデルのシミュレーションを実行したときに行われます。Simulink® エディターで、[シミュレーション][実行] を選択します。シミュレーションを実行すると、Simulink エンジンによってモデル コンパイラが呼び出されます。モデル コンパイラはコンパイルと呼ばれるプロセスでモデルを実行可能形式に変換します。特にコンパイラは以下を行います。

  • モデルのブロック パラメーター式を評価し、値を決定します。

  • モデルによって明示的に指定されていない信号の属性 (たとえば、名前、データ型、数値タイプ、サイズ) を決定し、各ブロックが、入力に接続されている出力を受け取ることができることをチェックします。

  • 属性の伝播と呼ばれるプロセスを使って、指定されていない属性を決定します。このプロセスは、ソース信号から接続しているブロックの入力への属性の伝播を伴います。

  • ブロックを減らす最適化を実行します。

  • バーチャル サブシステムをその構成ブロックで置き換えることにより、モデルの階層を平坦にします (「ソルバー」を参照)。

  • ブロックの並べ替え順序の決定 (詳細は、オンライン ドキュメンテーションの「「並べ替え順序の制御と表示」」を参照)。

  • サンプル時間が明示的に指定されていないモデル内のすべてのブロックのサンプル時間を決定します (「伝播が継承サンプル時間に影響を与える方法」を参照)。

これらのイベントはブロック線図の更新時に発生するイベントと、基本的に同じです (「ブロック線図の更新」)。違いは、Simulink ソフトウェアがモデル シミュレーションの一部としてモデルのコンパイルを開始することです。コンパイルが開始されると、「リンク フェーズ」に記載されているように、リンク フェーズに直接移行します。一方、モデルの更新は、モデルに対するスタンドアロン操作としてユーザーが明示的に開始します。

リンク フェーズ

このフェーズでは、Simulink エンジンは、ブロック線図の実行のために、作業領域 (信号、状態、ランタイム パラメーター) 用に必要なメモリを割り当てます。また、各ブロックの実行時情報を格納するデータ構造体用のメモリを割り当て、初期化します。組み込みブロックに対しては、ブロックの主たる実行時データ構造体は、SimBlock と呼ばれます。これは、ブロックの入出力バッファー、状態、作業ベクトルを指すポインターを格納します。

メソッド実行リスト

リンク フェーズでは、Simulink エンジンは、メソッド実行のリストも作成します。これらのリストは、出力を計算するために、モデルのブロック メソッドを実行するための最適な順番を示します。モデルのコンパイル フェーズ中に生成され並べ替えられたリストを使ってメソッド実行リストを作成します。

ブロック優先順位

ブロックの処理順序には優先順位を付けることが可能です (「ブロックの優先順位の割り当て」を参照)。優先順位が低いブロックの前に優先順位が高いブロックの出力メソッドが実行されます。ただし、その優先順位がブロックの並べ替えルールに従っている場合にのみ、その順序が守られます。

シミュレーション ループ フェーズ

リンク フェーズが完了すると、シミュレーションはシミュレーション ループ フェーズに入ります。このフェーズでは、Simulink は、引き続きモデルが提供する情報を使って、シミュレーション開始時間から終了時間までの区間でシステムの状態と出力を計算します。状態と出力が計算される連続する時間点は、タイム ステップと呼ばれます。ステップ間の時間の長さは、ステップ サイズと呼ばれます。ステップ サイズは、システムの連続状態の計算に使うソルバーのタイプ (「ソルバー」を参照)、システムの基本サンプル時間 (「システム内のサンプル時間」を参照)、システムの連続状態が不連続性をもつかどうかに依存します (「ゼロクロッシング検出」を参照)。

シミュレーション ループ フェーズには、ループ初期化フェーズとループ反復フェーズの 2 つのサブフェーズがあります。初期化フェーズは、ループの開始時に 1 回発生します。反復フェーズは、シミュレーション開始時間から終了時間まで 1 ステップごとに 1 回繰り返されます。

シミュレーションの開始時に、モデルは、シミュレートするシステムの初期状態と初期出力を指定します。各ステップで、システムの入力、状態、出力が計算され、計算値を反映するようにモデルが更新されます。シミュレーションの終了時に、モデルはシステムの入力、状態、出力の最終値を反映させます。Simulink ソフトウェアは、データの表示とログを行うブロックを提供しています。モデルにこれらのブロックを含めることにより、中間結果を表示またはログできます。

ループ反復

各タイム ステップで Simulink エンジンは次のことをします。

  1. モデルの出力を計算します。

    Simulink エンジンは、Simulink モデルの Outputs メソッドを呼び出すことによってこのステップを開始します。モデルの Outputs メソッドは、モデルシステムの Outputs メソッドを呼び出し、これは、シミュレーションのリンク フェーズで生成されたリストによって指定された順番でモデルが含むブロックの Outputs メソッドを呼び出します(「ソルバー」を参照)。

    システムの Outputs メソッドは、引数として、ブロックのデータ構造体とその SimBlock 構造体を指すポインターを各ブロックの Outputs メソッドに渡します。 SimBlock データ構造体は、入出力バッファーの位置を含む、ブロックの出力を計算するのに必要な情報を示します。

  2. モデルの状態を計算します。

    Simulink エンジンは、ソルバーを呼び出すことによってモデルの状態を計算します。どのソルバーを呼び込むかは、モデルが状態をもたないか、離散状態のみか、連続状態のみか、連続と離散の両方をもつかによって決まります。

    モデルが離散状態のみをもつ場合は、Simulink エンジンは、ユーザーが選択した離散ソルバーを起動します。ソルバーは、モデルのサンプル時間をヒットするのに必要なタイム ステップのサイズを計算します。その後で、モデルの Update メソッドを呼び込みます。モデルの Update メソッドは、システムの Updateメソッドを呼び込み、これは、リンク フェーズで生成された Update メソッドのリストで指定された順番でシステムが含むブロックの各々の Update メソッドを呼び込みます。

    モデルが連続状態のみをもつ場合は、Simulink エンジンはモデルによって指定された連続ソルバーを起動します。ソルバーにより、モデルの Derivatives メソッドを 1 回呼び出すか、あるいは、メジャー タイム ステップ内の連続する間隔でモデルの出力と導関数を計算する Output メソッドと Derivative メソッドをソルバーが繰り返し呼び出すマイナー タイム ステップのサブサイクルを入力します。これは、状態の計算の精度を上げるために行われます。モデルの Outputs メソッドと Derivatives メソッドは、リンク フェーズで生成される Output および Derivative メソッドの実行リストで指定される順番で、Outputs および Derivatives ブロックを呼び出す対応するシステム メソッドを起動します。

  3. オプションでブロックの連続状態の不連続性をチェックします。

    連続状態の不連続検出には、ゼロクロッシング検出と呼ばれる手法が使用されます。詳細は、「ゼロクロッシング検出」を参照してください。

  4. 次のタイム ステップに対する時間を計算します。

シミュレーションの停止時間になるまでステップ 1 ~ 4 を繰り返します。

ソルバー

動的システムのシミュレーションは、モデル情報から指定された時間の間、連続タイム ステップで状態量を計算して行われます。システムの状態量をモデルから計算するプロセスは、モデルの解を求めることとして知られています。モデルを解く方法はどのシステムについても 1 つではありません。したがって、ソルバーというプログラム群が用意されており、各プログラムにはモデルを解くための特別なアプローチが組み込まれています。[コンフィギュレーション パラメーター] ダイアログ ボックスを使えば、モデルに最適なソルバーを選択することができます (「ソルバー タイプの選択」を参照)。

固定ステップ ソルバーと可変ステップ ソルバー

Simulink ソフトウェアのソルバーは、固定ステップと可変ステップという 2 つのタイプに分けられます。

固定ステップ ソルバーでは、シミュレーションの開始から終了まで一定の時間間隔でモデルを解きます。時間間隔のサイズは、ステップ サイズとも呼ばれ、ユーザーが自分で選択することもソルバーに選択させることもできます。一般に、ステップ サイズを小さくするとシステムのシミュレーションに要する時間が長くなりますが、結果の精度は向上します。

可変ステップ ソルバーでは、シミュレーション実行中にステップ サイズが変化します。モデルの状態量が急激に変動しているときは精度を上げるためにステップ サイズが小さくなり、モデルの状態の変動が緩慢なときは不必要なタイム ステップを取ることを回避するためにステップ サイズが大きくなります。ステップ サイズの計算は、各ステップで計算のオーバーヘッドを加えますが、ステップの総数は減らすことが可能なため、急激に変化あるいは区分的に連続状態をもつモデルの指定したレベルの精度を保持するために必要なシミュレーション時間が増加します。

連続ソルバーと離散ソルバー

Simulink 製品では、連続ソルバーと離散ソルバーの両方が用意してあります。

連続ソルバーは、数値積分を使って前のタイム ステップにおける状態と状態導関数から現在のタイム ステップにおけるモデルの状態量を計算します。連続ソルバーは、個々のブロックに基づいて各タイム ステップにおけるモデルの離散状態量の値を計算します。

動的システムの連続状態を表す常微分方程式 (ODE) を解くためのさまざまな数値積分技法が数学者によって開発されています。それぞれ特定の ODE 解法を実装する各種の固定ステップ連続ソルバーおよび可変ステップ連続ソルバー群が用意されています (「ソルバー タイプの選択」を参照)。

離散ソルバーは主に、純粋な離散モデルを解くためのものです。モデルについて次のシミュレーション タイム ステップを計算し、それ以外のことは行いません。これらの計算では、モデルの各ブロックに基づいて個々の離散状態量を更新します。連続状態の計算は行いません。

    メモ:   連続状態と離散状態の両方を含むモデルの解を求める場合は連続ソルバーを使用しなければなりません。離散ソルバーでは連続状態を処理できないため、離散ソルバーは使用できません。一方、状態のないモデルや離散状態のみの場合に連続ソルバーを選択しても、Simulink ソフトウェアでは離散ソルバーが使用されます。

提供されている 2 つの離散ソルバーは、固定ステップ離散ソルバーと可変ステップ離散ソルバーです。固定ステップ離散ソルバーは既定の場合、モデルの最速ブロックにおける状態量の変化の速度に合わせてステップ サイズ (したがって、シミュレーション速度) を選択します。可変ステップ離散ソルバーは、モデルにおける実際の離散状態量の変化速度に合わせてシミュレーションのステップ サイズを調整します。これにより不必要なステップを取ることが回避されるため、マルチレート モデルのシミュレーション時間が短縮されます (詳細は、「システム内のサンプル時間」を参照)。

マイナー タイム ステップ

ソルバーの中には、シミュレーション時間をメジャー タイム ステップとマイナー タイム ステップに細かく分けるものがあります。マイナー タイム ステップは、メジャー タイム ステップの下位区分を表します。ソルバーは、各メジャー タイム ステップでの結果を生成します。マイナー タイム ステップでの結果を使ってメジャー タイム ステップでの結果の精度を向上させます。

形状の保存

通常、積分ステップ サイズは現在のステップ サイズと現在の積分誤差に関連しています。ただし、微分が迅速に変化する信号の場合、各タイム ステップに微分入力情報を含めることによって、より精度の高い積分結果を得ることができます。そのためには、[モデル コンフィギュレーション パラメーター][ソルバー][形状の保存] オプションを有効にします。

ゼロクロッシング検出

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

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_integratorssldemo_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_doublebouncesldemo_doublebounce」と入力して例を読み込みます。モデルとアニメーション ウィンドウが開きます。アニメーション ウィンドウには、2 つのボールが 2 つの台の上に置かれています。

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

  3. 右側のボールに大きな初期速度が与えられ、その結果 2 つのボールは別々の時間に地面に当たって跳ね返ります。

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

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

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

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

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

bounce モデルと double-bounce モデルから、不連続に関する高周波変動 (「チャタリング」) があると、シミュレーションが途中で停止する可能性があることがわかります。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

適応アルゴリズムでは、イベントのかっこのオンとオフを動的に切り替えることができ、次のような場合に適しています。

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

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

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

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

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

信号のしきい値について

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

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

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

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

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

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

ゼロクロッシングが検出された場合、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 つはトリガー端子の検出。Triggered and Enabled Subsystem ブロックの詳細は、以下を参照してください。 「Triggered and Enabled Subsystem の作成」

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

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

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

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

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

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

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

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

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

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

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

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

代数ループ

代数ループとは

Simulink の代数ループ-  Simulink モデルでは、代数ループ は、信号ループがループ内の直接フィードスルー ブロックによってのみ存在しているときに発生します。直接フィードスルー とは、ブロックの出力が入力端子の値に依存している状態を指します。つまり、出力の値は入力の値に直接制御されています。"非直接フィードスルー" ブロックの場合は、状態変数が維持されます。代表的な 2 つの例としては、Integrator または Unit Delay ブロックがあります。

一部の Simulink ブロックには直接フィードスルー入力端子があります。ソフトウェアは、これらの入力端子からブロックに入る現在のタイム ステップの信号の値がわからなければ、これらのブロックの出力を計算できません。

直接フィードスルー入力をもつブロックには、いくつかの例があります。

  • Math Function ブロック

  • Gain ブロック

  • Product ブロック

  • State-Space ブロック、D 行列係数が非ゼロの場合。

  • Sum ブロック

  • Transfer Fcn ブロック、分子と分母が同じ次数の場合。

  • Zero-Pole ブロック、ブロックが極の数と同じだけの零点をもつ場合。

    ヒント:   ブロックが直接フィードスルーかどうかを判断するには次のようにします。

    1. ブロックをダブルクリックします。

      ブロックのパラメーター ダイアログ ボックスが開きます。

    2. ブロックのパラメーター ダイアログ ボックスで [ヘルプ] ボタンをクリックしてください。

      ブロックのリファレンス ページが開きます。

    3. ブロックのリファレンス ページの[特性] セクションまでスクロールします。そこに、そのブロックが直接フィードスルーかどうかが表示されています。

代数ループの例として、次の簡単なループがあります。このループが、推奨されるモデリング パターンではないことに注意してください。

数学的には、このループは Sum ブロックの出力が、最初の入力 u から xa (たとえば、xa = u – xa) を引いた値に等しくなるように制約されている代数変数 xa であることを示します。この単純ループの解は xa = u/2 です。

代数ループの数学的定義-  Simulink には、"常微分方程式 (ODE: ordinary differential equations)" のシミュレーションに使用する一連の数値ソルバーが含まれています。常微分方程式は次のように表現される連立方程式です。

x は状態ベクトル、t は独立時間変数です。

連立方程式には、状態ベクトルの微分係数ではなく、独立変数と状態ベクトルに関する追加の制約を含むものがあります。そのような連立方程式は "微分代数方程式 (DAE: differential algebraic equation)" であり ODE ではありません。

"代数" は微分係数を含まない方程式を意味します。工学で使用される DAE は、以下のような半陽的な形式で表現できます。

  • fg はベクトル関数の場合があります。

  • 最初の方程式は微分方程式です。

  • 2 番目の方程式は代数方程式です。

  • 微分方程式の変数のベクトルは x です。

  • 代数方程式の変数のベクトルは xa です。

Simulink モデルでは、代数ループは代数制約です。代数ループをもつモデルは微分代数方程式を定義します。Simulink は DAE を直接解きません。Simulink は ODE ソルバーの各ステップで代数方程式 (代数ループ)を xa に関して数値的に解きます。

次の Simulink モデルモデル はこの半陽的な連立方程式と等価です。

ODE ソルバーの各ステップでは、 の微分係数を計算する前に、代数ループ ソルバーで xa に関する代数制約を解かなければなりません。

物理システムにおける代数ループの意味-  代数制約は物理的なシステムのモデルで発生する可能性があります。多くの場合、質量とエネルギーの保存などの保存法則に関係して発生します。代数制約は、動的システムにおいてシステム応答に設計制約を課すためにも使用されます。

モデルに特定の座標系を指定することも代数制約となります。ほとんどの場合、代数ループを除去して、常微分方程式 (ODE) を作成できます (「代数ループの除去」 を参照)。ただし、この方式は大規模で複雑なモデルでは時間がかかる場合があります。

MathWorks® では、機械的、電気的、油圧的、その他の物理的領域を、物理ネットワークとしてカバーするモデル システムを提供することによって Simulink を拡張した Simscape™ ソフトウェアを提供しています。

Simscape ソフトウェアは、Simulink モデルの動作を特徴付ける微分代数方程式 (DAE) を自動的に作成します。これらの方程式はモデルの残りの部分と統合され、Simscape ソフトウェアが直接 DAE を解きます。異なる物理的領域のコンポーネントの変数が同時に解かれるため、代数ループにともなう問題を回避します。

代数ループから派生する問題

モデルに代数ループが含まれている場合。

  • モデルのコードを生成できません。

  • Simulink 代数ループ ソルバーが代数ループを解けない場合があります。

  • Simulink は代数ループを解こうとしますが、シミュレーションの速度が低下する場合があります。

    ほとんどのモデルでは、代数ループ ソルバーは最初のタイム ステップで多くのリソースを計算に費やします。後続のタイム ステップでは、良好な xa の開始点を前のタイム ステップから利用できるので、Simulink ソルバーは短時間で解を出します。

モデル内の代数ループの識別

代数ループの診断-  Simulink はシミュレーションの初期化時に代数ループを検出します。たとえば、ブロック線図を更新したときなどです。[代数ループ] の診断を設定して、モデル内で代数ループが検出されたらエラーまたは警告が報告されるようにします。

[コンフィギュレーション パラメーター] ダイアログ ボックスの [診断] ペインで、[代数ループ] パラメーターを次のように設定します。

設定 シミュレーションの動作
[なし]

Simulink 代数ループの解を出そうとしますが、解を出せなければエラーを報告します。

[警告]

代数ループがあると警告が出ます。Simulink は代数ループの解を出そうとしますが、解を出せなければエラーを報告します。

[エラー]

代数ループは初期化を停止します。

Simulink にループを解かせたい場合は、[なし] または [警告] を選択します。Simulink が実際にループを解く前に動作を確認したい場合は、[エラー] を選択します。

代数ループ診断での代数ループの強調表示-  モデルの更新またはシミュレーションを行うときに、Simulink エディターで代数ループを強調表示するには次のようにします。

  1. sldemo_hydcyl モデルを開きます。

    sldemo_hydcylsldemo_hydcyl
  2. [シミュレーション][モデル コンフィギュレーション パラメーター] を選択して [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

  3. [診断] ペインで、[代数ループ] パラメーターを [エラー] に設定します。

    Simulink ソフトウェアによってモデルに代数ループが検出された場合は、シミュレーションを停止し、エラーが報告されます。

  4. [OK] をクリックし、設定を保存します。

  5. [開始] ボタンをクリックします。

    Simulink が代数ループを検出すると、シミュレーションは停止します。[診断ビューアー] にエラー メッセージが表示され、代数ループの一部になっているすべてのブロックがリストされます。

    Simulink エディターで、ループを形成するブロックと信号が赤色で強調表示されます。

  6. ブロック線図の色を元に戻すには、[診断ビューアー] を閉じます。

  7. 変更内容を保存せずに sldemo_hydcyl モデルを閉じます。

次のセクションでは、ashow デバッガー コマンドでこのモデルに 2 つの代数ループがあることを示します。

ashow デバッガー コマンドを使用した代数ループの強調表示-  Simulink デバッガーを使用して、モデル シミュレーションをステップ実行できます。ashow コマンドを使用して、次のように代数ループを強調表示します。

  1. sldemo_hydcyl モデルを開きます。

    既定の設定では、このモデルの [代数ループ] パラメーターは [なし] に設定されています。

  2. Simulink デバッガーを起動します。Simulink エディターで、[シミュレーション][デバッグ][モデルのデバッグ] を選択します。

  3. [開始/継続] ボタンをクリックしてデバッガーを開始します。

  4. MATLAB コマンド ウィンドウで以下のように入力します。

    ashow

    sldemo_hydcyl モデル内の 2 つの代数ループと各代数ループ内のブロック数がリストされます。

    Found 2 Algebraic loop(s): 
    System number#Algebraic loop id, number of blocks in loop
    - 0#1, 9 blocks in loop
    - 0#2, 4 blocks in loop
  5. 最初の代数ループのブロックをリストするには、MATLAB コマンド ウィンドウで次のコマンドを入力します。

    ashow 0#1

    Valve/Cylinder/Piston/Spring Assembly サブシステム内の Control Valve Flow サブシステムが表示され、モデル内の代数ループが強調表示されて、その代数ループ内の 9 つのブロックが次のようにリストされます。

    - sldemo_hydcyl/Valve//Cylinder//Piston//Spring Assembly/Control Valve Flow/IC
    - sldemo_hydcyl/Valve//Cylinder//Piston//Spring Assembly/Control Valve Flow/signed sqrt
    - sldemo_hydcyl/Valve//Cylinder//Piston//Spring Assembly/Control Valve Flow/Product
    - sldemo_hydcyl/Valve//Cylinder//Piston//Spring Assembly/laminar flow pressure drop
    - sldemo_hydcyl/Valve//Cylinder//Piston//Spring Assembly/Sum7
    - sldemo_hydcyl/Pump/IC
    - sldemo_hydcyl/Valve//Cylinder//Piston//Spring Assembly/Control Valve Flow/
    Sum1 (algebraic variable) - sldemo_hydcyl/Pump/Sum1 - sldemo_hydcyl/Pump/leakage (algebraic variable)
  6. Simulink デバッガーで [閉じる] をクリックします。

  7. MATLAB コマンド プロンプトで Enter キーを押して、MATLAB コマンド プロンプトに戻します。

モデルに代数ループが含まれていた場合

Simulink によってモデルに代数ループがあることが報告された場合、代数ループ ソルバーによってループを解くことができる場合があります。Simulink でループが解けない場合に、ループを削除する方法がいくつかあります。

次のワークフローは、代数ループを削除する方法の評価に役立ちます。一部の方法については、次の節で説明します。

Simulink 代数ループ ソルバー

代数ループ ソルバーの動作-  モデルに代数ループが含まれている場合、Simulink ソフトウェアは各タイム ステップで非線形ソルバーを使って代数ループの解を求めます。ソルバーはその代数制約の解を決定する (可能であれば) ために反復実行します。その結果、代数ループをもつモデルは、もたないモデルよりも実行が遅くなります。

Simulink は、dogleg 信頼領域アルゴリズムを使用して、代数ループの解を求めます。使われる許容誤差は、ODE ソルバー Reltol と Abstol より小さくなります。これは、Simulink が "明示的 ODE メソッド" を使って、インデックスが -1 の微分代数方程式 (DAE) を解くためです。

代数ループ ソルバーが機能するには、次の条件が必要です。

  • ループ ソルバーによってループを切断してループを解くことができるブロックが 1 つ存在している。

  • 実数の倍精度信号。

  • 基本となっている代数制約は平滑化関数でなければならない。

たとえば、モデルに 2 つの入力 (1 つは加算、もう 1 つは減算) をもつ Sum ブロックがあるとします。Sum ブロックの出力を入力の 1 つに接続した場合、すべてのブロックが直接フィードスルーを含んでいる代数ループが形成されます。

Sum ブロックは入力が不明であれば出力を計算できません。Simulink は代数ループを検出し、ソルバーは反復ループを使用して解を求めます。Sum ブロックの例では、次のようにして正しい解が計算されます。

xa(t) = u(t) / 2.

代数ループ ソルバーは勾配に基づいた検索方法を使用します。この方法では、代数ループに対応する代数制約について連続の 1 次導関数が必要になります。その結果、代数ループに不連続性が含まれる場合には、代数ループ ソルバーが失敗する可能性があります。

詳細については、「Solving Index-1 DAEs in MATLAB and Simulink [1] 」を参照してください。

代数ループ ソルバーのアルゴリズム: 信頼領域法とライン探索法-  Simulink 代数ループ ソルバーは 2 つのアルゴリズムを使って代数ループの解を求めます。信頼領域法とライン探索法です。既定の設定では、代数ループ ソルバーは信頼領域法アルゴリズムを使用します。

代数ループ ソルバーが信頼領域アルゴリズムで代数ループの解を見つけることができない場合、他のアルゴリズムを使ってモデルのシミュレーションを試すことができます。

ライン探索法アルゴリズムに切り替えるには、MATLAB コマンド ラインで次のように入力します。

set_param(model_name, 'AlgebraicLoopSolver', 'LineSearch');

信頼領域法アルゴリズムに戻すには、MATLAB コマンド ラインで次のように入力します。

set_param(model_name, 'AlgebraicLoopSolver', 'TrustRegion');

詳細は、次の参考文献を参照してください。

代数ループ ソルバーの限界-  代数ループの解を求める処理は反復処理です。Simulink の代数ループ ソルバーは代数ループが一定値に収束しなければ解くことができません。ループが収束しない、または収束が遅過ぎる場合は、シミュレーションはエラーを出して終了します。

代数ループ ソルバーは次の項目を含む代数ループを解くことはできません。

  • 離散値の出力をもつブロック

  • 倍精度以外の出力または複素数の出力をもつブロック

  • Discontinuities

  • Stateflow チャート

代数ループの除去

遅延の導入-  

Atomic Subsystem によってフィードバック ループが作成されると、大規模なモデルでは代数ループが発生する可能性があります。

次の一般的モデルには、サブシステムが関与する代数ループが 2 つあります。

  • BlackBox_A —> BlackBox_B —> BlackBox_C —> BlackBox_A

  • BlackBox_B —> BlackBox_C —> BlackBox_B

このモデルを更新すると、Simulink によってループ BlackBox_A —> BlackBox_B —> BlackBox_C —> BlackBox_A が検出されます。

これらのサブシステムの内容がわからないため、サブシステムの外部に Unit Delay ブロックを追加して、ループを解かなければなりません。Unit Delay を使用してこれらのループを解くには、次の 3 つの方法があります。

BlackBox_A と BlackBox_C の間の単位遅延を追加

サブシステム BlackBox_A と BlackBox_C の間のフィードバック信号に単位遅延を追加した場合、システムには最小数の単位遅延 (1) を導入したことになります。BlackBox_A の前に遅延を導入した場合、BlackBox_B と BlackBox_C では現在のタイム ステップのデータが使用されます。

BlackBox_B と BlackBox_C の間の単位遅延を追加

サブシステム BlackBox_B と BlackBox_C の間に単位遅延を追加した場合は、BlackBox_B と BlackBox_C の間の代数ループを解くことになります。さらに、信号が代数ループを完了するため、BlackBox_A と BlackBox_C の間のループも解きます。BlackBox_C の前に単位遅延ブロックを挿入することにより、BlackBox_C は前のタイム ステップのデータのみを使用して処理するようになります。

両方の代数ループに単位遅延を追加

次の例では、単位遅延ブロックを挿入して、両方の代数ループを解きます。このモデルでは、BlackBox_A と BlackBox_B では、前のタイム ステップのデータが使用されます。BlackBox_C では、現在のタイム ステップのデータが使用されます。

代数ループ ソルバーを支援するその他の技法

Simulink が解を求めることのできない代数ループがあると、エラーが報告されます。Simulink 代数ループ ソルバーが解けない代数ループに対しては、手動で解を求める手法があります。

IC ブロックと Algebraic Constraint ブロックを使った初期推定の作成-  代数状態の良好な初期推定がないと代数ループ ソルバーが収束できないループがモデルに含まれている可能性があります。代数状態変数には初期推定を指定できますが、ループが適正と考えられるときにのみこの技法を使用してください。

初期推定の指定方法には次の 2 つがあります。

  • 代数ループの中に IC ブロックを配置する。

  • Algebraic Constraint ブロックを使用して代数ループの信号に初期推定を指定する。

ブロック優先順位の変更によって削除されない代数ループ

シミュレーションの更新段階で、Simulink はシミュレーション中にブロック メソッドを実行する順序を判断します。このブロックの呼び出し順序が "並べ替え順序" です。

非バーチャル ブロックに優先準備を割り当て、Simulink にその他のブロックに対する相対的な実行順序を指示している場合には、代数ループ ソルバーが任意の代数ループを解こうとするときに、これらの優先順位は守られません。

擬似代数ループ

擬似代数ループとは-  Atomic Subsystem または Model ブロックによって Simulink が代数ループを検出する設定になっているときは、サブシステムの内容に代数制約が含まれていない場合であっても、"擬似代数ループ" が発生します。Atomic Subsystem を作成するときは、すべての Inport ブロックは直接フィードスルーとなるため、代数ループが発生します。

次の モデルモデル には、代数ループは含まれません。モデルはエラーなしでシミュレーションを実行します。

Controller ブロックと Plant ブロックをサブシステムで囲みたい場合には、[Subsystem のパラメーター] ダイアログ ボックスで [Atomic Subsystem として扱う] を選択してサブシステムを Atomic に変更します。

このモデルモデル をシミュレーションすると、Atomic Subsystem 内のパスは直接フィードスルーではありませんが、サブシステムが直接フィードスルーであるために、Simulink は代数ループを検出します。

メインの診断ペインの [コンフィギュレーション パラメーター] ダイアログ ボックスで、[代数ループ] パラメーターを[エラー] に設定している場合は、Simulink は代数ループ エラーによってシミュレーションを中止します。

Atomic Subsystem によって削除される疑似代数ループ-  Atomic Subsystem によって発生した疑似代数ループを削除する方法の 1 つは、Atomic Subsystem をバーチャル サブシステムに変換することです。この操作はモデルの動作には影響を与えません。

サブシステムが Atomic のときにモデルをシミュレートする場合は、Simulink は代数ループ ソルバーを呼び出します。代数ループ ソルバーは 1 回反復した後で終了します。代数定数がないため、代数ループを自動的に解きます。サブシステムをバーチャルに変更した後は、シミュレーション中に、Simulink は代数ループ ソルバーを呼び出しません。

Atomic Subsystem をバーチャル サブシステムに変換するには

  1. その Atomic Subsystem を含むモデルを開きます。

  2. Atomic Subsystem を右クリックし、[Subsystem のパラメーター] を選択します。

  3. [Atomic Subsystem として扱う] パラメーターをクリアします。

  4. [OK] をクリックして変更を適用し、ダイアログ ボックスを閉じます。

  5. モデルを保存します。

Atomic Subsystem をバーチャル サブシステムに置き換えても、まだシミュレーションが代数ループ エラーで失敗する場合は、モデルに次のいずれかが存在する可能性があります。

  • 代数制約

  • Atomic Subsystem が原因ではない疑似代数ループ

モデルを調べて、代数ループの位置を特定し、この節で説明したいくつかの技法を使用してループを解いてください。

疑似代数ループを作成するバンドルされた信号-  モデルによっては複数の信号をまとめて一緒にするものがあります。これをまとめたために、代数制約が存在しないにも関わらず Simulink が代数ループの検出を報告する場合があります。信号を 1 つまたは複数リダイレクトすると、疑似代数ループが除去される場合があります。

次の線形化モデルモデルは 1 つのポンプから注入を受ける 2 タンク システムの動作のシミュレーションを行います。このモデルには次の項目が含まれています。

  • 出力 q1 はポンプからタンクへの液体の流速。

  • 出力 h2 は 2 番目のタンク内の液体の高さ。

  • State-Space ブロックはポンプの動作に対するタンク システムの反応を次のように定義します。

  • State-Space ブロックからの出力は q1h2 を含むベクトルです。

このモデルモデル[代数ループ] パラメーターを [警告] または [エラー] に設定してシミュレーションを実行すると、Simulink は代数ループを検出します。

この代数ループを削除するには次のようにします。

  1. 行列 C および D を次のように変更します。

  2. q1 を State-Space ブロックを通してではなく、直接 Scope に渡します。

    そうすると、入力 (q1) は直接出力に渡されない (D 行列は 0 である) ため、State-Space ブロックにはもう直接フィードスルーはありません。フィードバック信号には 1 つの要素しかありません。そのため、次のモデルモデルのように、Selector ブロックは必要でなくなります。

疑似代数ループの診断と削除に使用されるモデルおよびブロック パラメーター-  モデルに疑似代数ループが存在すると考えられるときには、2 つのパラメーターの使用を検討します。

  • [代数ループの発生の最小化] パラメーター — 次の要素について、Simulink によって疑似代数ループが削除されるように指定します。

    • Atomic Subsystem — [Subsystem のパラメーター] ダイアログ ボックスで、[代数ループの発生の最小化] を選択します。

    • Model ブロック — 参照モデルでは、[コンフィギュレーション パラメーター] ダイアログ ボックスの [モデル参照] ペインで、[代数ループの発生の最小化] を選択します。

  • [代数ループの最小化] パラメーター — [代数ループの発生の最小化] パラメーターの効果がない場合に、Simulink が実行する診断アクションを指定します。

    [代数ループの発生の最小化] パラメーターは、[診断] ペインの [コンフィギュレーション パラメーター] ダイアログ ボックスにあります。このパラメーターで指定できる診断アクションは次のとおりです。

    設定 シミュレーションの動作
    [なし]

    Simulink は何のアクションも実行しません。

    [警告]

    Simulink は [代数ループの発生の最小化] パラメーターの効果がないことを通知する警告メッセージを表示します。

    [エラー]

    Simulink はシミュレーションを中止し、[代数ループの発生の最小化] パラメーターの効果がないことを通知するエラー メッセージを表示します。

ブロック削減と擬似代数ループ-  [コンフィギュレーション パラメーター] ダイアログ ボックスで [ブロック削減] 最適化を有効にすると、Simulink エンジンによってブロック グループがより効率的な 1 つのブロックにたたみ込まれるか、完全に削除されます。これにより、モデルのシミュレーションと生成コードの実行が高速化します。

また、Simulink が疑似代数ループを解くのに役立ちます。

以下の例 モデルモデル を考えます。

初期状態では、ブロック削減はオフに設定されています。このモデルモデルをシミュレートするとき、 Atomic Unit Subsystem と Gain および Compare to Constant ブロックが Simulink が解けない代数ループの一部を形成しています。

ブロック削減と並べ替え有効にし、モデルを再シミュレートすると、Simulink は削減されたブロックの並べ替え順については表示しません。そのため、どのブロックが削減されたのかを迅速に確認できます。

モデルから Compare to Constant ブロックと Gain ブロックが削除されているため、代数ループ エラーは生成されなくなります。Atomic Unit Subsystem では、警告が生成されます。

警告:サブシステム "ex_aloop_block_reduction_errwarn/ Atomic Unit" の入力端子 "ex_aloop_block_reduction_errwarn/ Atomic Unit/In1" に直接フィードバックが含まれる場合、代数ループが存在するため Simulink で削除できません。この警告を回避するため、[代数ループの発生の最小化] パラメーターをクリアすることを検討してください。

    ヒント:   Bus Selector ブロックを使用して、必要な信号のみを Atomic Subsystem に渡します。

方法Simulink による疑似代数ループ削除の方法-  [代数ループの発生の最小化] を有効にすると、Simulink は疑似代数ループを削除しようとします。この節では、このモデルモデルを使用して、そのプロセスについて説明します。モデルには、疑似代数ループの原因となる Atomic Subsystem が含まれています。

Atomic Subsystem の内容は直接フィードスルーではありませんが、Simulink は Atomic Subsystem を直接フィードスルーと判断します。

[代数ループ] 診断が [エラー] に設定されている場合は、モデルには Atomic Subsystem に関与する疑似代数ループが含まれているため、シミュレートするとエラーになります。

Simulink がどのようにこの代数ループを削除するかを確認するには、方法を次の手順を実行してください。

  1. 上図からモデルを作成します。疑似代数ループの原因となる Atomic Subsystem が含まれています。

  2. [シミュレーション][モデル コンフィギュレーション パラメーター] を選択します。

  3. [コンフィギュレーション パラメーター] ダイアログ ボックスの [診断] ペインで、[代数ループ] パラメーターを [警告] または [なし] に設定します。

  4. [データのインポート/エクスポート] ペインで、[信号のログ] パラメーターが無効になっていることを確認します。信号のログが有効になっていると、Simulink は疑似代数ループを削除できません。

  5. [OK] をクリックします。

  6. このモデルと Atomic Subsystem の並べ替え順序を表示するには、[情報表示][ブロック][ソートされた実行順序] を選択します。

    並べ替え順序を確認しておくと、疑似代数ループを削除する方法を理解するのに役立ちます。

    サブシステムのすべてのブロックは同じレベルで実行されます 1. (最下位レベルは 0 で、最初に実行されるブロックを表します)。

  7. 最上位モデルでサブシステムを右クリックし、[Subsystem のパラメーター] を選択します。

  8. [代数ループの発生の最小化] を選択します。

    このパラメーターは、モデルをシミュレートするときに、可能な限り Atomic Subsystem を含む代数ループを削除するように Simulink に指示します。

  9. [OK] をクリックします。

  10. [シミュレーション][ブロック線図の更新] をクリックして、並べ替え順序を再計算します。

    これで、サブシステム内部に 2 つのレベルの並べ替え順序、1 と 2 が作成されました。

疑似代数ループを削除するために、Simulink は、サブシステムまたは参照モデルの非直接フィードスルーを作成しようとします。

モデルをシミュレートするとき、すべてのブロックは最初に mdlOutputs メソッドを実行し、その次に mdlDerivatives メソッドと mdlUpdate メソッドを実行します。

元のバージョンの モデルモデルでは、mdlOutputs メソッドの実行は、Plant ブロックで開始します。それは Plant ブロックが非直接フードスルーであるためです。実行は Controller ブロックで終了します。

Atomic Subsystem の [代数ループの発生の最小化] パラメーターを有効にした場合、Simulink によって、サブシステムが 2 つの Atomic Subsystem に分割されます。

次の条件が真であるとします。

  • Atomic Subsystem 2 はフィードスルーではない。

  • Atomic Subsystem 1 には、mdlOutputs メソッドだけがある。

Atomic Subsystem 1 は、Atomic Subsystem 2 の mdlDerivatives メソッドまたは mdlUpdate メソッドにのみ必要です。Simulink は、通常であれば Atomic Subsystem 1 の mdlOutput メソッドの実行中に実行されていたメソッドを、Atomic Subsystem 2 の mdlDerivatives メソッドの中で実行できます。

このモデルの新しい実行順序は次のようになります。

  • モデルの mdlOutputs メソッド

    • Atomic Subsystem 2 の mdlOutputs メソッド

    • 他のブロックの mdlOutputs メソッド

  • モデルの mdlDerivatives メソッド

    • Atomic Subsystem 1 の mdlOutputs メソッド

    • Atomic Subsystem 2 の mdlDerivatives メソッド

    • 他のブロックの mdlDerivatives メソッド

[代数ループの発生の最小化] の手法が成功するためには、Inport に直接接続された非直接フィードスルー ブロックがサブシステムまたは参照モデルになければなりません。それによって、Simulink は、ブロック Inport の DirectFeedthrough プロパティを false に設定して、入力端子に直接フィードスルーがないことを指示できます。

Simulink が疑似代数ループを削除できないとき-  [代数ループの発生の最小化] パラメーターの設定が常にうまく機能するとは限りません。Simulink は、Inport が直接フィードスルー ブロックでのみ Output に接続されている場合には、Atomic Subsystem の Inport の DirectFeedthrough プロパティを変更できません。

以下のモデルモデルを考えます。サブシステム Plant+Controller は代数ループを発生させますが、余分な Gain ブロックと出力があります。

Simulink は、Atomic Subsystem の出力は Controller ブロックの出力によって異なるため、Controller ブロックの mdlOutputs メソッドを Atomic Subsystem 1 の mdlDerivative メソッドに移動できません。サブシステムを非直接フィードスルーに変更することはできません。

次のモデルモデルで参照されるように、さらに Inport ブロックと Gain ブロックを追加して Atomic Subsystem を再定義することで、疑似代数ループを削除するためにこのモデルを変更することができます。そうすることによって、In1 非直接フィードスルーと In2 直接フィードスルーが作成されるため、代数ループが削除されます。

疑似代数ループをもつ大規模モデルの管理-  代数ループをもつ大規模モデルの場合、MathWorks では次の手法が推奨されます。

  • 不連続または倍精度以外のデータ型を含むループの作成を避けます。Simulink の代数ループ ソルバーは勾配に基づいて動作するため、精度の高い状態で代数制約を解かなければなりません。

  • Atomic Subsystem が直接フィードスルーであるかどうかを明確に識別するためのスキームを作成します。ブロックの色分けやブロックの命名規則など、視覚的にわかりやすいスキームを使用します。

  • モデルのコードを作成する計画がある場合は、すべての Atomic Subsystem の [代数ループの発生の最小化] パラメーターを有効にします。可能であれば、Atomic Subsystem の入力端子が非直接フィードスルーのブロックに直接接続されるようにします。

  • Bus Creator ブロックまたは Mux ブロックを使用して、非直接フィードスルーのパスと直接フィードスルーのパスを結びつけないようにします。その結果発生する疑似代数ループを、Simulink が削除できなくなる可能性があります。代わりに、非直接フィードスルーと直接フィードスルーのオブジェクトを別々のサブシステムにクラスタリングすることを検討します。

    Bus Selector ブロックを使用して、必要な信号のみを Atomic Subsystem に渡します。


[1] Shampine, Lawrence F., M.W.Reichelt, and J.A.Kierzenka. ”Solving Index-1 DAEs in MATLAB and Simulink.”Siam Review.Vol.18,No.3,1999,pp.538–552.

[2] More,J.J.,B.S.Garbow, and K.E.Hillstrom. User guide for MINPACK-1. Argonne, IL:Argonne National Laboratory,1980.

[3] Rabinowitz, Philip, ed. Numerical Methods for Nonlinear Algebraic Equations, New York: Gordon and Breach Science Publishers, 1970.

この情報は役に立ちましたか?