Simulinkモデルのシミュレーション中に、’代数ループ(algebraic loop)’に関する警告が出力されました。代数ループとは何ですか?また、その回避方法はありますか?
128 次查看(过去 30 天)
显示 更早的评论
MathWorks Support Team
2013-11-7
编辑: MathWorks Support Team
2020-1-21
Simulinkモデルのシミュレーション中に、’代数ループ(algebraic loop)’に関する警告が出力されました。代数ループとは何ですか?また、その回避方法はありますか?
(警告メッセージ)
警告: ブロック線図'delay'は1の代数ループを含んでいます。ループについてより詳細を参照するには、MATLABコマンドウィンドウで"sldebug delay"とタイプしてコマンドラインのSimulink デバッガを使います。このメッセージを消去するためには、シミュレーションパラメータダイアログの診断ページの代数ループオプションに"なし"を設定してください.
代数ループが検出されました:
'delay/Sum' (algebraic variable)
采纳的回答
MathWorks Support Team
2013-11-7
编辑:MathWorks Support Team
2020-1-21
この警告はモデル中に代数ループ(Algebraic loop)が存在することを示しており、モデル中に代数ループが存在するとデフォルトでは必ず出力されます。
■代数ループとは?
代数ループ(Algebraic loop)は、代数方程式によって表現されるループのことで、具体的には、直接フィードスルーをもつブロックにおいて自分自身のブロック出力をフィードバックで入力するような場合に生じます。つまり、入力と出力が同タイミングで要求されるような状態です。
下記に簡単なスカラループの例を示します。
数学的にこのループは、Sumブロックの出力が代数状態zで、最初の入力uからzを差し引いたもの(z=u-z)に等しくなるように制約されています。この単純ループの解は z=u/2 ですが、z=u-z をモデル化した上図は代数ループになります。
一般にダイナミクスを数学的に見ると、いくつかの差分方程式(連続システムの場合は常微分方程式)が連立して表現されますが、そのシステム行列がフルランクでなければ、代数方程式ができてしまいます。代数ループが存在していると、直達項を持つシステムのループが存在しているため、系全体の方程式が差分方程式にならず、代数方程式で表現されます。
常微分方程式や差分方程式は、時間に沿って積分計算(数値積分)を行って解きますが、代数方程式は、その時間ごとに収束計算をして解いていきます。つまり、計算法が異なりますので、代数ループがある場合には代数ループ専用のソルバが必要になります。差分方程式と代数方程式では、根本的に解法が異なりますので、これを組み合わせた方程式を解くには、特殊な手法が必要で計算時間がかかってしまいます。このため、理想的には、この様なループが存在しないシステムを構築することが望まれます。Simulinkは警告メッセージとして、代数ループが存在することを示します。
注意 Simulinkでは、代数ループを含むモデルを扱うことができますが、Real-Time Workshop ではサポートされていませんので、ご注意ください。
【対策】
1. 代数ループの回避方法
(a)モデリングをする前に数式表現を「陽的表現」に直す
(b)ちょっとした遅れを与える
2. 代数ループの収束計算の改善(初期値指定)
ICブロックの利用
Alrebraic Constraintブロックの利用
それぞれの方法を次に示します。
1. 代数ループの回避方法
(a) モデリングをする前に数式表現を「陽的表現」に直す
代数ループを回避するため、モデリングする前に数式表現を「陽的表現」(y=…の形)に直します。例えば、先の簡単なスカラループの例で、z=u-zで表現されているモデルでは代数ループが生じてしまいますが、式を陽的表現に変形して z=u/2 としてモデル化すると代数ループは生じません。次の(1)、(2)の数式は同じ式を表します。(1)では代数ループが発生しますが、陽的表現の(2)では代数ループは生じません。
(1) x + 2y + c = y
(2) y = - x - c
このように、y=…の式に式変形してからブロックを組みます。
しかし、上のようなモデルであれば、簡単に陽的表現に変形できますが、微分方程式+代数方程式で表わされる式をこの形に式変形するのは大変な労力を必要とする場合があります。このような場合には次の方法(b)がとられます。
(b) ちょっとした遅れを与える
代数ループが生じているところは、同時に起こる現象をモデル化していますが、微少な遅れがあると仮定し、その遅れをモデル化することで代数ループを回避します。
遅れをモデル化する方法を2つ下記にご紹介します。
- 遅延ブロック(たとえば、Continuous/Transport Delayブロックなど)にて遅れを発生させる方法
- シミュレーションの計算ステップサイズを小さくしておき、メモリブロック(Continuous/Memoryブロック)を挿入して遅れを発生させる方法
モデルの中で、遅延のないフィードバックが接続されている箇所(代数ループが生じているところ)に、明示的にこれらのブロックを挿入し遅れを発生させてください。
またこの時、遅れが大きいと解に影響を与えてしまいますので、与える遅れは、モデルの周波数では無視できるほどの小さな遅れを与えることをお勧めします。
下記の例題1は、代数ループをもつモデルに遅れを与えた例です。ご参照ください。
2. 代数ループの収束計算の改善(初期値指定)
ICブロック、もしくはAlgebraic Constraint ブロック(代数ループ F(z)=0 を解くためのブロック)を指定してください。
代数ループを解くために内部で収束計算を行います。そのための出発点となる初期値を必要とします。初期値は、デフォルト0ですが、できるだけ実際の解に近いと思われる値を入力する必要があります。初期値が適当でないと、予期せぬ値に収束してしまうことがありますので、ご注意ください。この現象を再現している例を例題2に示します。ご参照ください。
代数ループについては、Simulinkドキュメントの"Using Simulink"の「代数ループ」に説明されていますので、詳細に関しましてはこちらをご参照ください。
【例題】
■例題1.遅れを与える例
つぎのような簡単なスカラループがあります。
数学的にこのループは、Sumブロックの出力は代数状態zで、これは最初の入力uからzを差し引いたもの(すなわち、z=u-z)に等しくなるように制約されていることを意味しています。この単純ループの解はz=u/2ですが、ほとんどの代数ループは、計算によって解くことはできません。この代数ループモデルに、Transport Delayブロックを使ってちょっとした遅れを与えると次のようになります。
サンプルファイル delay.mdl は下記リンクよりダウンロード可能です。
※このモデルは、Simulink6.3(R14SP3)で作成しました。
(注意)ファイルのダウンロードはダウンロード対象のリンクを右クリックし「対象をファイルに保存」を選択してダウンロードを行ってください。
outputの上の値が入力信号、下の値が出力信号です。 この時、遅れが大きいと解に影響を与えてしまいます。与える遅れは、モデルの周波数では無視できるほどの小さな遅れを与えてください。
つぎは、Transport Delayブロックの代わりにMemoryブロックを使用し、1積分ステップ分遅れたものを出力させた例です。
サンプルファイル delay2.mdl は下記リンクよりダウンロード可能です。
※このモデルは、MATLAB7.0.1/Simulink6.1(R14SP1)で作成しました。
このように、フィードバック部分に遅延ブロックで微少な遅れを与えることで、代数ループによる問題を回避することができます。
■例題2.初期値の指定の例
この例は、代数ループの収束計算に与える初期値によって解が異なってしまう現象を示したモデルです。
X=y+y^2は、下記のような値を持つ式です。
このように、この式は値に対して、2つのyの値を持ちます。この式をSimulinkで表現すると、次のようになります。
このモデルをシミュレーションすると、下記の代数ループを含んでいる旨のワーニングメッセージが表示されます。
>>警告: ブロック線図'alloop1'は1の代数ループを含んでいます。ループについてより詳細を参照するには、MATLABコマンドウィンドウで"sldebug alloop1"とタイプしてコマンドラインのSimulink デバッガを使います。このメッセージを消去するためには、シミュレーションパラメータダイアログの診断ページの代数ループオプションに"なし"を設定してください.
代数ループが検出されました:
'alloop1/Math Function'
'alloop1/Sum1' (algebraic variable)
この式では、入力xに対して、出力値yとして、2つの値が存在しますが、Simulinkは、収束計算により得られた一方の値を解として出力します。この現象に対して、求めたい方の解を出力させるために、下図のようにICブロック(黄色)を挿入するか Algebraic Constraint ブロックを用いてモデル化します。
サンプルファイル alloop2.mdl は下記リンクよりダウンロード可能です。
※このモデルは、Simulink6.3(R14SP3)で作成いたしました。
サンプルファイル alloop3.mdl は下記リンクよりダウンロード可能です。
※このモデルは、Simulink6.3(R14SP3)で作成いたしました。
たとえば、求めたい解が正の値の解の場合、Algebraic Constraint ブロックの初期値に1を入力します。シミュレーションを実行すると、Simulinikは、yの正の方向から解を探索するため、yの出力は、次のように正の値を出力します。
一方、求めたい解が負の値の場合、Algebraic Constraint ブロックの初期値に-1を入力します。すると、Simulinikは、yの負の方向から解を探索するため、yの出力は、次のように負の値を出力します。
どちらの値も数学的には正しいですが、このように初期値の与え方によって出力が異なってきますので、初期値は求めたい解に近い値を与えるように注意してください。
0 个评论
更多回答(1 个)
Atsushi Matsumoto
2016-9-7
代数ループを回避する方法には複数の選択肢がありますので、その選択基準を示します。
■1. 全体が離散システムの場合
フィードバックループにUnit DelayまたはDelayブロックを使って1サンプル遅延を入れます。
■2. 連続システムまたは連続・離散混在の場合
1サンプルの遅延が大きすぎる場合やフィードバックループが連続信号の場合はDelayブロックによる遅延を入れることができません。連続信号に入れる遅延ブロックとしては、MemoryとTransport Delayブロックがあります。
Memoryブロックは可変ソルバの場合、タイムステップによって遅延時間が変わってしまう恐れがあります。また、遅延時間が把握しにくいのも欠点です。
Transport Delayブロックは遅延時間(パラメータ:時間遅れ)をユーザ設定できるので、より良い選択肢ですが、注意すべき点があります。
- [時間遅れ]がシミュレーションのタイムステップより小さいと、外挿が行われ、出力波形が意図しない結果となることがあります。これを避けるためには、コンフィギュレーションパラメーターのソルバー画面にて、[最大ステップサイズ]を[時間遅れ]のパラメータ値以下にします。
- タイムステップを小さくしすぎると、単位時間当たりの計算回数が多くなり、シミュレーション速度が低下します。
0 个评论
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!