Maxima で見る古典制御


□ ラプラス変換

   デルタ関数

    (%i ) laplace(delta(t), t, s);

   単位ステップ関数

    (%i ) laplace(1, t, s);

   三角関数

    (%i ) laplace(sin(t), t, s);

   指数関数とランプ関数

    (%i ) laplace(%e^(-a*t)*t^2, t, s);

□ ラプラス変換の部分分数展開

    (%i ) G: 1/((s+2)^2*(s+3));
    (%i ) partfrac(G, s);

    (%i ) G: 1/(s*((s+2)^2+1));
    (%i ) partfrac(G, s);

      複素極までは展開されないことに注意する必要がある.複素極に展開した時の係数
      はたとえば次のようにすれば求められる.

    (%i ) r: solve(denom(G) = 0, s);
    (%i ) c[1]: ratsimp(G*(s-ev(s,r[i])));
    (%i ) ratsimp(ev(c[1], r[1]));

      次のようにして全ての係数を求めることもできる.

    (%i ) for i:1 thru length(r) do 
            (c[i]: ratsimp(G*(s-ev(s,r[i]))),
             print(r[i], ":", ratsimp(ev(c[i],r[i]))));

      maxima 5.13.0 では上記ではなく,次のように計算する必要がある.

    (%i ) r: solve(denom(G) = 0, s);
    (%i ) for i:1 thru length(r) do 
            (c[i]: num(G)/(gfactor(denom(G))/(s-ev(s,r[i]))),
             print(r[i], ":", rectform(ev(c[i],r[i]))));
    

□ 逆ラプラス変換

    (%i ) ilt(1/(s+a), s, t);

    (%i ) assume(w>0);
    (%i ) ilt((s+a)/((s+a)^2+w^2), s, t);
    (%i ) forget(w>0);

    (%i ) ilt(1/((s+2)^2*(s+3)), s, t);

    (%i ) ilt(1/(s*((s+2)^2+1)), s, t);

□ 周波数伝達関数の計算

   伝達関数が
              K
     G(s) = ------
            (1+Ts)
   で与えられる1次遅れ要素の周波数伝達関数と,その極座標表示を求める.

    (%i ) G(s) := K/(1+T*s);
    (%i ) G(%i*w);
    (%i ) realpart(G(%i*w)));
    (%i ) imagpart(G(%i*w));
    (%i ) assume(K>0);
    (%i ) abs(G(%i*w));
    (%i ) carg(G(%i*w));
    (%i ) forget(K>0);

□ 2次系の過渡応答

   2次系

   y''(t) + 2ζω y'(t) + ω^2 y(t) = x(t)

   で ζ = 2/10, ω = 1, x(t) = 1 (単位ステップ入力)の場合の過渡応答を求める.
   このとき,伝達関数 G(s) は 
                                       1
                              -----------------
                                 2          
                               s   + 2 ζ s + 1
   で,ステップ入力のラプラス変換は 1/s で与えられる.

    (%i ) zeta: 2/10;
    (%i ) g: 1/(s^2+2*zeta*s+1);
    (%i ) define(f(t), ilt(g * (1/s), s, t));
    (%i ) plot2d(f, [t,0,30], [GNUPLOT_PREAMBLE, "set grid"]);

□ ベクトル軌跡(ナイキスト線図)

   伝達関数が
                   1
     G(s) = -----------------
            (1+s)(1+2s)(1+3s)
   で与えられる制御系のベクトル軌跡を描く.

    (%i ) g(s):=1/((1+s)*(1+2*s)*(1+3*s));
    (%i ) define(x(w), ratsimp(realpart(g(%i*w))));
    (%i ) define(y(w), ratsimp(imagpart(g(%i*w))));
    (%i ) plot2d([parametric,x,y],[w,0,1000],[nticks,300]);

□ ボード線図

   伝達関数が
               (1+3s)
     G(s) = ------------
            (1+4s)(1+2s)
   で与えられる制御系のボード線図を描く.

    (%i ) g(s):=(1+3*s)/((1+4*s)*(1+2*s));
    (%i ) define(gain(w), 20*log(ratsimp(abs(g(%i*w))))/log(10));
    (%i ) plot2d(gain, [w,0.01,10],[GNUPLOT_PREAMBLE, "set log x; set grid"]);
    (%i ) define(angle(w), (180/%pi)*atan(ratsimp(imagpart(g(%i*w))/realpart(g(%i*w)))));
    (%i ) plot2d(angle, [w,0.01,10],[GNUPLOT_PREAMBLE, "set log x;set grid"]);

□ 安定性の判別

   特性方程式が
     4s^3 + 6s^2 + 6s + 2 = 0
   で与えられる制御系の安定判別を行う.

    (%i ) expand(solve(4*s^3 + 6*s^2 + 6*s + 2 = 0, s));

    s の実部が全て負なので,制御系は安定である.

   特性方程式が
     s^4 + s^3 + 6s^2 + 6s + 2 = 0
   で与えられる制御系の安定判別を行う.

    (%i )float(realpart(float(solve(s^4 + s^3 + 6*s^2 + 6*s + 2 = 0, s))));

   次の式でも求まるが,計算は遅い.
   
    (%i )float(realpart(solve(s^4 + s^3 + 6*s^2 + 6*s + 2 = 0, s)));

    s の実部に正の値を取るものがあるので,制御系は不安定である.


Maxima
naniwa@rbt.his.u-fukui.ac.jp