Main Content

LTI 配列を使用したマルチモード ダイナミクスのシミュレーション

この例では、マルチモード ダイナミクスを示すシステムの線形パラメーター変動 (LPV) 表現を構成する方法を説明します。

はじめに

弾性体が弾性面などに衝突または押し当たることがしばしばあります。たとえば次のような状況です。

  • 硬い表面で跳ね返るゴム ボール。

  • 硬いバネを使用して $90^o$ を超えない程度に拘束されているエンジン スロットル バルブ。

  • ポリウレタン フォーム (粘弾性素材) 製の自動車の座席に座る乗客。

これらの状況では、移動する剛体の運動の示すダイナミクスは、自由に移動する場合と表面と衝突する場合とで異なります。跳ねるボールの場合、質量の運動は自由落下時の剛体のダイナミクスで表すことができます。ボールが衝突し、表面との接触中に変形する場合、ダイナミクスではボールおよび表面の弾性特性を考慮する必要があります。衝突のダイナミクスをモデル化する簡単な方法として、衝突する物体同士で塊となったマス-バネ-ダンパーの記述を使用することがあげられます。2 つの物体の剛比および減衰係数を調整することで、上記のさまざまな状況をモデル化できます。

跳ね返りのダイナミクスのモデル化

図 1 は、システムのマス-バネ-ダンパー モデルを示します。Mass 1 は、重力の影響の下で、自由に落下します。その弾性特性は、剛性定数 $k_1$ と減衰係数 $c_1$ で記述されます。この質量が固定された表面に当たると、衝突により Mass 1 と Mass 2 は共に下に落ちます。Mass 1 が変形して元に戻る間の一定の "滞留時間" の経過後、Mass 2 との接触は完全に失われ、放物運動に従います。つまり、全体のダイナミクスは、質量同士が接触していない場合と質量同士が一緒に動いている場合の 2 つの別個のモードに分けられます。

図 1: 固定された弾性面で跳ね返る弾性体

Mass 1 に固定されたバネの未伸長 (負荷なし) は $a_1$ で、Mass 2 の場合は $a_2$ です。変数 $y_1(t)$ および変数 $y_2(t)$ は、2 つの質量の位置を表します。質量が接触していない場合 ("モード 1")、その運動は次の方程式で決定されます。

$$\ddot{y}_1 = -g$$

$$m_2\ddot{y}_2 + c_2\dot{y}_2 + k_2(y_2-a_2) = -m_2g$$

ここで、初期条件は $y_1(0) = h_1$$\dot{y}_1(0) = 0$$y_2(0) = h_2$$\dot{y}_2(0) = 0$ です。$h_1$ は Mass 1 がそこから最初に落とされる高さです。$h_2 = a_2$ は Mass 2 の初期位置で、そのバネの未伸状態に相当します。

Mass 1 が Mass 2 に接触する場合 ("モード 2")、その変位および速度は連結します。このモードの支配方程式は次のとおりです。

$$m_1\ddot{y}_1 + c_1(\dot{y}_1 - \dot{y}_2) + k_1(y_1-y_2-a_1) = -m_1g$$

$$m_2\ddot{y}_2 + c_2\dot{y}_2 + k_2(y_2-a_2) - c_1(\dot{y}_1 - \dot{y}_2) - k_1(y_1-y_2-a_1) = -m_2g$$

$y_1(t_c) = y_2(t_c)$ であり、$t_c$ は Mass 1 が最初に Mass 2 に触れる時刻です。

LPV 表現

支配方程式は、線形で時不変になります。ただし、異なる運動方程式に対応する 2 種類の動作モードがあります。2 つのモードは、2 次方程式のセットで支配されます。質量の位置と速度を状態変数に選択すると、それぞれのモードは 4 次状態空間方程式で表せます。

状態空間表示では、有効となるモードを決定する特定の条件の関数として変化する係数をもつ単一のシステムとして 2 つのモードを処理することが可能になります。その条件とは、2 つの質量が自由に動くか一緒に動くかということです。線形システムの係数が外的で測定可能なパラメーターによってパラメーター化されるような表現を線形パラメーター変動 (LPV) モデルといいます。LPV モデルの一般的な表現の一例として、特定の条件の下で正しいモデルを選択するためのルールを指示する線形状態空間モデルの配列およびスケジューリング パラメーターのセットを使用することがあげられます。線形モデルの配列はすべて、同じ状態変数を使用して定義しなければなりません。

この例では、2 つの状態空間モデル (各操作モードに 1 つ) が必要になります。また、それぞれのモードを切り替えるスケジューリング変数を定義することも必要です。まず、上記の運動方程式を状態空間形式で記述します。

質量とそのバネ定数の値を定義します。

m1 = 7;     % first mass (g)
k1 = 100;   % spring constant for first mass (g/s^2)
c1 = 2;     % damping coefficient associated with first mass (g/s)

m2 = 20;    % second mass (g)
k2 = 300;   % spring constant for second mass (g/s^2)
c2 = 5;     % damping coefficient associated with second mass (g/s)

g = 9.81;   % gravitational acceleration (m/s^2)

a1 = 12;    % uncompressed lengths of spring 1 (mm)
a2 = 20;    % uncompressed lengths of spring 2 (mm)

h1 = 100;   % initial height of mass m1 (mm)
h2 = a2;    % initial height of mass m2 (mm)

最初のモード: 質量が接触していないときのダイナミクスの状態空間表現。

A11 = [0 1; 0 0];
B11 = [0; -g];
C11 = [1 0];
D11 = 0;

A12 = [0 1; -k2/m2, -c2/m2];
B12 = [0; -g+(k2*a2/m2)];
C12 = [1 0];
D12 = 0;

A1 = blkdiag(A11, A12);
B1 = [B11; B12];
C1 = blkdiag(C11, C12);
D1 = [D11; D12];

sys1 = ss(A1,B1,C1,D1);

2 番目のモード: 質量が接触しているときのダイナミクスの状態空間表現。

A2 = [ 0        1,         0,             0; ...
      -k1/m1,   -c1/m1,    k1/m1,         c1/m1;...
      0,        0,         0,             1; ...
      k1/m2,    c1/m2,     -(k1+k2)/m2,   -(c1+c2)/m2];

B2 = [0; -g+k1*a1/m1; 0; -g+(k2/m2*a2)-(k1/m2*a1)];
C2 = [1 0 0 0; 0 0 1 0];
D2 = [0;0];

sys2 = ss(A2,B2,C2,D2);

ここで、2 つのモデル sys1sys2 を積み重ねてまとめ、状態空間配列を作成します。

sys = stack(1,sys1,sys2);

質量が自由に動くか一緒に動くかに関する情報をスケジューリングで使用します。このパラメーターを "FreeMove" と呼ぶことにし、2 つの質量が自由に動くときは 1、両者が接して一緒に動くときは 0 の値をとるものとします。スケジューリング パラメーター情報は、"SamplingGrid" プロパティを使用することで状態空間配列オブジェクト (sys) に組み込まれます。

sys.SamplingGrid = struct('FreeMove',[1; 0]);

質量同士が接触しているかどうかは、2 つの質量の相対位置で決定されます。$y_1-y_2 > a_1$ の場合、質量は接触していません。

Simulink での LPV モデルのシミュレーション

状態空間配列 sys には、LPV モデルを表現するために必要な情報が含まれます。Control System Toolbox™ のブロック ライブラリの "LPV System" ブロックを使用すると、Simulink® でこのモデルのシミュレーションを実行できます。

事前構成された Simulink モデル LPVBouncingMass.slx を開きます。

open_system('LPVBouncingMass')
open_system('LPVBouncingMass/Bouncing Mass Model','mask')

"Bouncing Mass Model" と呼ばれるブロックは、LPV System ブロックです。そのパラメーターは次のように指定します。

  • [状態空間配列] フィールドで、上で作成した状態空間モデル配列 sys を指定します。

  • [初期状態] フィールドで、2 つの質量の初期位置および速度を指定します。状態ベクトルは $[y_1, \dot{y}_1, y_2, \dot{y}_2]$ です。その値を [h1 0 h2 0]' と指定します。

  • [スケジューリング] タブで、[内挿法] を [Nearest] に設定します。これを選択することで、配列の 2 つのモデルの 1 つのみが任意の時点で有効になります。この例では、2 つの動作モードは相互に排他的になります。

  • [出力] タブで、オプションの出力端子のすべてのチェック ボックスをオフにします。ここでは、2 つの質量の位置のみを観測します。

Constant ブロックは、単位値を出力します。これはモデルへの入力として機能し、LPV ブロックの最初の入力端子から提供されます。このブロックの出力端子は 1 つだけで、2 つの質量の位置を 2 行 1 列のベクトルとして出力します。

LPV ブロックの 2 番目の入力端子は、スケジューリング信号を指定するためのものです。前述のように、この信号はスケジューリング パラメーター "FreeMove" を表し、離散値 0 (質量が接触している) または 1 (質量が接触していない) をとります。このパラメーターの値は、ブロックの出力信号の関数として計算されます。この計算は、背景色がシアンのブロックで実行されます。(分離後の) 2 つの出力の間の差異をとり、その結果を Mass 1 に固定されたバネの未伸長の長さと比較します。結果のブール値は、スケジューリング パラメーター値として機能する double 信号に変換されます。

これで、シミュレーションを実行する準備が整いました。

open_system('LPVBouncingMass/Scope')
sim('LPVBouncingMass')

黄色い曲線は Mass 1 の位置を示し、マゼンタの曲線は Mass 2 の位置を示します。シミュレーションが開始されると、Mass 1 は Mass 2 に衝突するまで自由落下します。衝突すると Mass 2 は押し付けられますがただちに跳ね返り、Mass 1 を押し戻します。2 つの質量は、$y_1 - y_2 < a_1$ である期間中は接触しています。質量が停止するときの質量の平衡値は、重力による静的な整定により決定されます。たとえば、Mass 1 の絶対位置は $a_1 + a_2 -m1*g/k1 - (m2+m1)*g/k2 = 30.43 mm.$ となります。

まとめ

この例では、状態空間モデルの配列とそれに適したスケジューリング変数を使用して線形パラメーター変動モデルを構築する方法を示します。相互に排他的なモードの場合について説明していますが、スケジューリング パラメーターの特定値におけるダイナミクスの動作が複数の線形モデルにより影響を受ける場合でも、同様の手法を使用できます。

LPV System ブロックを使用すると、パラメーター変動システムのシミュレーションが容易になります。このブロックは、さまざまなハードウェア ターゲットのコード生成もサポートします。