Python
制御工学
PythonControl

PythonControlで可制御性・可観測性を調べる

More than 1 year has passed since last update.

目的

Python Controlで、可制御性・可観測性を調べる。

事前準備

PythonControlをインストールする

可制御と可観測性

可制御とは、システムの状態を入力で動かす(制御する)ことができるか?、
可観測性とは、システムの状態を出力から推定する(観測する)ことができるか?、
を表す。

可制御を調べる

可制御は、可制御行列がフルランクであるか、否か、で判断する。

control.ctrb(A, B)

  • Parameters
    • A: System 行列
    • B: Control 行列
  • Returns:
    • Wc: 可制御行列

可観測性を調べる

可観測は、可観測行列がフルランクであるか、否か、で判断する。

control.obsv(A, C)

  • Parameters
    • A: System 行列
    • C: Output 行列
  • Returns:
    • Wo: 可観測行列

行列の階数(ランク)を調べる

 行列の階数(ランク)はNumPyの関数matrix_rank()で求めることができる。

numpy.linalg.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自由度系の伝達関数を求める。