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:

Phase plot:

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

good blog