Main Content

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

代数ループの削除

モデル内の代数ループを削除するには、以下の方法を使用します。

遅延の導入による代数ループの削除

この例では、ループ内のブロック間に遅延を導入することで代数ループを削除する方法を示します。これは、atomic サブシステム間のフィードバックが原因で、代数ループが発生する可能性のある大規模なモデルで代数ループを削除する 1 つの方法です。

この例に付加されているモデルについて考えます。モデルの atomic サブシステムに起因する代数ループが 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 つの方法があります。

  • Unit Delay を Blackbox ABlackbox C との間に追加する。

  • Unit Delay を Blackbox BBlackbox C との間に追加する。

  • 両方の代数ループに Unit Delay ブロックを追加する。

単位遅延を BlackBox ABlackBox C との間に追加

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

単位遅延を BlackBox BBlackBox C との間に追加

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

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

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

代数ループの手動解法

Simulink® が解を求めることのできない代数ループがあると、エラーが報告されます。ループの解を手動で求めるには、以下のいずれかの手法を使用します。

IC ブロックと Algebraic Constraint ブロックを使った初期推定の作成

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

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

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

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

方法 Simulink による疑似代数ループ削除の方法

[代数ループの発生の最小化] を有効にすると、Simulink は疑似代数ループを削除しようとします。この例では、モデルに、疑似代数ループの原因となる Atomic Subsystem が含まれています。

Atomic Subsystem の内容は直達ではありませんが、Simulink は Atomic Subsystem を直達と判断します。

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

この代数ループを削除するには、次の手順に従います。

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

  2. [モデル コンフィギュレーション パラメーター] の [診断] パネルで [代数ループ] パラメーターを [警告] または [なし] に設定します。

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

  4. このモデルと atomic サブシステムのブロック実行順序を表示するには、[デバッグ] タブで [情報のオーバーレイ][実行順序] を選択します。

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

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

    メモ

    ブロックの実行順序の詳細については、実行順序の制御と表示を参照してください。

  5. 最上位モデルの [Subsystem のパラメーター] ダイアログ ボックスで、[代数ループの発生の最小化] を選択します。このパラメーターは、モデルをシミュレートするときに、可能な限り Atomic Subsystem を含む代数ループを削除するように Simulink に指示します。変更内容を保存します。

  6. [モデル化] タブで [モデルの更新] をクリックして実行順序を再計算します。

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

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

モデルをシミュレートする場合、すべてのブロックは以下の順序でメソッドを実行します。

  1. mdlOutputs

  2. mdlDerivatives

  3. mdlUpdate

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

これらのメソッドの詳細については、Simulink モデルを参照してください。

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

以下の条件が満たされています。

  • Atomic unit 2 は直達ではない。

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

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

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

  1. モデルの mdlOutputs メソッド

    1. Atomic unit 2 の mdlOutputs メソッド

    2. 他のブロックの mdlOutputs メソッド

  2. モデルの mdlDerivatives メソッド

    1. Atomic unit 1 の mdlOutputs メソッド

    2. Atomic unit 2 の mdlDerivatives メソッド

    3. 他のブロックの mdlDerivatives メソッド

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

Atomic Subsystem によって発生した疑似代数ループの削除

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

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

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

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

  3. [Atomic サブシステムとして扱う] パラメーターをクリアします。

  4. 変更内容を保存します。

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 サブシステムと Gain および Compare to Constant ブロックが Simulink が解けない代数ループの一部を形成しています。

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

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

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

ヒント

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

Simulink が疑似代数ループを削除できないとき

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

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

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

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

関連するトピック