next up previous
Next: rngkut4 Up: シミュレーションの基礎 Previous: diff_eqs(), link_eqs()

動的補償器

これで大体の基本は分かったと思います。この例では状態フィードバック なのでstaticなコントローラでした。これが動的なコントローラだったり, オブザーバが入っていたり,Adaptiveのパラメータ更新則も入っていたら どうなるでしょうか?

答えは,すべてdiff_eqsです。前の例ではdiff_eqsにはプ ラントの式しかありませんが,あくまでMATXの積分関数はdiff_eqsの返す微分値とlink_eqsの返す入力から積分しているに 過ぎないので,微分方程式で表されるものはすべて積分してしまえば良い ことになります。

例えば,先のシステムにおいて,制御の為に必要なパラメータが次の微分 方程式で表されているとします。

\begin{displaymath}\dot{Y} = - G \times (x - a)
\end{displaymath}

この式は微分方程式ですからdiff_eqsに書いてしまえばよくて,
  Func void diff_eqs(dx, t, x, u)
    Real t;
    Matrix x, dx, u;
  {
    Matrix A, b;
    Matrix dx1, dx2;
    Matrix Y;
  
    A = [[ 0,  1,  0]
         [ 0,  0,  1]
         [-2, -3, -4]];
  
    b = [0 0 1]';
  
    G = I(3);
    a = [[ -1, 0, 1]
         [  0, 1, 0]
         [  0, 0, 1]];
  
    dx1 = A * x + b * u;
    dx2 = -G * (x - a);
  
    dx = [[dx1][dx2]];
  }
となります。18行目に注目して下さい。更新則を含めたすべての状態を dxとして使うわけで,これにともなって当然link_eqsの ほうも書き換える必要があります。

今まではOdeですべての話しをしてきましたが,MATXはその目 的に応じて多くの積分関数を持っています。以下にそれぞれの簡単なアル ゴリズムと一緒に説明します。


Masanobu KOGA 平成10年5月19日