古典制御へのMATLABの利用

MATLABにおける伝達関数の基本的な扱い方と,制御理論への利用についてのチュートリアル

 

ここでは,MATLABの "Command Window" に対話的にコマンドを与えることによって,
古典制御の主要な計算を行う方法について説明します.

1 前準備と伝達関数の入力   

1.1 前準備

連続時間の古典制御では,伝達関数をsの関数として表現します.MATLABの "Command Window"に

>> s=tf('s');

のように入力すると(>>はプロンプトなので入力の必要はありません),MATLABは今後sを伝達関数として扱ってくれるので,制御の問題を扱う際には便利です.

また,離散時間の場合zの関数として伝達関数を表現しますが,この場合も同様に

>> z=tf('z',0.01);

としておくと便利です.ただし,0.01はサンプル時間に対応しています.
以降では連続時間の伝達関数のみを扱いますが,MATLABでは

1.2 基本的な伝達関数の入力

先ほどのようにsを伝達関数として定義すると,

  >> G=1/(1+s)^2
 
  Transfer function:
        1
  -------------
  s^2 + 2 s + 1
 
  >>

のように,自然な形で伝達関数を表現することができます.
この実行例ではMATLABの変数Gに伝達関数1/(s+1)^2を代入しています.

  • MATLABは伝達関数と実数の四則演算(+-*/)を扱うことができ,その結果は伝達関数として返されます.
    ただし,数式での慣習と異なり,掛け算を省略すること出来ません.つまり,2sは2*sと書く必要があります.
  • べき乗は記号^で表現します.たとえば,(s+1)^3はs+1の3乗を表しています.
  • MATLABのコマンドは最後にセミコロン(;)をつけると結果の出力を行わず,
    セミコロンを省略すると結果を"Command Window"に出力します.

2 基本的な図のプロット

2.1 ボード線図 (bode,bodemag)

MATLABを用いると簡単に伝達関数のボード線図をプロットすることが出来ます.
ボード線図を出力させるために使うコマンドは'bode'です.

  • MATLABでは,
      >> help bode
    のように 'help' に続けてコマンド名を入力することで,そのコマンドの説明を読むことが出来ます.

bode コマンドは

>> bode( 1/(1+s) )

のように,伝達関数を引数として与えることで,その伝達関数のボード線図を表示します.
複数の伝達関数のボード線図を一つのボード線図に描きたい場合には,

>> bode( 1/(1+s)  ,  1/(1+s)^2 )

のように二つの伝達関数をカンマ(,)で区切って引数として与えます.

また,ゲイン特性のみが必要な場合には bode のかわりに bodemag コマンドを用います.

2.2 安定余裕 (margin,allmargin)

ループ伝達関数の安定余裕を図で見るためには,margin コマンドが便利です.
例えば,

  >> P=1/(1+s);
  >> K=2;
  >> L=P*K;
  >> margin(L)

のようなコマンドを与えることで,制御器KとプラントPで構成される単位フィードバック系の開ループゲインのボード線図を表示し,位相余裕とゲイン余裕を図示してその値を表示してくれます.

2.3 ステップ応答 (step)

伝達関数のステップ応答を得るためには 'step' コマンドを用います.step コマンドに

  >> step( 1/(1+s) )

のように,伝達関数を与えることで,与えられた伝達関数の単位ステップ応答がプロットされます.
また,複数の伝達関数を同じ図にプロットしたい場合には,

  >> step( 1/(1+s) , 1/(1+2*s) )

のように二つの伝達関数を引数として指定します.

2.4 極零配置 (pzmap)

伝達関数の極とゼロ点の配置を複素平面上にプロットするためには 'pzmap' コマンドを用います.

  >> pzmap( (s-1)/(1+s) )

のように,伝達関数を引数として与えると,極を x ゼロ点を o で複素平面上にプロットした図を表示します.

2.5 根軌跡 (rlocus)

開ループ伝達関数から根軌跡を描くためのコマンドは 'rlocus' です.

  >>rlocus( (s-1)/(1+s)^2 )

のように,開ループ伝達関数を引数に与えます.

3 伝達関数の特性の計算

3.1 極 (pole)

伝達関数の極を表示するコマンドは 'pole' です.

  >> pole(1/(s+1)^2/(s+2))

  ans =

    -2.0000         
    -1.0000 + 0.0000i
    -1.0000 - 0.0000i

  >>

のように,伝達関数を引数として与えると,その極を返します.重根はその多重度の数だけ値が返ります.

3.2 ゼロ点 (zero)

伝達関数の零点を表示するコマンドは 'zero' です.

  >> zero((s+1)*(s+3)^3/(s+1)^2/(s+2))

  ans =

    -3.0000         
    -3.0000 + 0.0000i
    -3.0000 - 0.0000i
    -1.0000         

  >>

のように,伝達関数を引数として与えると,その零点を返します.極の場合と同様に,その多重度の数だけ値が返ります.

3.3 開ループ伝達関数による安定性の分析

開ループ伝達関数から閉ループ系の安定性についての情報を得るためには allmargin コマンドを用いる事が出来ます.

  >> P=1/(s^3+3*s^2+3*s+1);
  >> K=5;
  >> L=P*K
 
  Transfer function:
            5
  ---------------------
  s^3 + 3 s^2 + 3 s + 1
 
  >> allmargin(L)

  ans =

       GainMargin: 1.6002
      GMFrequency: 1.7322
      PhaseMargin: 17.3704
      PMFrequency: 1.3870
      DelayMargin: 0.2186
      DMFrequency: 1.3870
           Stable: 1

  >>

のように開ループ系の伝達関数引数として与えることで,位相余裕やゲイン余裕,さらに遅れに対するマージンも表示し,ゲイン交差が複数ある場合でもそれぞれに対するゲイン余裕を返してくれます.また,最後のStableの項は安定なら1,不安定なら0になります.