Pythonでボード線図(Bode plot)を描くには、主に制御工学(Control Engineering)や信号処理(Signal Processing)の分野で使われるライブラリを活用します。
以下では、matplotlib
やscipy
、control
ライブラリを使ったボード線図の描き方を、基礎から詳しく解説します。
目次
ボード線図とは
ボード線図は、線形時不変システム(LTIシステム)の周波数応答を表すための2つのグラフの組み合わせです。
- ゲイン(振幅)特性:縦軸にゲイン(dB)、横軸に周波数(logスケール)
- 位相特性:縦軸に位相(度)、横軸に周波数(logスケール)
必要なライブラリのインストール
以下のライブラリが必要です。
!pip install control matplotlib numpy
簡単な伝達関数のボード線図の描き方(control
ライブラリ)
例
import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
# 伝達関数 G(s) = 1 / (s + 1)
num = [1]
den = [1, 1]
sys = ctrl.TransferFunction(num, den)
# ボード線図の描画
# 'Plot' を 'plot' に修正
mag, phase, omega = ctrl.bode(sys, dB=True, Hz=False, deg=True, plot=True)
# グラフをきれいに表示
plt.show()
解説
TransferFunction(num, den)
:分子・分母の係数を指定して伝達関数を定義bode(sys)
:ゲインと位相を計算し、プロットも可能dB=True
:ゲインをデシベル表示deg=True
:位相を度表示Hz=False
:横軸の単位をラジアン/秒にする(Hzにしたい場合はHz=True
)
複数の伝達関数を比較したい場合
sys1 = ctrl.TransferFunction([1], [1, 1])
sys2 = ctrl.TransferFunction([1], [1, 3, 2])
ctrl.bode([sys1, sys2], dB=True)
plt.legend(["1st order", "2nd order"])
plt.show()
自作のフィルター関数やラプラス表現がある場合
# 例:低域通過フィルタ(LPF):H(s) = 10 / (s + 10)
lpf = ctrl.TransferFunction([10], [1, 10])
ctrl.bode(lpf, dB=True)
plt.show()
応用:非因果系やゼロ極を含む系もOK
例えば、以下のようなゼロ・極の多いシステム。
sys = ctrl.TransferFunction([1, 3], [1, 4, 3]) # G(s) = (s+3)/(s^2 + 4s + 3)
ctrl.bode(sys, dB=True)
plt.show()
補足:scipy.signal
でも描画可能
from scipy import signal
# 伝達関数
system = signal.TransferFunction([1], [1, 1])
# 周波数領域(ラジアン/秒)
w, mag, phase = signal.bode(system)
# プロット
plt.figure()
plt.subplot(2, 1, 1)
plt.semilogx(w, mag)
plt.title('Bode plot (scipy)')
plt.ylabel('Magnitude (dB)')
plt.subplot(2, 1, 2)
plt.semilogx(w, phase)
plt.xlabel('Frequency [rad/s]')
plt.ylabel('Phase [degrees]')
plt.tight_layout()
plt.show()
まとめ

方法 | 特徴 |
---|---|
control ライブラリ | 制御系に特化、伝達関数・状態空間にも対応。描画も簡単。 |
scipy.signal | より汎用的。細かく制御したいときに便利だがやや手間。 |
matplotlib | 可視化のみ。生データが必要。組み合わせて使うことが多い。 |
以上、Pythonでボード線図を描く方法についてでした。
最後までお読みいただき、ありがとうございました。