サイトマップ

はじめての現代制御理論 講義06 状態方程式の自由応答

講義06 状態方程式の自由応答

行列指数関数  e^{At} という魔法のような表現方法

行列指数関数

入力  u(t) がない場合の応答を求める

 \displaystyle
\begin{eqnarray}
\dot{x}(t) &=& A x(t) \\
s X(s) - x(0) &=& A X(s)  \\
(s I - A) X(s) &=& x(0) \\
X(s) &=& (s I - A)^{-1} x(0)
\end{eqnarray}

ここで、行列指数関数  e^{At} を導入

 \displaystyle
\mathcal{L}^{-1}
\begin{bmatrix} \frac{1}{s I - A} \end{bmatrix}
= e^{At}

これは、下記のスカラーの逆ラプラス変換と同じ感じ

 \displaystyle
\mathcal{L}^{-1}
\begin{bmatrix} \frac{1}{s - a} \end{bmatrix}
= e^{at}

結局、 x(t) は、下記になる

 \displaystyle
x(t) = e^{At} x(0)

2x2の具体例

下記のシステムについて

 \displaystyle
\frac{d}{dt}
\begin{bmatrix}
    x_1 (t) \\
    x_2 (t)
\end{bmatrix}
=
\begin{bmatrix}
    0   &  1  \\
    -6  &  -5
\end{bmatrix}
\begin{bmatrix}
    x_1 (t) \\
    x_2 (t)
\end{bmatrix}

解析すると

 \displaystyle
\begin{eqnarray}
(s I - A)^{-1} &=& \frac{1}{s^2 + 5 s + 6}
\begin{bmatrix}
    s + 5 & 1 \\
    -6 & s
\end{bmatrix} \\
&=&
\begin{bmatrix}
    \frac{3}{s+2} - \frac{2}{s+3} & \frac{1}{s+2} - \frac{1}{s+3} \\
    \frac{-6}{s+2} + \frac{6}{s+3} & \frac{-2}{s+2} + \frac{3}{s+3}
\end{bmatrix}
\end{eqnarray}

行列指数関数は下記になる

 \displaystyle
e^{At} =
\begin{bmatrix}
    3 e^{-2 t} - 2 e^{-3 t} & e^{-2 t} - e^{-3 t} \\
    -6 e^{-2 t} + 6 e^{-3 t} & -2 e^{-2 t} + 3 e^{-3 t}
\end{bmatrix}

初期値を与えると下記のように解ける

 \displaystyle
x(0) = \begin{bmatrix} 1 \\ 1 \end{bmatrix} \\
\\
e^{At} x(0) =
\begin{bmatrix}
    4 e^{-2 t} - 3 e^{-3 t} \\
    -8 e^{-2 t} + 9 e^{-3 t}
\end{bmatrix}

グラフにすると下図になる

fig = plt.figure(figsize=(6, 4))
ax = fig.add_subplot(111)
t = np.arange(0, 5, 0.001)
x1_arr =  4 * np.exp(-2 * t) - 3 * np.exp(-3 * t)
x2_arr = -8 * np.exp(-2 * t) + 9 * np.exp(-3 * t)
ax.plot(t, x1_arr, '-',  label='x1')
ax.plot(t, x2_arr, '--', label='x2')
ax.grid()
ax.legend()
ax.set_xlim(0, 5)
ax.set_ylim(-1.0, 1.5)
fig.tight_layout()

Pythonによる数値シミュレーション

実際に、状態方程式を逐次計算した場合をシミュレーションしてみる

x1_arr = [1.0]
x2_arr = [1.0]
t = [0.0]

dt = 0.001
for i in range(5000):
    x1_arr += [x1_arr[-1] + (0  * x1_arr[-1] + 1  * x2_arr[-1]) * dt]
    x2_arr += [x2_arr[-1] + (-6 * x1_arr[-1] + -5 * x2_arr[-1]) * dt]
    t      += [t[-1] + dt]
fig = plt.figure(figsize=(6, 4))
ax = fig.add_subplot(111)
ax.plot(t, x1_arr, '-', label='x1')
ax.plot(t, x2_arr, '--', label='x2')
ax.grid()
ax.legend()
ax.set_xlim(0, 5)
ax.set_ylim(-1.0, 1.5)
fig.tight_layout()

解析結果と同じになる

参考文献

この記事は以下の書籍を参考にしましたが、
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください