###目的
Python Controlで、可制御性・可観測性を調べる。
###事前準備
PythonControlをインストールする
###可制御と可観測性
可制御とは、システムの状態を入力で動かす(制御する)ことができるか?、
可観測性とは、システムの状態を出力から推定する(観測する)ことができるか?、
を表す。
###可制御を調べる
可制御は、可制御行列がフルランクであるか、否か、で判断する。
- Parameters
- A: System 行列
- B: Control 行列
- Returns:
- Wc: 可制御行列
###可観測性を調べる
可観測は、可観測行列がフルランクであるか、否か、で判断する。
- Parameters
- A: System 行列
- C: Output 行列
- Returns:
- Wo: 可観測行列
###行列の階数(ランク)を調べる
行列の階数(ランク)はNumPyの関数matrix_rank()で求めることができる。
###サンプルコード
./test-statefbk.py
#!/usr/bin/env python
import numpy as np # Numerical library
from scipy import * # Load the scipy functions
from control.matlab import * # Load the controls systems library
# Parameters defining the system
m = 250.0 # system mass
k = 40.0 # spring constant
b = 60.0 # damping constant
# System matrices
A = matrix([[1, -1, 1.], [1, -k/m, -b/m], [1, 1, 1]])
B = matrix([[0], [1/m], [1]])
C = matrix([[1., 0, 1.]])
sys = ss(A, B, C, 0);
print sys
# Controllability
Wc = ctrb(A, B)
a = np.mat(A)
print "Wc = ", Wc
if np.linalg.matrix_rank(Wc) != a.shape[0]:
print ("System not Controllability\n")
else :
print ("System Controllability\n")
# Observability
Wo = obsv(A, C)
print "Wo = ", Wo
if np.linalg.matrix_rank(Wo) != a.shape[0]:
print ("System not Observability\n")
else :
print ("System Observability\n")
サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test
###注釈
この記事はPython Controlのexample test-statefbkの解説です。
###参考
PythonControlをインストールする
PythonControlで1自由度系の伝達関数を求める。
PythonControlで2自由度系の伝達関数を求める。