LoginSignup
5
3

More than 5 years have passed since last update.

Python Controlで、状態フィードバックのゲインを求める。

Last updated at Posted at 2017-12-10

目的

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.]

state_feedback.jpg
希望の極配置([-3, -2, -1])に設計できていることが確認でき、
インパルス応答に対して、状態フィードバックにより振動が収束している。

サンプルコードは以下に格納。
https://github.com/nnn112358/python-control_test

注釈

この記事はPython Controlのexample slicot-test.pyの解説です。

参考

PythonControlをインストールする
PythonControlで1自由度系の伝達関数を求める。
PythonControlで2自由度系の伝達関数を求める。

5
3
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
5
3