サイトマップ

はじめての現代制御理論 講義09 状態フィードバックと極配置

講義09 状態フィードバックと極配置

やっとフィードバック制御になった

状態フィードバック制御による安定化法

 \displaystyle
\dot{x}(t) = A x(t) + b u(t) \\

のシステムにおいて、 u(t) として、下記を用いて、 x(t)フィードバック制御を考える

 \displaystyle
u(t) = -f x(t)
= - \begin{bmatrix} f_1 & f_2 \end{bmatrix} \begin{bmatrix} x_1 (t) \\  x_2 (t) \end{bmatrix}
= - f_1 x_1 (t) -  f_2 x_2 (t)

状態方程式は、

 \displaystyle
\begin{aligned}
\dot{x}(t) &= A x(t) - b f x(t) \\
&= (A - b f) x(t) \\
&= A_f x(t)
\end{aligned}

これを解くと、 x(t) = e^{A_f t} x(0) になり、
この  A_f = A - bf固有値を適切に配置することで安定化を行う

2x2の具体例

下記のシステムについて

 \displaystyle
\frac{d}{dt}
\begin{bmatrix}
    x_1 (t) \\
    x_2 (t)
\end{bmatrix}
= \begin{bmatrix}
    0   &  1  \\
    -2  &  3
\end{bmatrix}
\begin{bmatrix}
    x_1 (t) \\
    x_2 (t)
\end{bmatrix}
+
\begin{bmatrix}
    0 \\
    1
\end{bmatrix}
u(t)

このままだと、固有値は、

 \displaystyle
\begin{vmatrix}  \lambda I - A \end{vmatrix}
= \begin{vmatrix} 
  \lambda & -1 \\
  2 & \lambda - 3 
\end{vmatrix}
= \lambda ^2 - 3 \lambda + 2
= (\lambda - 1) (\lambda - 2)

となり、システムは不安定になる

 u(t) = - \begin{bmatrix} f_1 & f_2 \end{bmatrix} x(t) フィードバック制御をすると

 \displaystyle
\begin{aligned}
\frac{d}{dt}
\begin{bmatrix}
    x_1 (t) \\
    x_2 (t)
\end{bmatrix}
&= \begin{bmatrix}
    0   &  1  \\
    -2  &  3
\end{bmatrix}
\begin{bmatrix}
    x_1 (t) \\
    x_2 (t)
\end{bmatrix}
-
\begin{bmatrix}
    0 \\
    1
\end{bmatrix}
\begin{bmatrix} f_1 & f_2 \end{bmatrix} 
\begin{bmatrix}
    x_1 (t) \\
    x_2 (t)
\end{bmatrix} \\
&=
\begin{pmatrix}
  \begin{bmatrix}
      0   &  1  \\
      -2  &  3
  \end{bmatrix}
  -
  \begin{bmatrix}
      0   &  0  \\
      f_1  &  f_2
  \end{bmatrix}
\end{pmatrix}
\begin{bmatrix}
    x_1 (t) \\
    x_2 (t)
\end{bmatrix}
 \\
&=
\begin{bmatrix}
    0   &  1  \\
    -2 - f_1  &  3 - f_2
\end{bmatrix}
\begin{bmatrix}
    x_1 (t) \\
    x_2 (t)
\end{bmatrix}
\end{aligned}

この固有値は、

 \displaystyle
\begin{vmatrix}
    \lambda   &  -1  \\
    2 + f_1  &  \lambda - 3 + f_2
\end{vmatrix}
= \lambda ^2 - (3 - f_2) \lambda + 2 + f_1

この値を  \lambda = -2, -3 \lambda ^2 + 5 \lambda + 6 なるようにするには、

 \displaystyle
\left\{ \begin{matrix}
3 - f_2 = 5 \\
2 + f_1 = 6
\end{matrix} \right.
=
\left\{ \begin{matrix}
f_1 = 4  \\
f_2 = 8
\end{matrix} \right.

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

上記の例と同じ状態方程式で、フィードバック制御を逐次計算してシミュレーションしてみる
初期値は  x(0) = [ 1, 1 ]

例9.1  \lambda = -2, -3

 f = [ 4, 8 ]

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

dt = 0.001
for i in range(10000):
    x1_arr += [x1_arr[-1] + (0  * x1_arr[-1] + 1  * x2_arr[-1] + 0.0 * (-4 * x1_arr[-1] -8 * x2_arr[-1])) * dt]
    x2_arr += [x2_arr[-1] + (-2 * x1_arr[-1] + 3  * x2_arr[-1] + 1.0 * (-4 * x1_arr[-1] -8 * 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, 10)
ax.set_ylim(-1.0, 1.5)
fig.tight_layout()


収束する

例9.2  \lambda = -5, -6

 f = [28, 14 ]

x1_arr2 = [1.0]
x2_arr2 = [1.0]
t2 = [0.0]

dt = 0.001
for i in range(10000):
    x1_arr2 += [x1_arr2[-1] + (0  * x1_arr2[-1] + 1  * x2_arr2[-1] + 0.0 * (-28 * x1_arr2[-1] - 14 * x2_arr2[-1])) * dt]
    x2_arr2 += [x2_arr2[-1] + (-2 * x1_arr2[-1] + 3  * x2_arr2[-1] + 1.0 * (-28 * x1_arr2[-1] - 14 * x2_arr2[-1])) * dt]
    t2      += [t2[-1] + dt]
fig = plt.figure(figsize=(9, 4))
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)

ax1.plot(t, x1_arr, '-', label='9.1')
ax1.plot(t2, x1_arr2, '--', label='9.2')
ax1.grid()
ax1.legend()
ax1.set_ylabel('$x_1$')
ax1.set_xlim(0, 10)
ax1.set_ylim(0.0, 1.5)

ax2.plot(t, x2_arr, '-', label='9.1')
ax2.plot(t2, x2_arr2, '--', label='9.2')
ax2.grid()
ax2.legend()
ax2.set_ylabel('$x_2$')
ax2.set_xlim(0, 10)
ax2.set_ylim(-2.5, 1.0)
fig.tight_layout()


極配置を負に大きくすると、より早く収束する

例9.3  \lambda = -1 + j3, -1 - j3

 f = [ 8, 5 ]

x1_arr3 = [1.0]
x2_arr3 = [1.0]
t3 = [0.0]

dt = 0.001
for i in range(10000):
    x1_arr3 += [x1_arr3[-1] + (0  * x1_arr3[-1] + 1  * x2_arr3[-1] + 0.0 * (-8 * x1_arr3[-1] - 5 * x2_arr3[-1])) * dt]
    x2_arr3 += [x2_arr3[-1] + (-2 * x1_arr3[-1] + 3  * x2_arr3[-1] + 1.0 * (-8 * x1_arr3[-1] - 5 * x2_arr3[-1])) * dt]
    t3      += [t3[-1] + dt]
fig = plt.figure(figsize=(9, 4))
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)

ax1.plot(t, x1_arr, '-', label='9.1')
ax1.plot(t3, x1_arr3, '--', label='9.3')
ax1.grid()
ax1.legend()
ax1.set_ylabel('$x_1$')
ax1.set_xlim(0, 10)
ax1.set_ylim(-0.4, 1.2)

ax2.plot(t, x2_arr, '-', label='9.1')
ax2.plot(t3, x2_arr3, '--', label='9.3')
ax2.grid()
ax2.legend()
ax2.set_ylabel('$x_2$')
ax2.set_xlim(0, 10)
ax2.set_ylim(-2.5, 1.0)
fig.tight_layout()


虚部を持つと発振成分が生じる

参考文献

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