サイトマップ

はじめての現代制御理論 講義11 オブザーバの設計

講義11 オブザーバの設計

現代制御のすごいところ
状態ベクトルが観測できない場合でも、オブザーバを用いれば推定することができる
さらに面白いのは、状態フィードバックと同じ理論で、推定の可能性や速度・精度を設定できる

オブザーバの構成

状態フィードバック制御を行う上で、 x(t) の全成分が計測できない場合がある
その場合、オブザーバを用いて、 \hat{x}(t) を推定することで、フィードバック制御を行う

この場合、状態フィードバック制御は、 u(t) = -f \hat{x}(t) となり、

 \displaystyle
\dot{x}(t) = A x(t) - b f \hat{x}(t)

となる

ここで、オブザーバとして、下記の微分方程式 \hat{x}(t) を推定する

 \displaystyle
\dot{ \hat{x} }(t) = A \hat{x}(t) - b f \hat{x}(t) + h \lbrace y(t) - c \hat{x}(t) \rbrace

この場合、推定誤差 e(t) = \hat{x}(t) - x(t)

 \displaystyle
\begin{aligned}
\dot{e} (t) &= \dot{ \hat{x} }(t) - \dot{x}(t) \\
&= A \hat{x}(t) - b f \hat{x}(t) + h \lbrace y(t) - c \hat{x}(t) \rbrace - \lbrace A x(t) - b f \hat{x}(t) \rbrace \\
&= A \lbrace \hat{x}(t) - x(t) \rbrace + h \lbrace c x(t) - c \hat{x}(t) \rbrace \\
&= A \lbrace \hat{x}(t) - x(t) \rbrace - h c \lbrace c \hat{x}(t) - x(t) \rbrace \\
&= (A - h c) e(t)
\end{aligned}

となり、状態フィードバックと同様に、
 A - hc固有値を極配置することで、
 e(t) \rightarrow 0 と収束させることができる

状態遷移図で表すと下図になる

b
b
A
A
c
c
u(t)
u(t)
+
+
+
+
x'(t)
x'(...
x(t)
x(t)
y(t)
y(t)
b
b
A
A
c
c
+
+
+
+
X'(t)
X'(...
X(t)
X(t)
+
+
-
-
h
h
+
+
Viewer does not support full SVG 1.1

設定したシステムモデルの出力 c \hat{x}(t) と実際の計測値 y(t) の差分を オブザーバゲイン  h でフィードバックしている

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

2x2の以下のシステムの自由応答における状態ベクトルを推定する

 \displaystyle
\begin{aligned}
\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} \\

y(t) &=
\begin{bmatrix}
    1   &  0
\end{bmatrix}
\begin{bmatrix}
    x_1 (t) \\
    x_2 (t)
\end{bmatrix} \\

x(0) &=
\begin{bmatrix}
    1 \\
    1
\end{bmatrix}
\end{aligned}

例11.1  \lambda = -1, -2

 h = \begin{bmatrix} -2 \quad 6 \end{bmatrix}^T となり、オブザーバは下記になる

 \displaystyle
\begin{aligned}
\frac{d}{dt}
\begin{bmatrix}
    \hat{x}_1 (t) \\
    \hat{x}_2 (t)
\end{bmatrix}
&=
\begin{bmatrix}
    0   &  1  \\
    -6  &  -5
\end{bmatrix}

\begin{bmatrix}
    \hat{x}_1 (t) \\
    \hat{x}_2 (t)
\end{bmatrix}
+
\begin{bmatrix}
    -2 \\
    6
\end{bmatrix}
\lbrace
y(t) - 
\begin{bmatrix}
    1   &  0
\end{bmatrix}

\begin{bmatrix}
    \hat{x}_1 (t) \\
    \hat{x}_2 (t)
\end{bmatrix}
\rbrace \\

\hat{x}(0) &=
\begin{bmatrix}
    0 \\
    0
\end{bmatrix}
\end{aligned}
xhat1_arr = [0.0]
xhat2_arr = [0.0]
t = [0.0]
x1_arr = [1.0]
x2_arr = [1.0]

dt = 0.001
for i in range(10000):
    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]
    y = 1.0 * x1_arr[-1] + 0.0 * x2_arr[-1]

    xhat1_arr += [xhat1_arr[-1] + (0  * xhat1_arr[-1] + 1  * xhat2_arr[-1] + (-2.0) * (y - (1.0 * xhat1_arr[-1] + 0.0 * xhat2_arr[-1]))) * dt]
    xhat2_arr += [xhat2_arr[-1] + (-6 * xhat1_arr[-1] - 5  * xhat2_arr[-1] + ( 6.0) * (y - (1.0 * xhat1_arr[-1] + 0.0 * xhat2_arr[-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='$x_1$')
ax1.plot(t, x2_arr, '--', label='$x_2$')
ax1.plot(t, xhat1_arr, ':', label='$\hat{x}_1$')
ax1.plot(t, xhat2_arr, '-.', label='$\hat{x}_2$')
ax1.grid()
ax1.legend()
ax1.set_xlim(0, 10)
ax1.set_ylim(-1.0, 3.0)

ax2.plot(t, np.array(xhat1_arr) - np.array(x1_arr), '-', label='$e_1$')
ax2.plot(t, np.array(xhat2_arr) - np.array(x2_arr), '--', label='$e_2$')
ax2.grid()
ax2.legend()
ax2.set_xlim(0, 10)
ax2.set_ylim(-2.0, 4.0)
fig.tight_layout()

例11.3  \lambda = -8, -9

 h = \begin{bmatrix} 12 \quad 6 \end{bmatrix}^T

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

dt = 0.001
for i in range(10000):
    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]
    y = 1.0 * x1_arr[-1] + 0.0 * x2_arr[-1]

    xhat1_arr += [xhat1_arr[-1] + (0  * xhat1_arr[-1] + 1  * xhat2_arr[-1] + (12.0) * (y - (1.0 * xhat1_arr[-1] + 0.0 * xhat2_arr[-1]))) * dt]
    xhat2_arr += [xhat2_arr[-1] + (-6 * xhat1_arr[-1] - 5  * xhat2_arr[-1] + ( 6.0) * (y - (1.0 * xhat1_arr[-1] + 0.0 * xhat2_arr[-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='$x_1$')
ax1.plot(t, x2_arr, '--', label='$x_2$')
ax1.plot(t, xhat1_arr, ':', label='$\hat{x}_1$')
ax1.plot(t, xhat2_arr, '-.', label='$\hat{x}_2$')
ax1.grid()
ax1.legend()
ax1.set_xlim(0, 10)
ax1.set_ylim(-1.0, 3.0)

ax2.plot(t, np.array(xhat1_arr) - np.array(x1_arr), '-', label='$e_1$')
ax2.plot(t, np.array(xhat2_arr) - np.array(x2_arr), '--', label='$e_2$')
ax2.grid()
ax2.legend()
ax2.set_xlim(0, 10)
ax2.set_ylim(-2.0, 4.0)
fig.tight_layout()

状態フィードバック制御と同様、極配置を負に大きくすると、より早く収束する

例11.4  \lambda = -5 + j6, -5 - j6

 h = \begin{bmatrix} 5 \quad 30 \end{bmatrix}^T

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

dt = 0.001
for i in range(10000):
    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]
    y = 1.0 * x1_arr[-1] + 0.0 * x2_arr[-1]

    xhat1_arr += [xhat1_arr[-1] + (0  * xhat1_arr[-1] + 1  * xhat2_arr[-1] + ( 5.0) * (y - (1.0 * xhat1_arr[-1] + 0.0 * xhat2_arr[-1]))) * dt]
    xhat2_arr += [xhat2_arr[-1] + (-6 * xhat1_arr[-1] - 5  * xhat2_arr[-1] + (30.0) * (y - (1.0 * xhat1_arr[-1] + 0.0 * xhat2_arr[-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='$x_1$')
ax1.plot(t, x2_arr, '--', label='$x_2$')
ax1.plot(t, xhat1_arr, ':', label='$\hat{x}_1$')
ax1.plot(t, xhat2_arr, '-.', label='$\hat{x}_2$')
ax1.grid()
ax1.legend()
ax1.set_xlim(0, 10)
ax1.set_ylim(-1.0, 3.0)

ax2.plot(t, np.array(xhat1_arr) - np.array(x1_arr), '-', label='$e_1$')
ax2.plot(t, np.array(xhat2_arr) - np.array(x2_arr), '--', label='$e_2$')
ax2.grid()
ax2.legend()
ax2.set_xlim(0, 10)
ax2.set_ylim(-2.0, 4.0)
fig.tight_layout()

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

参考文献

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