代数ループの削除
モデル内の代数ループを削除するには、以下の方法を使用します。
遅延の導入による代数ループの削除
フィードバック ループによってモデル内に代数ループが生成される可能性があります。このような代数ループを削除するには、Unit Delay ブロックを使用してループに遅延を導入します。
モデル AlgebraicLoopUnitDelay
を開きます。このモデルには A
、B
、C
の 3 つの Atomic Subsystem が含まれています。サブシステム A
からの出力はサブシステム B
の入力で、サブシステム B
からの出力はサブシステム C
の入力です。サブシステム C
からの出力はサブシステム A
とサブシステム B
にフィードバックされ、2 つのフィードバック ループが生成されます。
mdl = "AlgebraicLoop";
open_system(mdl)
モデルに代数ループが含まれているかどうかを判別するには、関数 Simulink.BlockDiagram.getAlgebraicLoops
を使用します。この関数によって代数ループ ビューアーが開き、モデルに真の代数ループが 1 つあることが示されます。
Simulink.BlockDiagram.getAlgebraicLoops(mdl);
関数 Simulink.BlockDiagram.getAlgebraicLoops
はモデル内の代数ループのパスを黄色で強調表示し、代数変数をもつブロックを赤色で強調表示します。モデル AlgebraicLoop
では、フィードバック ループの Gain ブロックはどちらも代数変数として強調表示されています。
一般に、モデルから代数ループを削除するには、各代数変数の前または後に遅延を追加します。この解決法を確認するには、モデル AlgebraicLoopTwoUnitDelays
を開きます。これはモデル AlgebraicLoop
と同じですが、各フィードバック ループの Gain ブロックの後に Unit Delay ブロックが追加されています。
mdl2 = "AlgebraicLoopTwoUnitDelays";
open_system(mdl2)
Unit Delay ブロックによって代数ループが削除されたことを確認するには、関数 Simulink.BlockDiagram.getAlgebraicLoops
を使用します。
Simulink.BlockDiagram.getAlgebraicLoops(mdl2);
No algebraic loops were found.
この Unit Delay ブロックの配置では、サブシステム A
とサブシステム B
は前のタイム ステップのサブシステム C
からの出力を使用します。
このモデルでは、サブシステム B
とサブシステム C
の間に単一の Unit Delay ブロックを追加して代数ループを削除することもできます。この信号パスは両方のフィードバック ループの一部であるため、遅延は両方の代数変数のパスに影響します。この解決法を確認するには、モデル AlgebraicLoopOneUnitDelay
を開きます。
mdl3 = "AlgebraicLoopOneUnitDelay";
open_system(mdl3)
モデルに代数ループが含まれていないことを確認するには、関数 Simulink.BlockDiagram.getAlgebraicLoops
を使用します。
Simulink.BlockDiagram.getAlgebraicLoops(mdl3);
No algebraic loops were found.
この Unit Delay ブロックの配置では、サブシステム C
はサブシステム B
からの出力に対して前のタイム ステップの値を使用し、現在のタイム ステップに対してフィードバック値を生成します。
代数ループの手動解法
ソルバーが解を求めることのできない代数ループがあると、エラーが発生します。ループの解を手動で求めるには、以下のいずれかの手法を使用します。
微分や座標の変更といった技法を使用して、基本となる DAE を再構成します。これらの技法では、代数ループ ソルバーが処理しやすい形式で DAE が構成されます。
DAE を ODE に変換すると、代数ループが削除されます。
適正な代数ループの場合にのみ、ループの代数状態に初期推定を指定すると、代数ループ ソルバーの収束に役立ちます。初期推定は次のいずれかの方法で指定できます。
代数ループの中に IC ブロックを配置する。
Algebraic Constraint ブロックを使用して代数ループの信号に初期推定を指定する。
ソフトウェアによる疑似代数ループ削除の方法
[代数ループの発生の最小化] パラメーターを有効にすると、疑似代数ループの削除が試行されます。この例では、モデルに、疑似代数ループの原因となる Atomic Subsystem が含まれています。
Atomic Subsystem の内容には直達がありませんが、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 に渡します。