test

ビジネスと技術やってたらロボティクスにいきついた人のブログ

線形な系と系の時間発展

系の状態をx、出力をy、入力をuとする。

 x, y, uスカラーでもいいし、ベクトルに取ることもできる。

系に適当な線形化をして、以下の方程式で時間発展を追うことができるする。

 

\dot{x} = A x + B u

y = C x

A,B,C,Dはそれぞれ適当な次元の行列。

 

このような系を制御する。

つまり、任意の時間に任意の状態に到達するようなuを与えることができるだろうか?

 

状態フィードバックコントローラ

u(t) = Kx(t)と取ります。

Kを状態フィードバックゲインという。

このとき、時間発展の方程式は

\dot{x}=(A+BK)x

となる。

ここで簡単のため、目標の状態はx=0とする。

もしx=x_f \neq 0が目標の場合、\xi = x-x_fを状態に取り直しておつりの項をどうにかすることを考えよう。

(A+BK)x=(A+BK)(x-x_f+x_f)=(A+BK)\xi+(A+BK) x_f)

 

物理ではおなじみの行列の指数関数

e^M=\sum ^{\infty} _0 \frac{1}{n!}M^n

を使うと、xの時間発展は形式的に以下のように書ける。

x(t)=e^{(t-t_0)\hat{A}}x(t_0), \hat{A}=A+BK

 

Kはコントローラの設計次第で自分で選ぶことができるので

今は\hat{A}が対角化できるように取れているとする。

{\rm diag}(\lambda_1,...,\lambda _n)を対角成分が左上から順番に\lambda _1, \lambda _2...となっているn次の対角行列とする。

\hat{A}はいま、ある行列Sを使って

S\hat{A} S^{-1}={\rm diag}(\lambda_1,...,\lambda _n)

と書けている。「指数関数」の定義より

 

e^{S\hat{A} S^{-1}}=\sum \frac{1}{n!}(S\hat{A} S^{-1})^n=\sum \frac{1}{n!}S\hat{A}^n S^{-1}=Se^{\hat{A}}S^{-1}

 なので

 x(t)=e^{(t-t_0)\hat{A}}x(t_0)の両辺のSを右からかけて

 Sx(t)=Se^{(t-t_0)\hat{A}}S^{-1}Sx(t_0) 

Sxを新たに\bar{x}とすれば(線形変換しただけ)

 \bar{x}(t)=Se^{(t-t_0)\hat{A}}S^{-1}\bar{x}(t_0)

ここで、 Se^{(t-t_0)\hat{A}}S^{-1}は対角行列となっている。

「指数関数」の定義式に代入すれば直ちに

 Se^{(t-t_0)\hat{A}}S^{-1}={\rm diag}(e^{\lambda _1},...,e^{\lambda _n})

となっていることがわかる。

 

系の時間発展は結局、A+BK固有値をうまく配置すればいいことになる。

固有値は全部実部が負にとりたいし所望の緩和時間後に目標値に(限りなく近く)なってほしいし、虚部はなるべく小さくしたい。

一つでも固有値が正だと系は発散してしまうので、そうならないように状態フィードバックゲインを調整しなくてはならない。

 

Matlab/Octaveでの実装

都合のいい状態フィードバックゲインを選んでくれる関数があります

jp.mathworks.com

あなたが神か・・・