next up previous
Next: 動的補償器 Up: シミュレーションの基礎 Previous: シミュレーションの基礎

diff_eqs(), link_eqs()

MATXには数々の積分計算関数が用意されていますが,基本的には次のプ ログラムのように使います。プログラムのmain()関数の9行目の Odeというのがその形です。
  Func void main()
  {
    Real dt;
    Matrix x0;
    Array TC, XC, UC;
    Matrix diff_eqs(), link_eqs();

    dt = 0.01;
  
    x0 = [1 1 1]'; // 初期状態
    {TC, XC, UC} = Ode(0.0, 5.0, x0,
                       diff_eqs, link_eqs);

    print [[TC][XC][UC]] >> "cont.mat"
  }
  Func Matrix diff_eqs(t, x, u)
    Real t;
    Matrix x, u;
 {
    Matrix dx, A, b;

    A = [[ 0,  1,  0]
         [ 0,  0,  1]
         [-2, -3, -4]];

    b = [0 0 1]';

    dx = A * x + b * u;
    return dx;
  }
  Func Matrix link_eqs(t, x)
    Real t;
    Matrix x;
  {
    Matrix u, f;

    f = [ -1, -1, -1];
    u = f * x;
    return u;
  }
関連する変数としては,状態x,入力u,時間t,状 態の微分dxとが必要です。これらは関連関数の link_eqs(), diff_eqs()に必要です。

積分関数(Ode()など)は少なくとも5個引数をとります。最初 から開始時間,終了時間,初期状態,diff_eqslink_eqs となります。

このdiff_eqs()はシステムの状態の微分値を返す関数です。言い変え れば, 時間tと状態xと入力uから, 状態の微分dxを返す関数のことです。それぞれの変数はdiff_eqs()の引 数の欄を書き換えると,変えることが出来ます。例えば Ode(0.0, 5.0, x0, diff, link)と書くならば, diff, linkというのがそれぞれの関数となります。

diff_eqs()の型がMatrixであることに注意して下さい。 diff_eqs()の引数の3つが重要です。 それぞれの変数はOde()が渡していると思って下さい。

link_eqs()はシステムへの入力を返す関数です。言い変えれば, 時間tと状態xからシステムへの入力uを決める 関数のことです。link_eqs()の型もMatrixです。この link_eqs()の2つの引数もOde()が渡していると思って構いません。

Ode()の返す値は例をみると{TC, XC, UC}となっています。こ れはArrayで宣言されていますが,それぞれ,時間,状態,入力の時 系列データとなっています。したがって,最後の文の

  print [[TC][XC][UC]] >> "cont.mat"
では3個の状態と1個の入力を持つシステムなので,1行目に時間が,2行目 から5行目までに状態が,6行目に入力があるデータが行列として cont.matというファイルに書き出されます。ファイルの出力形式は転置し てから出力されますので,ファイルの中では列毎に各成分が並びます。

Masanobu KOGA 平成11年9月20日