代数ループの削除
モデル内の代数ループを削除するには、以下の方法を使用します。
遅延の導入による代数ループの削除
この例では、ループ内のブロック間に遅延を導入することで代数ループを削除する方法を示します。これは、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 A
とBlackbox C
との間に追加する。
Unit Delay を
Blackbox B
とBlackbox C
との間に追加する。
両方の代数ループに Unit Delay ブロックを追加する。
単位遅延を 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
の前に Unit Delay ブロックを挿入することにより、Blackbox C
は前のタイム ステップのデータのみを使用して処理するようになります。
両方の代数ループに単位遅延を追加
ここに示す例では、Unit Delay ブロックを挿入して両方の代数ループを解除します。このモデルでは、BlackBox_A と BlackBox_B では、前のタイム ステップのデータが使用されます。BlackBox_C では、現在のタイム ステップのデータが使用されます。
代数ループの手動解法
Simulink® が解を求めることのできない代数ループがあると、エラーが報告されます。ループの解を手動で求めるには、以下のいずれかの手法を使用します。
微分や座標の変更といった技法を使用して、基本となる DAE を再構成します。これらの技法では、代数ループ ソルバーが処理しやすい形式で DAE が構成されます。
DAE を ODE に変換すると、代数ループが削除されます。
IC ブロックと Algebraic Constraint ブロックを使った初期推定の作成
代数状態の良好な初期推定がないと代数ループ ソルバーが収束できないループがモデルに含まれている可能性があります。代数状態変数には初期推定を指定できますが、ループが適正と考えられるときにのみこの技法を使用してください。
初期推定の指定方法には次の 2 つがあります。
代数ループの中に IC ブロックを配置する。
Algebraic Constraint ブロックを使用して代数ループの信号に初期推定を指定する。
方法 Simulink による疑似代数ループ削除の方法
[代数ループの発生の最小化] を有効にすると、Simulink は疑似代数ループを削除しようとします。この例では、モデルに、疑似代数ループの原因となる Atomic Subsystem が含まれています。
Atomic Subsystem の内容は直達ではありませんが、Simulink は Atomic Subsystem を直達と判断します。
[代数ループ] 診断が [エラー]
に設定されている場合は、モデルには Atomic Subsystem に関与する疑似代数ループが含まれているため、シミュレートするとエラーになります。
この代数ループを削除するには、次の手順に従います。
上図からモデルを作成します。疑似代数ループの原因となる Atomic Subsystem が含まれています。
[モデル コンフィギュレーション パラメーター] の [診断] パネルで [代数ループ] パラメーターを
[警告]
または[なし]
に設定します。このモデルと atomic サブシステムのブロック実行順序を表示するには、[デバッグ] タブで [情報のオーバーレイ] 、 [実行順序] を選択します。
実行順序を確認しておくと、疑似代数ループを削除する方法を理解するのに役立ちます。
サブシステムのすべてのブロックは同じレベルで実行されます。ここでは 1 です(最下位レベルは 0 で、最初に実行されるブロックを表します)。
メモ
ブロックの実行順序の詳細については、実行順序の制御と表示を参照してください。
最上位モデルの [Subsystem のパラメーター] ダイアログ ボックスで、[代数ループの発生の最小化] を選択します。このパラメーターは、モデルをシミュレートするときに、可能な限り Atomic Subsystem を含む代数ループを削除するようにソフトウェアに指示します。
変更内容を保存します。
[モデル化] タブで [モデルの更新] をクリックして実行順序を再計算します。
これで、サブシステム内部に 2 つのレベルの実行順序、1 と 2 が作成されました。
疑似代数ループを削除するために、サブシステムまたはモデル参照が直達をもたないように実行順序の調整が試行されます。
モデルをシミュレートする場合、すべてのブロックは以下の順序でメソッドを実行します。
mdlOutputs
mdlDerivatives
mdlUpdate
元のバージョンのモデルでは、mdlOutputs
メソッドの実行は、Plant ブロックで開始します。それは Plant ブロックに直達がないためです。実行は Controller ブロックで終了します。
これらのメソッドの詳細については、Simulink モデルを参照してください。
Atomic Subsystem の [代数ループの発生の最小化] パラメーターを有効にした場合、サブシステムが 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
メソッドの中で実行できます。
このモデルの新しい実行順序は次のようになります。
モデルの
mdlOutputs
メソッドAtomic unit 2 の
mdlOutputs
メソッド他のブロックの
mdlOutputs
メソッド
モデルの
mdlDerivatives
メソッドAtomic unit 1 の
mdlOutputs
メソッドAtomic unit 2 の
mdlDerivatives
メソッド他のブロックの
mdlDerivatives
メソッド
[代数ループの発生の最小化] の手法が成功するためには、Inport に直接接続された非直達ブロックがサブシステムまたは参照モデルになければなりません。また、テスト ポイントとして指定された信号がこれらに含まれていない必要があります。それによって、ソフトウェアは、ブロック Inport の DirectFeedthrough
プロパティを false
に設定して、入力端子に直達がないことを指示できます。
Atomic Subsystem によって発生した疑似代数ループの削除
Atomic Subsystem によって疑似代数ループが生じた場合は、Atomic Subsystem をバーチャル サブシステムに変換します。サブシステムが Atomic のときにモデルをシミュレートする場合は、Simulink は代数ループ ソルバーを呼び出します。ソルバーは 1 回反復した後で終了します。代数定数がないため、代数ループを自動的に解きます。サブシステムをバーチャルに変更した後は、Simulink はシミュレーション中に代数ループ ソルバーを呼び出しません。
Atomic Subsystem をバーチャル サブシステムに変換するには
その Atomic Subsystem を含むモデルを開きます。
Atomic Subsystem を右クリックし、[Subsystem のパラメーター] を選択します。
[Atomic サブシステムとして扱う] パラメーターをクリアします。
変更内容を保存します。
Atomic Subsystem をバーチャル サブシステムに置き換えても、まだシミュレーションが代数ループ エラーで失敗する場合は、モデルに次のいずれかが存在していないか調べます。
代数制約
Atomic Subsystem が原因ではない疑似代数ループ
疑似代数ループを作成するバンドルされた信号
モデルによっては複数の信号をまとめて一緒にするものがあります。これをまとめたために、代数制約が存在しないにもかかわらず Simulink が代数ループの検出を報告する可能性があります。信号を 1 つ以上リダイレクトすると、疑似代数ループを削除できる場合があります。
この例では、線形化モデルは 1 つのポンプから注入を受ける 2 タンク システムの動作のシミュレーションを行います。このモデルには次の項目が含まれています。
出力
q1
はポンプからタンクへの液体の流速です。出力
h2
は 2 番目のタンク内の液体の高さです。State-Space ブロックはポンプの動作に対するタンク システムの動的反応を次のように定義します。
State-Space ブロックからの出力は
q1
とh2
を含むベクトルです。
このモデルの [代数ループ] パラメーターを [警告]
または [エラー]
に設定してシミュレーションを実行すると、Simulink は代数ループを検出します。
この代数ループを削除するには次のようにします。
行列
C
およびD
を次のように変更します。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 に渡します。