講義12 状態フィードバック制御とオブザーバの併合システムの設計
合わせて使う場合の注意点
当然だが、「観測」の方を先に収束させないと、「制御」は収束できない
オブザーバを用いた状態フィードバック制御系の構成
講義09の状態フィードバックと、講義11のオブザーバを合わせて使用する場合を考える
状態変数線図は下図になる
併合システムの特性の解析
オブザーバの時と同様に 推定誤差 を用いると、 は下記になる
一方、 は下記になる
この2つを合わせると、下記の拡張システムになる
固有値は、
となるが、下記の関係が成り立つため、
結局、固有値の計算は、下記になる
このことから、 と の固有値を独立して選ぶことができることがわかる
つまり、フィードバックゲイン と オブザーバゲイン を独立して設計できる
設計上の注意
オブザーバが収束してから、フィードバックで正しく制御できるため、
オブザーバの極を、フィードバックの極より複素平面の左
に配置する必要がある
Pythonによる数値シミュレーション
2x2の以下のシステムでの併合システムを考える
以下のシステムの併合システムを考える
自由応答の極は である
また、オブザーバの初期値は、 とする
例12.1 オブザーバが遅い場合
閉ループの極を / フィードバックゲインは
オブサーバの極を / オブザーバゲインは
xhat1_arr = [0.0] xhat2_arr = [0.0] t = [0.0] x1_arr = [1.0] x2_arr = [1.0] x1_fb_arr = [1.0] x2_fb_arr = [1.0] dt = 0.001 for i in range(10000): x1_arr += [x1_arr[-1] + (0 * x1_arr[-1] + 1 * x2_arr[-1] - 0.0 * (24 * xhat1_arr[-1] + 6 * xhat2_arr[-1])) * dt] x2_arr += [x2_arr[-1] + (-6 * x1_arr[-1] - 5 * x2_arr[-1] - 1.0 * (24 * xhat1_arr[-1] + 6 * xhat2_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] - 0.0 * (24 * xhat1_arr[-1] + 6 * 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] - 1.0 * (24 * xhat1_arr[-1] + 6 * xhat2_arr[-1]) + ( 6.0) * (y - (1.0 * xhat1_arr[-1] + 0.0 * xhat2_arr[-1]))) * dt] x1_fb_arr += [x1_fb_arr[-1] + (0 * x1_fb_arr[-1] + 1 * x2_fb_arr[-1] - 0.0 * (24 * x1_fb_arr[-1] + 6 * x2_fb_arr[-1])) * dt] x2_fb_arr += [x2_fb_arr[-1] + (-6 * x1_fb_arr[-1] - 5 * x2_fb_arr[-1] - 1.0 * (24 * x1_fb_arr[-1] + 6 * x2_fb_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, x1_fb_arr, ':', label='$x_{sf1}$') ax1.plot(t, x2_fb_arr, '-.', label='$x_{sf2}$') ax1.grid() ax1.legend() ax1.set_xlim(0, 5) ax1.set_ylim(-2.0, 1.5) ax2.plot(t, x1_arr, '-', label='$x_1$') ax2.plot(t, x2_arr, '--', label='$x_2$') ax2.plot(t, xhat1_arr, ':', label='$\hat{x}_1$') ax2.plot(t, xhat2_arr, '-.', label='$\hat{x}_2$') ax2.grid() ax2.legend() ax2.set_xlim(0, 5) ax2.set_ylim(-2.0, 3.0) fig.tight_layout()
状態ベクトルが観測できる場合と比べて、明らかに遅くなっている
例12.3 オブザーバが速い場合
閉ループの極を / フィードバックゲインは
オブサーバの極を / オブザーバゲインは
xhat1_arr = [0.0] xhat2_arr = [0.0] t = [0.0] x1_arr = [1.0] x2_arr = [1.0] x1_fb_arr = [1.0] x2_fb_arr = [1.0] dt = 0.001 for i in range(10000): x1_arr += [x1_arr[-1] + (0 * x1_arr[-1] + 1 * x2_arr[-1] - 0.0 * (24 * xhat1_arr[-1] + 6 * xhat2_arr[-1])) * dt] x2_arr += [x2_arr[-1] + (-6 * x1_arr[-1] - 5 * x2_arr[-1] - 1.0 * (24 * xhat1_arr[-1] + 6 * xhat2_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] - 0.0 * (24 * xhat1_arr[-1] + 6 * 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] - 1.0 * (24 * xhat1_arr[-1] + 6 * xhat2_arr[-1]) + ( 6.0) * (y - (1.0 * xhat1_arr[-1] + 0.0 * xhat2_arr[-1]))) * dt] x1_fb_arr += [x1_fb_arr[-1] + (0 * x1_fb_arr[-1] + 1 * x2_fb_arr[-1] - 0.0 * (24 * x1_fb_arr[-1] + 6 * x2_fb_arr[-1])) * dt] x2_fb_arr += [x2_fb_arr[-1] + (-6 * x1_fb_arr[-1] - 5 * x2_fb_arr[-1] - 1.0 * (24 * x1_fb_arr[-1] + 6 * x2_fb_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, x1_fb_arr, ':', label='$x_{sf1}$') ax1.plot(t, x2_fb_arr, '-.', label='$x_{sf2}$') ax1.grid() ax1.legend() ax1.set_xlim(0, 5) ax1.set_ylim(-2.0, 1.5) ax2.plot(t, x1_arr, '-', label='$x_1$') ax2.plot(t, x2_arr, '--', label='$x_2$') ax2.plot(t, xhat1_arr, ':', label='$\hat{x}_1$') ax2.plot(t, xhat2_arr, '-.', label='$\hat{x}_2$') ax2.grid() ax2.legend() ax2.set_xlim(0, 5) ax2.set_ylim(-2.0, 3.0) fig.tight_layout()
オブザーバの収束が速く、ほぼ理想的な状態フィードバックと同じ性能が確認できる
参考文献
この記事は以下の書籍を参考にしましたが、
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください