| 卒業研究の道具箱 by システム力学研究室 |
ヤコビ行列 †※ (j,k) 成分が ajk であるような行列を [ajk] と表記する
で定義される行列を,ヤコビ行列という. 制御系の線形化 †非線形制御系: の状態
基準状態 に真似させることを線形化という.そのための近似行列 のようなヤコビ行列になる.
というような表現をよく用いる. 倒立振子のヤコビ行列 †平衡点まわりのヤコビ行列を求める.倒立振子の平衡点は, の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は状態変数に関するヤコビ行列
> 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 ]
|