5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

制御工学Advent Calendar 2017

Day 11

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?