Pythonでボード線図を描く方法について

Python,イメージ

AI実装検定のご案内

Pythonでボード線図(Bode plot)を描くには、主に制御工学(Control Engineering)や信号処理(Signal Processing)の分野で使われるライブラリを活用します。

以下では、matplotlibscipycontrolライブラリを使ったボード線図の描き方を、基礎から詳しく解説します。

目次

ボード線図とは

ボード線図は、線形時不変システム(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()

まとめ

Python,イメージ
方法特徴
controlライブラリ制御系に特化、伝達関数・状態空間にも対応。描画も簡単。
scipy.signalより汎用的。細かく制御したいときに便利だがやや手間。
matplotlib可視化のみ。生データが必要。組み合わせて使うことが多い。

以上、Pythonでボード線図を描く方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次