###目的
Python Controlで、状態フィードバックのゲインを調べる。
###事前準備
PythonControlをインストールする
###状態フィードバックのゲインを求める。
control.place
関数により、希望の極配置とするための状態フィードバックゲインKを求める。
control.place(A, B, p)
- Parameters
- A: System 行列
- B: Control 行列
- p: 希望の極配置
- Returns:
- K: A-BKで希望の固有値を与える状態フィードバックのゲイン
###サンプルコード
./slicot-test.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
from matplotlib import pyplot as plt
# 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);
# 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")
# Eigenvalue placement
#from slycot import sb01bd
K = place(A, B, [-3, -2, -1])
print "Pole place: K = ", K
print "Pole place: eigs = ", np.linalg.eig(A - B * K)[0]
sys_fb = ss(sys.A-sys.B*K, sys.B, sys.C, sys.D)
out_fb, t_fb = impulse(sys_fb, T = arange(0, 10, 0.01))
plt.plot(t_fb, out_fb)
plt.ylim([-1,1])
plt.show()
$ ./slicot-test.py
Wc = [[ 0. 0.996 2.24064 ]
[ 0.004 -0.24064 0.7935424]
[ 1. 1.004 1.75936 ]]
System Controllability
Pole place: K = [[ 15.80864382 -3.63298165 7.85453193]]
Pole place: eigs = [-3. -2. -1.]
希望の極配置([-3, -2, -1])に設計できていることが確認でき、
インパルス応答に対して、状態フィードバックにより振動が収束している。
サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test
###注釈
この記事はPython Controlのexample slicot-test.pyの解説です。
###参考
PythonControlをインストールする
PythonControlで1自由度系の伝達関数を求める。
PythonControlで2自由度系の伝達関数を求める。