Control Engineering II, Week 5 - Note 2
English translation
Transfer function
Install the control library
!pip install controlCollecting control Downloading control-0.10.0-py3-none-any.whl (513 kB) [2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m513.9/513.9 kB[0m [31m4.5 MB/s[0m eta [36m0:00:00[0m [?25hRequirement already satisfied: numpy>=1.23 in /usr/local/lib/python3.10/dist-packages (from control) (1.25.2) Requirement already satisfied: scipy>=1.8 in /usr/local/lib/python3.10/dist-packages (from control) (1.11.4) Requirement already satisfied: matplotlib>=3.6 in /usr/local/lib/python3.10/dist-packages (from control) (3.7.1) Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (1.2.0) Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (4.50.0) Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (1.4.5) Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (24.0) Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (9.4.0) Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (3.1.2) Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.6->control) (2.8.2) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib>=3.6->control) (1.16.0) Installing collected packages: control Successfully installed control-0.10.0
numpy, control, matplotlib import
import numpy as np
import control as ctl
import matplotlib.pyplot as plt
Entering a simple transfer function as variable H
A transfer function is in symbolic form by default
num = np.array([2])
den = np.array([5, 1])
H = ctl.tf(num, den)
HTransferFunction(array([2]), array([5, 1]))
Connecting two transfer functions in series (multiplication)
num1 = np.array([2])
den1 = np.array([1, 0])
num2 = np.array([3])
den2 = np.array([4, 1])
H1 = ctl.tf(num1, den1)
H2 = ctl.tf(num2, den2)
Hs = ctl.series(H1, H2)
HsTransferFunction(array([6]), array([4, 1, 0]))
Hs = H1*H2
HsTransferFunction(array([6]), array([4, 1, 0]))
Connecting two transfer functions in parallel (addition)
Hp = ctl.parallel(H1, H2)
HpTransferFunction(array([11, 2]), array([4, 1, 0]))
Hp = H1+H2
HpTransferFunction(array([11, 2]), array([4, 1, 0]))
Finding poles and zeros of a transfer function
A plot is drawn when plot=True or when the argument is omitted
(p, z) = ctl.pzmap(Hp, plot=False)
p, z(array([-0.25+0.j, 0. +0.j]), array([-0.18181818+0.j]))
(p, z) = ctl.pzmap(Hp)<Figure size 640x480 with 1 Axes>
Feedback connection
(For unity feedback, the feedback gain is 1)
num = np.array([2])
den = np.array([1 , 0])
L = ctl.tf(num, den)
H = ctl.feedback(L, 1)
HTransferFunction(array([2]), array([1, 2]))
Getting lists of numerator and denominator coefficients from a transfer function
num_, den_ = ctl.tfdata(H)
num_, den_([[array([2])]], [[array([1, 2])]])
Enter a -order transfer function as G
G = ctl.tf([3],[4, 1, 1])
GTransferFunction(array([3]), array([4, 1, 1]))
Examining the step response
t,y = ctl.step_response(G)
plt.plot(t,y)
plt.xlabel('Time')
plt.title('Response of a Second Order System')Text(0.5, 1.0, 'Response of a Second Order System')
<Figure size 640x480 with 1 Axes>