강의자료 · 제어공학2

제어공학2 5주차 - Note 2

Transfer function

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

간단한 transfer function을 변수 H에 입력해보기

Transfer function은 기본적으로 symbol 형태이다

num = np.array([2])
den = np.array([5, 1])
H = ctl.tf(num, den)
H
TransferFunction(array([2]), array([5, 1]))

두 개의 transfer function series 연결 (곱셈)

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]))

두 개의 transfer function parallel 연결 (덧셈)

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]))

Transfer function에서 pole과 zero 구하기

plot=True로 하거나, 입력하지 않으면 그래프가 그려진다

(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 연결

(Unity feedback인 경우 feedback gain이 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]))

Transfer function으로부터 수식의 numerator, denominator 상수 리스트 받아오기

num_, den_ = ctl.tfdata(H)
num_, den_
([[array([2])]], [[array([1, 2])]])

2nd2^{nd}-order transfer function을 G에 입력

G = ctl.tf([3],[4, 1, 1])
G
TransferFunction(array([3]), array([4, 1, 1]))

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>
실행 결과