代数ループの削除
モデル内の代数ループを削除するには、以下の方法を使用します。
遅延の導入による代数ループの削除
フィードバック ループによってモデル内に代数ループが生成される可能性があります。このような代数ループを削除するには、Unit Delay ブロックを使用してループに遅延を導入します。
モデル AlgebraicLoopUnitDelay
を開きます。このモデルには A
、B
、C
の 3 つの Atomic サブシステムが含まれています。サブシステム 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 サブシステムは Atomic サブシステムとして実行されるため、どちらも疑似代数ループが形成される可能性があります。これは両者が単一の Outputs
メソッドをもつことを意味しています。モデルまたはサブシステムのすべての出力端子の出力値が単一の Outputs
メソッドで計算されます。ある出力端子の値がいずれかの入力端子の値に依存する場合、そのモデル参照または Atomic サブシステムには直達ありのフラグが設定されます。Model ブロックまたは Atomic サブシステムに直達ありのフラグが設定されている場合に、ループに直達パスが含まれていないか接続されていないと、疑似代数ループが発生します。
より大幅な変更をモデルに加えないとソフトウェアですべての疑似代数ループを削除することはできませんが、参照モデルと Atomic サブシステムにはどちらも、そのモデルまたはサブシステムが関係する疑似代数ループを最小限に抑えるためのパラメーターがあります。疑似代数ループの発生を最小限に抑えるための方法は、ループが参照モデルと Atomic サブシステムのどちらで形成されるかによって異なります。
疑似代数ループの発生源 | [疑似代数ループの発生の最小化] パラメーターの有効化 |
---|---|
参照モデル |
|
Atomic サブシステム |
|
[疑似代数ループの発生の最小化] パラメーターを有効にすると、ソフトウェアは参照モデルまたは Atomic サブシステムを別の実行順序でコンパイルすることで、そのモデルまたはサブシステムが関係する疑似代数ループを削除するように試行します。たとえば、次のモデルを考えてみます。このモデルには、疑似代数ループを形成する Atomic サブシステムが含まれています。代数ループの強調表示における点線は、そのループが疑似的なものであることを示します。
サブシステムの入力端子は Gain ブロックに接続しており、そのブロックが Transfer Fcn ブロックに接続します。Transfer Fcn ブロックはサブシステムの出力端子に接続しています。Transfer Fcn ブロックに直達がないため、この Atomic サブシステムに入力端子から出力端子への直達パスはありません。サブシステムの内容に直達はありませんが、ソフトウェアによって Atomic システムに直達ありのフラグが設定されるため、このループは人為的になります。
[疑似代数ループの発生の最小化] パラメーターを有効にする前と有効にした後のモデルの実行順序を表示することで、Atomic サブシステムに対してこのパラメーターを有効にした場合の効果を確認することができます。Atomic サブシステムの [疑似代数ループの発生の最小化] パラメーターが無効になっている場合、最初に Step ブロックが実行され、疑似代数ループを解決するために、Atomic Subsystem と Sum ブロックが含まれる非表示のサブシステムが挿入されます。
Atomic サブシステムの内容の実行順序を確認するために、Atomic サブシステムの内部に移動します。Atomic サブシステムでは、最初に Gain ブロックが実行され、2 番目に Transfer Fcn ブロックが実行されます。
Atomic サブシステムの [疑似代数ループの発生の最小化] パラメーターを有効にすると、モデルの実行順序が変わります。Atomic サブシステムを含むモデルの最上位に疑似代数ループは存在しなくなったため、疑似代数ループを解決するための非表示のサブシステムは挿入されません。最初に Step ブロックを実行する代わりに、先に Subsystem ブロックが実行されます。
Atomic サブシステムの内部で非表示のサブシステムが挿入されます。このサブシステムには、疑似代数ループの入力端子と疑似代数ループの出力端子までのパスに直達がない最初のブロックとの間にあるブロックが含まれます。このモデルでは、非表示のサブシステムに Gain ブロックが含まれています。[Minimize artificial algebraic loops] パラメーターが有効な場合、疑似代数ループを形成した出力の依存関係を除外した実行順序がソフトウェアで判別されます。
未解決の疑似代数ループの特定
場合によっては、Output
メソッド内の疑似代数ループを形成する依存関係をソフトウェアで削除できないことがあります。たとえば、次の場合はソフトウェアで疑似代数ループを削除できません。
疑似代数ループの一部である直達パスにある信号がログ記録用にマークされているか、参照モデルまたは Atomic サブシステムでテスト ポイントとして指定されている。
疑似代数ループの一部である入力端子にループの一部でない出力端子への直達パスがある。
代数ループの一部である入力端子にループの一部である出力端子への直達パスがある場合は、そのループは人為的ではありません。
既定では、[疑似代数ループの発生の最小化] パラメーターを有効にする参照モデルまたは Atomic サブシステムがソフトウェアで削除できない疑似代数ループの一部である場合、ソフトウェアから警告が発行されます。モデルの [代数ループの最小化] コンフィギュレーション パラメーターを使用して、この状況でエラーを発行するように構成したり、診断を発行しないように構成したりすることもできます。
Atomic サブシステムによって発生した未解決の疑似代数ループの削除
Atomic サブシステムが関係する疑似代数ループをソフトウェアで削除できない場合、サブシステムを Atomic ではなくバーチャルにすることで疑似代数ループを削除できます。サブシステムを Atomic からバーチャルに変換すると、シミュレーション時にサブシステムの内容を実行する方法が変わります。詳細については、サブシステムが Atomic かどうかの指定およびバーチャル サブシステムおよび非バーチャル サブシステムを参照してください。
Atomic サブシステムをバーチャル サブシステムに変換するには
その Atomic サブシステムを含むモデルを開きます。
Atomic サブシステムを右クリックし、[Subsystem のパラメーター] を選択します。
[Atomic サブシステムとして扱う] パラメーターをクリアします。
変更内容を保存します。
疑似代数ループを作成するバンドルされた信号
モデルによっては複数の信号をまとめて一緒にするものがあります。これをまとめたために、代数制約が存在しないにもかかわらず 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 ブロックは必要でなくなります。
ブロック削減と疑似代数ループ
[モデル コンフィギュレーション パラメーター] の [ブロック削減] の最適化を有効にすると、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 で削除できません。この 警告を回避するため、 [Minimize artificial algebraic loop occurrences] パラメーターをクリアすることを検討してください。
ヒント
Bus Selector ブロックを使用して、必要な信号のみを Atomic サブシステムに渡します。