講義09 状態フィードバックと極配置
やっとフィードバック制御になった
状態フィードバック制御による安定化法
のシステムにおいて、 として、下記を用いて、 のフィードバック制御を考える
状態方程式は、
これを解くと、 になり、
この の固有値を適切に配置することで安定化を行う
2x2の具体例
下記のシステムについて
このままだと、固有値は、
となり、システムは不安定になる
とフィードバック制御をすると
この固有値は、
この値を 、 なるようにするには、
Pythonによる数値シミュレーション
上記の例と同じ状態方程式で、フィードバック制御を逐次計算してシミュレーションしてみる
初期値は ]
例9.1
]
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
]
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
]
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()
虚部を持つと発振成分が生じる
参考文献
この記事は以下の書籍を参考にしましたが、
私の拙い知識で書いておりますので、誤り等ありましたらご指摘ください