Control Engineering II, Week 5 - Note 2

English translation

Transfer function

Install the control library

!pip install control
Collecting control
  Downloading control-0.10.0-py3-none-any.whl (513 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 513.9/513.9 kB 4.5 MB/s eta 0:00:00
[?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)
H
TransferFunction(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)
Hs
TransferFunction(array([6]), array([4, 1, 0]))
Hs = H1*H2
Hs
TransferFunction(array([6]), array([4, 1, 0]))

Connecting two transfer functions in parallel (addition)

Hp = ctl.parallel(H1, H2)
Hp
TransferFunction(array([11,  2]), array([4, 1, 0]))
Hp = H1+H2
Hp
TransferFunction(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)
H
TransferFunction(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 2nd2^{nd}-order transfer function as G

G = ctl.tf([3],[4, 1, 1])
G
TransferFunction(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>
실행 결과