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{p} = - G \times (x - a)
\end{displaymath}

この式は微分方程式ですからdiff_eqs()に書いてしまえばよくて,
  Func Matrix diff_eqs(t, x, u)
    Real t;
    Matrix x, u;
  {
    Matrix A, b;
    Matrix dx, dp;
  
    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]];
  
    dx = A * x + b * u;
    dp = -G * (x - a);
  
    return [[dx][dp]];
  }
となります。18行目に注目して下さい。更新則を含めたすべての状態 [[dx][dp]]を返すわけで,これにともなって当然link_eqs()の ほうも書き換える必要があります。

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


Masanobu KOGA 平成11年9月20日