【python-control】同一次元オブザーバのゲイン計算

python-controlで同一次元オブザーバを求める方法について紹介します。

オブザーバとは

オブザーバ(状態推定器)とは、状態量xが観測できない場合に、出力yと入力uから状態量xを推定する機構です。
(実システムでは状態量xを観測できない場合が多いのでオブザーバは実機に適用する場合に重要)
python-controlの「control.place」メソッドを用いると、Matlabのplace関数のように同一次元オブザーバのゲインを計算できます。
※python-controlはMatlab風ライブラリなので、Matlabの資料が役に立ちます

参考文献
1 【制御理論】同一次元オブザーバ
2 -controlドキュメント:placeメソッドの使い方
3 Matlabドキュメント:place関数の使い方

ソースコード

次のシステムの同一次元オブザーバゲインを求めるサンプロプログラムです。
尚、システムの極は[-1+j,-1-j] に配置するとします。

(1) \begin{eqnarray*} \left[\begin{array}{c} \dot{x}_1 \\ \dot{x}_2 \\ \end{array}\right]= \left[\begin{array}{cc} 1 & 1 \\ 0 & 1 \\ \end{array}\right] \left[\begin{array}{c} x_1 \\ x_2 \\ \end{array}\right] + \left[\begin{array}{c} 0 \\ 1 \\ \end{array}\right] u \\ \end{eqnarray*}

from control.matlab import *
import numpy as np

# 可制御性のチェック
def check_ctrb(A, B):
  Uc = ctrb(A, B) # 可制御性行列の計算
  Nu = np.linalg.matrix_rank(Uc)  # Ucのランクを計算
  (N, N) = np.matrix(A).shape     # 正方行列Aのサイズ(N*N)
  # 可制御性の判別
  if Nu == N: return 0            # 可制御
  else: return -1                 # 可制御でない

  # 可観測性のチェック
def check_obsv(A, C):
  Uo = ctrb(A, C) # 可制御性行列の計算
  No = np.linalg.matrix_rank(Uo)  # Ucのランクを計算
  (N, N) = np.matrix(A).shape     # 正方行列Aのサイズ(N*N)
  # 可制御性の判別
  if No == N: return 0            # 可制御
  else: return -1                 # 可制御でない
    
def main():
  # システム行列の定義
  A = np.array([[1, 1],
                [0, 1]])
  B = np.array([[0],
                [1]])
  C = np.array([[1, 1]])

  #F = np.array([5, 1])

  # システムが可制御・可観測でなければ終了
  if check_ctrb(A, B) and check_obsv(A, B) == -1 : exit

  # 同一次元オブザーバの極
  observer_poles=[-1+1j,-1-1j] 

  # 同一次元オブザーバゲインの設計(状態フィードバックの双対) 
  G = place(A.T, C.T, observer_poles).T
  print("オブザーバゲイン:\n",G)

if __name__ == "__main__":
  main()

実行結果

オブザーバゲイン:
 [[-1.]
 [ 5.]]
関連記事