【Python/SciPy】伝達関数と状態方程式の相互変換

Pythonモジュール「SciPy」を用いて、伝達関数と状態方程式を相互変換する方法をソースコード付きでまとめました。

伝達関数 → 状態方程式

Pythonモジュール「SciPy」ではtt2ssメソッドで伝達関数G(s)を状態方程式に変換できます。
※Matlabとほとんど同じなのでわかりやすいです。

今回は、以下の伝達関数を状態方程式に変換してみます。

(1)   \begin{eqnarray*} G(s)=\frac{s^2+3s+1}{s^2+5s+1} \end{eqnarray*}

(2)   \begin{eqnarray*} \dot{x}=Ax+Bu\\ y=Cx+Du \end{eqnarray*}

参考ページ
公式 scipy.signal.tf2ssリファレンス
原理 【制御理論】状態方程式と伝達関数の相互変換

ソースコード

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
from scipy.signal import tf2ss

# 伝達関数の分母・分子の係数
num = [1, 3, 1] # 分母係数
den = [1, 5, 1] # 分子係数

# 伝達関数 → 状態方程式
A, B, C, D = tf2ss(num, den)

# 状態方程式の各行列
print('A=', A)
print('B=', B)
print('C=', C)
print('D=', D)

■実行結果

A= [[-5. -1.]
 [ 1.  0.]]
B= [[ 1.]
 [ 0.]]
C= [[-2.  0.]]
D= [[ 1.]]

状態方程式 → 伝達関数

Pythonモジュール「SciPy」ではss2tfメソッドで状態方程式を伝達関数G(s)に変換できます。

# -*- coding: utf-8 -*-
from scipy.signal import ss2tf

# 伝達関数の分母・分子の係数
A = [[-5, -1], [1, 0]]
B = [[1], [0]]
C = [[-2, 0]]
D = 1

# 伝達関数 → 状態方程式
G = ss2tf(A, B, C, D)

# 状態方程式の各行列
print('G(s)=', G)
G(s)= (array([[1, 3, 1]]), array([ 1.,  5.,  1.]))
おすすめ記事
1 【Python】制御シミュレーション入門【制御工学入門】古典~現代制御の基本原理【Python入門】サンプル集【NumPy入門】サンプル集【SciPy入門】サンプル集
Python制御理論
技術雑記

コメント

タイトルとURLをコピーしました