LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-09

目的

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1