ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

むだ時間の指定

この例では、Control System Toolbox™ で、有限個の遅延をもつ任意の LTI モデルを表現し、操作し、解析する方法を示します。遅延は、システム入力または出力、特定の I/O ペアの間またはモデルの内部 (フィードバック ループ内) において起きることがあります。

LTI モデルのむだ時間

伝達関数 (TF)、零点-極-ゲイン (ZPK)、および周波数応答データ (FRD) オブジェクトは、遅延のモデル化のための次の 3 つのプロパティをもちます。

  • 入力の遅延を指定する InputDelay

  • 出力の遅延を指定する OutputDelay

  • 各 I/O ペアに対する独立した転送遅延を指定する IODelay

状態空間 (SS) オブジェクトも、遅延に関する次の 3 つのプロパティをもちます。

  • 入力の遅延を指定する InputDelay

  • 出力の遅延を指定する OutputDelay

  • モデルを組み合わせるか、フィードバック ループを閉じるときの遅延を記録する InternalDelay

状態空間表現は内部の遅延を記録できるため、制御システムでの遅延の効果のモデル化と解析に最適です。このチュートリアルでは、遅延をもつシステムの作成方法と取り扱い方法を説明します。遅延の効果の解析方法の詳細は、「遅延をもつ制御システムの解析」チュートリアルを参照してください。

1 次モデルにむだ時間を付加したモデル

1 次モデルにむだ時間を追加したモデルは、一般的にプロセス制御アプリケーションで使用します。以下はその一例です。

$$P(s) = {5 e^{-3.4 s} \over s+1} $$

この伝達関数を指定するには、以下を使用します。

num = 5;
den = [1 1];
P = tf(num,den,'InputDelay',3.4)
P =
 
                  5
  exp(-3.4*s) * -----
                s + 1
 
Continuous-time transfer function.

予期されたように、P のステップ応答は、遅延のない応答がシフトしたものです。

P0 = tf(num,den);
step(P0,'b',P,'r')

以下のようにプロセス モデルに複数の出力がある場合は、

$$P(s) = \left[\matrix{{5 e^{-3.4 s} \over s+1} \cr {-2 e^{-2.7 s} \over s+3} }\right] , $$

OutputDelay プロパティを使用して、出力チャネルごとに異なる遅延を指定できます。

num = {5 ; -2};
den = {[1 1] ; [1 3]};
P = tf(num,den,'OutputDelay',[3.4 ; 2.7])
P =
 
  From input to output...
                       5
   1:  exp(-3.4*s) * -----
                     s + 1
 
                      -2
   2:  exp(-2.7*s) * -----
                     s + 3
 
Continuous-time transfer function.

次に、以下のような多入力、多出力のモデルを考えます。

$$P(s) = \left[\matrix{{5 e^{-3.4 s} \over s+1} & 1 \cr {-2 e^{-2.7 s} \over s+3} & {e^{-0.7 s} \over s} }\right] . $$

ここでは遅延は I/O ペアごとに異なるため、IODelay プロパティを使用しなければなりません。

num = {5 , 1; -2 1};
den = {[1 1] , 1; [1 3], [1 0]};
P = tf(num,den,'IODelay',[3.4  0;2.7 0.7]);

このモデルをさらに直接的にリテラル値を使用して指定するには、ラプラス変数 "s" を導入し、伝達関数演算を使用します。

s = tf('s');
P = [ 5*exp(-3.4*s)/(s+1) , 1 ; -2*exp(-2.7*s)/(s+3) , exp(-0.7*s)/s ]
P =
 
  From input 1 to output...
                       5
   1:  exp(-3.4*s) * -----
                     s + 1
 
                      -2
   2:  exp(-2.7*s) * -----
                     s + 3
 
  From input 2 to output...
   1:  1
 
                     1
   2:  exp(-0.7*s) * -
                     s
 
Continuous-time transfer function.

この場合は、InputDelay、OutputDelay および IODelay プロパティ間で遅延を分散する方法が MATLAB® によって自動的に決定されます。

P.InputDelay
P.OutputDelay
P.IODelay
ans =

     0
     0


ans =

         0
    0.7000


ans =

    3.4000         0
    2.0000         0

関数 totaldelay は、入力値、出力値および I/O 遅延値を合計して、入力された値に対し返します。

totaldelay(P)
ans =

    3.4000         0
    2.7000    0.7000

入力遅延と出力遅延をもつ状態空間モデル

次の状態空間モデルを考えます。

$$ {dx \over dt} = - x(t) + u(t-2.5) , \;\; y(t) = 12 x(t) . $$

入力信号 u(t) が 2.5 秒遅れていることに注目してください。このモデルを指定するには、以下のように入力します。

sys = ss(-1,1,12,0,'InputDelay',2.5)
sys =
 
  A = 
       x1
   x1  -1
 
  B = 
       u1
   x1   1
 
  C = 
       x1
   y1  12
 
  D = 
       u1
   y1   0
 
  Input delays (seconds): 2.5 
 
Continuous-time state-space model.

関連モデルは次のとおりです。

$$ {dx_1 \over dt} = - x_1(t) + u(t) , \;\; y(t) = 12 x_1(t-2.5) . $$

ここでは、出力に 2.5 秒の遅延が発生しています。これは次のように状態方程式を書き直すことで確認できます。

$$ {dx_1 \over dt} = - x_1(t) + u(t) , \;\; y_1(t) = 12 x_1(t) , \;\;
y(t) = y_1(t-2.5) . $$

したがって、このモデルは次のように指定できます。

sys1 = ss(-1,1,12,0,'OutputDelay',2.5);

以下で確認できるように、どちらのモデルの I/O 応答も同じであることに注目してください。

step(sys,'b',sys1,'r--')

ただし、状態軌跡は異なります。状態 x および状態 x1 は次のように関連付けられているためです。

$$ x(t) = x_1 (t-2.5) $$

モデルと I/O 遅延の組み合わせ

これまでは、特定の I/O ペアの間の転送遅延をもつ LTI モデルのみを考えてきました。多くのプロセスのモデル化ではこれで十分ですが、遅延をもつ単純なフィードバック ループを含む、遅延をもつほとんどの制御システムを解析する場合、このクラスのモデルは特殊すぎます。たとえば、次の並列接続を考えます。

$$ H(s) = H_1(s) + H_2(s) = {1 \over s+2} + {5 e^{-3.4 s} \over s+1} $$

次の伝達関数が生成されます。

$$ H(s) = {s + 1 + (5 s + 10) e^{-3.4 s} \over (s+1)(s+2) } $$

この伝達関数を入力または出力に遅延をもつ通常の伝達関数として表すことができません。 $H(s)$ を表すには、状態空間表現に変更して「内部遅延」という概念を使用しなければなりません。状態空間 (SS) モデルには、システムの接続時に遅延を記録する機能があります。遅延の場所、および残りのダイナミクスとの結合に関する構造的な情報は、効率的かつ完全に一般化された方法でエンコードされます。伝達関数 $H_1(s)$ および $H_2(s)$ を加算すると、 $H(s)$ の状態空間表現が自動的に計算されます。

H1 = 1/(s+2);
H2 = 5*exp(-3.4*s)/(s+1);
H = H1 + H2
H =
 
  A = 
       x1  x2
   x1  -2   0
   x2   0  -1
 
  B = 
       u1
   x1   1
   x2   2
 
  C = 
        x1   x2
   y1    1  2.5
 
  D = 
       u1
   y1   0
 
  (values computed with all internal delays set to zero)

  Internal delays (seconds): 3.4 
 
Continuous-time state-space model.

次の点に注目してください。

  • 遅延値 3.4 は "内部" として示されています。

  • A、B、C、D のデータは、すべての遅延がゼロに設定されているとき (ゼロ次パデ近似) のダイナミクスに対応しています。

内部遅延をもつモデルの伝達関数を確認することは不可能であり、推奨もできません。代わりに時間プロットと周波数プロットを使用してモデルを比較し、検証してください。

step(H1,H2,H)
legend('H1','H2','H','Location','NorthWest'), grid

bode(H1,'b',H-H2,'r--')  % verify that H-H2 = H1
grid

内部遅延をもつモデルの作成

通常、内部遅延をもつ状態空間モデルは、A、B、C、D データと内部遅延のセットの両方を指定して作成されません。その代わりに、より簡単な LTI モデル (I/O 遅延をもつモデル) を直列、並列、フィードバックで接続して、そのようなモデルを作成します。含まれる遅延の数や LTI モデルの接続方法に制限はありません。

たとえば、以下の制御ループを考えます。このプラントは、1 次モデルにむだ時間を付加してモデル化されています。

図 1: 遅延をもつフィードバック ループ

状態空間表現を使用すると、r から y への閉ループ応答に対してモデル T を導出して、以下によりシミュレートできます。

P = 5*exp(-3.4*s)/(s+1);
C = 0.1 * (1 + 1/(5*s));
T = feedback(P*C,1);

step(T,100)
grid, title('Closed-loop step response')

より複雑な相互接続には、各ブロックの入力信号と出力信号に名前を付け、connect を使用して、配線を自動管理できます。たとえば、図 1 の制御ループにフィードフォワードを加えたいとします。

図 2: フィードフォワードおよびフィードバック制御

対応する閉ループモデル T を以下により導くことができます。

F = 0.3/(s+4);
P.u = 'u';  P.y = 'y';
C.u = 'e';  C.y = 'uc';
F.u = 'r';  F.y = 'uf';
Sum1 = sumblk('e = r-y');
Sum2 = sumblk('u = uf+uc');
Tff = connect(P,C,F,Sum1,Sum2,'r','y');

さらに、その応答をフィードバックのみの設計と比較します。

step(T,'b',Tff,'r',100)
legend('No feedforward','Feedforward')
grid, title('Closed-loop step response with and without feedforward')

遅延の項をもつ状態空間方程式

遅延をもつ特別なクラスの LTI モデルに、遅延の項をもつ状態空間方程式があります。一般的な形式は次のとおりです。

$$ {dx \over dt} = A x(t) + B u(t) + \sum_j ( A_j x(t-\tau_j) + B_j u(t-\tau_j) ) $$

$$ y(t) = C x(t) + D u(t) + \sum_j ( C_j x(t-\tau_j) + B_j u(t-\tau_j) ) $$

関数 delayss は、このようなモデルを指定するのに役立ちます。たとえば、次のモデルを考えてください。

$${dx \over dt} = -x(t) - x(t-1.2) + 2 u(t-0.5) , \;\; y(t) = x(t-0.5) + u(t) $$

このモデルを作成するには、各遅延に対して Aj,Bj,Cj,Dj を指定し、delayss を使用してモデルを組み立てます。

DelayT(1) = struct('delay',0.5,'a',0,'b',2,'c',1,'d',0);   % tau1=0.5
DelayT(2) = struct('delay',1.2,'a',-1,'b',0,'c',0,'d',0);  % tau2=1.2
sys = delayss(-1,0,0,1,DelayT)
sys =
 
  A = 
       x1
   x1  -2
 
  B = 
       u1
   x1   2
 
  C = 
       x1
   y1   1
 
  D = 
       u1
   y1   1
 
  (values computed with all internal delays set to zero)

  Internal delays (seconds): 0.5  0.5  1.2 
 
Continuous-time state-space model.

A、B、C、D の値はゼロに設定されているすべての遅延に対するものです。これらの値の応答が、遅延をもつ実際の応答に近くなる必要はありません。

step(sys,'b',pade(sys,0),'r')

遅延をもつ離散時間モデル

離散時間の遅延は同様に取り扱われますが、わずかな違いがいくつかあります。

  • 離散時間の遅延は、通常、サンプリング周期の整数倍です。

  • 離散時間の遅延は、z=0 での極と等価です。したがって、モデル ダイナミクスに遅延を取り込むことは常に可能です。ただし、遅延を分離しておくと、性能はより良くなります。特に、サンプリング周期に比べて長い遅延をもつシステムでは、性能が向上します。

次の 1 次モデル

$$ H(z) = z^{-25} { 2 \over z - 0.95 } $$

を Ts=0.1 のサンプリング周期で指定するには、以下を使用します。

H = tf(2,[1 -0.95],0.1,'inputdelay',25)
step(H)
H =
 
               2
  z^(-25) * --------
            z - 0.95
 
Sample time: 0.1 seconds
Discrete-time transfer function.

以下は、等価な状態空間表現です。

H = ss(H)
H =
 
  A = 
         x1
   x1  0.95
 
  B = 
       u1
   x1   2
 
  C = 
       x1
   y1   1
 
  D = 
       u1
   y1   0
 
  Input delays (sampling periods): 25 
 
Sample time: 0.1 seconds
Discrete-time state-space model.

遅延は極とは別に保持されることに注意してください。次に、g が純粋なゲインである以下のフィードバックループを考えます。

図 3: 離散時間フィードバック ループ

g=0.01 に対する閉ループ応答を計算するには、以下のように入力します。

g = .01;
T = feedback(g*H,1)
step(T)
T =
 
  A = 
         x1
   x1  0.93
 
  B = 
       u1
   x1   2
 
  C = 
         x1
   y1  0.01
 
  D = 
       u1
   y1   0
 
  (values computed with all internal delays set to zero)

  Internal delays (sampling periods): 25 
 
Sample time: 0.1 seconds
Discrete-time state-space model.

T は、なお 25 サンプルの内部遅延をもつ 1 次モデルです。比較のために、absorbDelay を使用して、すべての遅延を z=0 での極にマップします。

T1 = absorbDelay(T);
order(T1)
ans =

    26

結果のモデルは 26 個の状態をもつので、シミュレーションの効率は悪くなります。TT1 のステップ応答は、予想どおり完全に一致します。

step(T,'b',T1,'r--')

一般に、内部遅延をもつモデルの閉ループ ダイナミクスを解析する場合を除いて、遅延は分離しておくことが推奨されます。

rlocus(H)
axis([-1 2 -1 1])

内部遅延をもつ内部状態空間モデル

状態空間オブジェクトは、内部遅延を記録するために一般化された状態空間方程式を使用します。概念的に、そのようなモデルは、2 つの相互接続した部分から構成されます。

  • 拡張された I/O セットをもつ通常の状態空間モデル H(s)

  • 内部遅延の列

図 4: 内部遅延をもつ状態空間モデルの内部表現

対応する状態空間方程式は次のとおりです。

$$\matrix{ \dot{x}(t) = A x(t) + B_1 u(t) + B_2 w(t) \;\;\;\; \cr
           y(t) = C_1 x(t) + D_{11} u(t) + D_{12} w(t) \cr
           z(t) = C_2 x(t) + D_{21} u(t) + D_{22} w(t) \cr
           w_j(t) = z_j(t - \tau_j) , \;\; j = 1,...,N } \;\;\;\; \;\;\;\; $$

ツールを使用するために、この内部表現に気を使う必要はありません。ただし、何らかの理由で H または行列 A、B1、B2、... を抽出する場合は、getDelayModel を使用できます。次に例を示します。

P = 5*exp(-3.4*s)/(s+1);
C = 0.1 * (1 + 1/(5*s));
T = feedback(P*C,1);

[H,tau] = getDelayModel(T,'lft');
size(H)
State-space model with 2 outputs, 2 inputs, and 2 states.

H は 2 入力 2 出力モデルで、T は SISO であることに注意してください。逆の操作 (Htau を組み合わせて T を作成) は setDelayModel で実行されます。

この情報は役に立ちましたか?