next up previous contents index
Next: 複雑なシステムのシミュレーション Up: 連続系システムのシミュレーション Previous: 状態フィードバック制御のシミュレーション (2)

   
動的フィードバック制御のシミュレーション

下に示すようなシステムに動的フィードバックを施す場合の 一般的なシミュレーションを行なう。 関数init_params()はプラントとコントローラのパラメータを設定する 関数であり,関数main()はパラメータと初期状態を設定して シミュレーションを行ない,結果をファイルcont.matに保存する。 diff_eqs()は動的要素の微分方程式を記述するための関数であり, link_eqs()は動的要素の接続関係を記述するための関数である。  


 
図 17.1: 制御対象とコントローラ
¥begin{figure}
¥begin{center}
¥setlength{¥unitlength}{3947sp} %
¥begingroup ¥mak...
...le s-1}{¥strut¥displaystyle s^2-s-2}$ }}}
¥end{picture}¥end{center}
¥end{figure}

ここでは,制御対象と制御器のパラメータを大域変数として宣言する プログラムとパラメータを静的な局所変数として宣言するプログラムを 示す。

ファイルから読み込みやキーボードから入力でパラメータを変更しながら シミュレーションを繰り返す場合は,大域変数を用いる方が都合が良い。 しかし,大域変数はプログラム中の任意の場所で修正される可能性が あり,変数名が衝突するなどの問題があるので, 大規模なプログラムには用いない方が良い。 一方,静的変数はそれが定義された関数内でのみ有効なので,他の関数 の局所変数や大域変数と衝突することがないので大規模プログラムに 有効である。

 


Matrix Ap, bp, cp;     // 制御対象のパラメータ
Matrxi Ac, bc, cc, dc; // 制御器のパラメータ
   
Func void init_params()
{
  // 制御対象のパラメータ
  Ap = [[0  1]
        [2  1]];
  bp = [0 1]';
  cp = [-1, 1];
   
  // 制御器のパラメータ
  Ac = [5];
  bc = [1];
  cc = [54];
  dc = [9];
}

Func void main()
{
  Matrix x0;
  Array TC, XC, UC;
   
  void diff_eqs(), link_eqs(), init_params();

  init_params();

  x0 = [1 0 0]';
  {TC, XC, UC} =
     Ode45Auto(0.0, 20.0, x0, diff_eqs, link_eqs);

  print [[TC][XC][UC]] >> "cont.mat";
}


List 7-1:    動的フィードバック制御のシミュレーション(大域変数使用)



Func void diff_eqs(DX, t, X, UY)
  Real t;
  Matrix X, DX, UY;
{
  Matrix dxp, dxc, xp, xc, up, uc;

  xp = X(1:2,1);          // 制御対象の状態
  xc = X(3:3,1);          // 制御器の状態
  up = UY(1:1,1);         // 制御対象への入力
  uc = UY(2:2,1);         // 制御器への入力

  dxp = Ap*xp + bp*up;    // 制御対象の状態方程式
  dxc = Ac*xc + bc*uc;    // 制御器の状態方程式

  DX = [[dxp][dxc]];
}

Func void link_eqs(UY, t, X)
  Real t;
  Matrix UY, X;
{
  Matrix xp, up, yp, xc, yc, uc;

  xp = X(1:2,1);          // 制御対象の状態
  xc = X(3:3,1)           // 制御器の状態

  yp = cp*xp;             // 制御対象の出力
  uc = yp;                // yp を uc に接続

  yc = cc*xc + dc*uc;     // 制御器の出力
  up = - yc;              // yc を up に接続

  UY = [up uc]';
}


List 7-2:    動的フィードバック制御のシミュレーション(大域変数使用)


Func void main()
{
  Matrix x0;
  Array TC, XC, UC;
   
  void diff_eqs(), link_eqs();

  x0 = [1 0 0]';
  {TC, XC, UC} =
     Ode45Auto(0.0, 20.0, x0, diff_eqs, link_eqs);
  print [[TC][XC][UC]] >> "cont.mat";
}

Func void diff_eqs(DX, t, X, UY)
  Real t;
  Matrix X, DX, UY;
{
  static Integer init;
  static Matrix Ap, bp, Ac, bc;
  Matrix dxp, dxc, xp, xc, up, uc;

  if (init == 0) {
    init = 1;
    Ap = [[0  1]       // 制御対象のパラメータ
          [2  1]];
    bp = [0 1]';
    Ac = [5];          // 制御器のパラメータ
    bc = [1];
  }

  xp = X(1:2,1);          // 制御対象の状態
  xc = X(3:3,1);          // 制御器の状態
  up = UY(1:1,1);         // 制御対象への入力
  uc = UY(2:2,1);         // 制御器への入力
  dxp = Ap*xp + bp*up;    // 制御対象の状態方程式
  dxc = Ac*xc + bc*uc;    // 制御器の状態方程式
  DX = [[dxp][dxc]];
}


List 7-3:    動的フィードバック制御のシミュレーション(静的変数使用)



Func void link_eqs(UY, t, X)
  Real t;
  Matrix UY, X;
{
  static Integer init;
  static Matrix cp, cc, dc;
  Matrix xp, up, yp, xc, yc, uc;

  if (init == 0) {       
    init = 1;
    cp = [-1, 1];  // 制御対象のパラメータ
    cc = [54];     // 制御器のパラメータ
    dc = [9];
 }

  xp = X(1:2,1);          // 制御対象の状態
  xc = X(3:3,1)           // 制御器の状態

  yp = cp*xp;             // 制御対象の出力
  uc = yp;                // yp を uc に接続

  yc = cc*xc + dc*uc;     // 制御器の出力
  up = - yc;              // yc を up に接続

  UY = [up uc]';
}


List 7-4:    動的フィードバック制御のシミュレーション(静的変数使用)


Masanobu KOGA 平成10年8月19日