Top / Simulator / 倒立振子 / Maximaでヤコビ行列

Simulator/倒立振子/Maximaでヤコビ行列

ヤコビ行列

※ (j,k) 成分が ajk であるような行列を [ajk] と表記する

\vec{f}=(f_1,f_2,\cdots,f_n)\vec{x}=(x_1,x_2,\cdots,x_n)に対して,

\frac{\partial\vec{f}}{\partial\vec{x}} := \left[\frac{\partial f_j}{\partial x_k}\right]

で定義される行列を,ヤコビ行列という.

制御系の線形化

非線形制御系

\dot{\vec{x}}=\vec{f}(\vec{x},\vec{u})

の状態 \vec{x} および入力 \vec{u} のなかから,調べたい基準状態 X_0:=(\vec{x}_0,\;\vec{u}_0) を選ぶ.

例えば,振子の倒立運動を調べたければ,倒立して静止している振子の角度と角速度を基準状態に選ぶ.完全に真上に倒立しているとき制御力は不要になるから,入力の基準は0にすればよかろう.

基準状態 X_0 の近くのごく狭い範囲に限定して,非線形制御系の挙動を,線形制御系:

\dot{\vec{x}}=A\vec{x}+B\vec{u}

に真似させることを線形化という.そのための近似行列 A,\;B は,

A=\frac{\partial\vec{f}}{\partial\vec{x}},\;B=\frac{\partial\vec{f}}{\partial\vec{u}}

のようなヤコビ行列になる.A,\;B\vec{x},\;\vec{u} の成分を含むが,これら成分には,基準状態 X_0:=(\vec{x}_0,\;\vec{u}_0) を代入する.代入する基準状態 X_0 を明示するために

  • X_0 まわりの線形化
  • X_0 まわりのヤコビ行列

というような表現をよく用いる.

倒立振子のヤコビ行列

平衡点まわりのヤコビ行列を求める.倒立振子の平衡点は,

(x,\dot x,\theta,\dot\theta)=(0,0,0,0),\quad (0,0,\pi,0)

の2種類がある.

Maxima プログラム

/* invp_jac.mac */
/* ユーザー関数 */
substlist(a,x,f):= block([f0:f,N:length(a)],
     for i thru N do f0:subst(a[i],x[i],f0),f0)$        
/* 状態変数とパラメータ */
xx:[x,dx,th,dth]$    /* 状態変数 */
m1:2/3$ m2:1/3$ r:1$ /* パラメータ */
/* 慣性行列 */
M: ident(2)$ /* 初期化(単位行列) */
M[1,1]: m1+m2$
M[1,2]: m2*r*cos(th)$
M[2,1]: cos(th)$
M[2,2]: r$
M;
/* 右辺 */
b: [0,0]$ /* 初期化(ゼロベクトル) */
b[1]: m2*r*(dth^2)*sin(th)+u$ 
b[2]: g*sin(th)$
b;
/* 加速度について解く */
hh:first(transpose(invert(M).b))$
ff: [0,0,0,0]$
ff[1]: dx$  ff[2]: hh[1]$ /* 一階化 */
ff[3]: dth$ ff[4]: hh[2]$
/* ヤコビ行列を求める */
A:jacobian(ff,xx)$  /* 状態変数に関して */
B:jacobian(ff,[u])$ /* 制御入力に関して */
/* 平衡点xx=(0,0,0,0) */
A1:ratsimp(substlist([0,0,0,0],xx,A));
B1:ratsimp(substlist([0,0,0,0],xx,B));
/* 平衡点xx=(0,%pi,0,0) */
A2:ratsimp(substlist([0,0,%pi,0],xx,A));
B2:ratsimp(substlist([0,0,%pi,0],xx,B));

実行例

A1,A2は状態変数に関するヤコビ行列 \frac{\partial\vec{f}}{\partial\vec{x}} の各平衡点での値である. B1,B2は制御入力に関するヤコビ行列 \frac{\partial\vec{f}}{\partial\vec{u}} の各平衡点での値である *1

> maxima -qb invp_jac.mac
(中略)
(%i25)           A1 : ratsimp(substlist([0, 0, 0, 0], xx, A))
                               [ 0  1   0   0 ]
                               [              ]
                               [         g    ]
                               [ 0  0  - -  0 ]
                               [         2    ]
(%o25)                         [              ]
                               [ 0  0   0   1 ]
                               [              ]
                               [       3 g    ]
                               [ 0  0  ---  0 ]
                               [        2     ]
(%i26)           B1 : ratsimp(substlist([0, 0, 0, 0], xx, B))
                                    [  0  ]
                                    [     ]
                                    [  3  ]
                                    [  -  ]
                                    [  2  ]
(%o26)                              [     ]
                                    [  0  ]
                                    [     ]
                                    [   3 ]
                                    [ - - ]
                                    [   2 ]
(%i27)          A2 : ratsimp(substlist([0, 0, %pi, 0], xx, A))
                              [ 0  1    0    0 ]
                              [                ]
                              [          g     ]
                              [ 0  0   - -   0 ]
                              [          2     ]
(%o27)                        [                ]
                              [ 0  0    0    1 ]
                              [                ]
                              [         3 g    ]
                              [ 0  0  - ---  0 ]
                              [          2     ]
(%i28)          B2 : ratsimp(substlist([0, 0, %pi, 0], xx, B))
                                     [ 0 ]
                                     [   ]
                                     [ 3 ]
                                     [ - ]
                                     [ 2 ]
(%o28)                               [   ]
                                     [ 0 ]
                                     [   ]
                                     [ 3 ]
                                     [ - ]
                                     [ 2 ]

*1 制御系の線形化では制御入力に関するヤコビ行列も重要な意味を持つ.

Last-modified: 2008-05-27 (火) 17:36:54 (830d)