# Bode Plots using Python

I needed a quick way to plot some Bode plots for a second order system. I didn’t have access to Matlab, instead I searched for a solution using Python, and I found one. Documentation is a bit sparse  so this example might be helpful.

The signals packages supports the signal.bode method which turned out to be quite easy to use. Signal is part of the scipy package and is something we bundle with our Tellurium platform.

There a more comprehensive discussion of Python and Control Theory here.

```#
import numpy as np
from scipy import signal
from matplotlib import pyplot as plt

# Coefficients in numerator of transfer function
num = [1]
# Coefficients in denominator of transfer function
# High order to low order, eg 1*s^2 + 0.1*s + 1
den = [1, 0.1, 1]

# Scan over zeta, a parameter for a second-order system
zetaRange = np.arange(0.1,1.1,0.1)

f1 = plt.figure()
for i in range(0,9):
den = [1, 2*zetaRange[i], 1]
print den
s1 = signal.lti(num, den)
% Specify our own frequency range: np.arange(0.1, 5, 0.01)
w, mag, phase = signal.bode(s1, np.arange(0.1, 5, 0.01).tolist())
plt.semilogx (w, mag, color="blue", linewidth="1")
plt.xlabel ("Frequency")
plt.ylabel ("Magnitude")
plt.savefig ("c:\\mag.png", dpi=300, format="png")

plt.figure()

for i in range(0,9):
den = [1, zetaRange[i], 1]
s1 = signal.lti(num, den)
w, mag, phase = signal.bode(s1, np.arange(0.1, 10, 0.02).tolist())
plt.semilogx (w, phase, color="red", linewidth="1.1")
plt.xlabel ("Frequency")
plt.ylabel ("Amplitude")
plt.savefig ("c:\\phase.png", dpi=300, format="png")
%
```

Output from Python script:

Magnitude plot:

Phase plot:

This entry was posted in General Science Interest, Modeling, Programming, Software, Systems Theory. Bookmark the permalink.

### One Response to Bode Plots using Python

1. Yan says:

Thanks for sharing the knowledge. Pretty new to python. Not sure what “%” syntax does here. Is it for some documentation automation tools?

2. ouyou says:

good blog