Simulinkにおける代数ループについては、以下のURLで提供されているSimulinkユーザーガイドに詳しく記載されています:Simulinkユーザーガイド
基本的に、代数ループは、直接フィードスルー(入力が直接出力に影響を与える特性)を持つ入力ポートが、同じブロックの出力によって駆動される場合に発生します。これは、直接的に発生する場合もあれば、他のブロックを通じたフィードバック経路によって発生する場合もあります。
代数ループは数学的に解くのが難しい問題です。しかし、Simulinkには代数ループを解決するためのソルバー(解決アルゴリズム)が備わっており、これにより反復的に解を求め、正しい結果を得ることが可能です。多くの場合、このソルバーは正しい解を導き出します。例えば、2つの入力(1つは加算、もう1つは減算)を持つ和ブロック(Sum Block)を考えてみましょう。この和ブロックの出力を再び入力の1つにフィードバックすると、代数ループが形成されます。この場合、モデル内のすべてのブロックが直接フィードスルーを含む経路が存在しますが、これは意図的でない場合が多いです。
以下に、代数ループがどのように発生するかを示す簡略化された例を示します。これにより、状況がより明確になるかと思います。
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1739941/c69053cb096a687a540ec04842a1ffff.png)
y(t) = u(t) - y(t)
ご覧の通り、ブロックは出力を計算するためにその出力を解くことができません。このような場合(つまり代数ループ)をSimulinkは検出し、反復ループを使用して解決します。上記の例では、Simulinkは正しい結果を計算します。その結果は以下の通りです:
y(t) = u(t) / 2
方程式が少し複雑になっても、原則は同じです。Simulinkにはこれらの方程式を解くための組み込みソルバーがありますが、すべての問題が解決できるわけではありません。
代数ループが検出された場合、選択肢は2つあります:代数ループをそのままにするか、またはそれを排除するかです。モデルの実行速度が許容範囲内であれば、ループをそのままにしておく方が良いでしょう。実行速度が遅い場合は、代数ループを排除する必要があります。
解決策の一つとして、Simulinkユーザーガイドに記載されている初期条件ブロック(Initial Condition Block)や代数制約ブロック(Algebraic Constraint Block)を使用してループソルバーを支援する方法があります。しかし、これでも不十分な場合があります。その場合は、代数ループを解決し、モデルの設定を変更してループが存在しないようにする必要があります。
多くの場合、システムをモデル化することでループを排除できます。場合によっては、システムの最上位レベルに小さな遅延(離散遅延ブロックまたは連続メモリブロック)を追加することでループを除去できることがあります。ただし、これにより不要な動的特性が追加され、結果に影響を与えることがあります。
ループが積分器(Integrator)を含み、その出力をリセットトリガーまたは外部初期条件としてフィードバックしている場合は、StatePortオプションを使用してループを除去します。StatePortについての詳細は、Simulinkユーザーガイドの積分器ブロック(Integrator Block)に関するヘルプをご参照ください。
Simulinkユーザーガイドのオンライン版は以下のURLからご覧いただけます:
連続代数ループの解決方法についての提案は、以下の投稿をご参照ください: 連続代数ループの解決方法