강의자료 · 제어공학2

Frequency Response

학습 목표

주파수마다 입력의 진폭과 위상이 어떻게 변하는지 알면 Bode plot을 실제 신호와 연결할 수 있습니다.

실행 조건

python-control의 ctl.frequency_response에서 magnitude와 phase를 읽습니다. 위상은 radian으로 반환되므로 표에는 degree로 변환하세요.

모듈이 없으면 Colab·Jupyter 코드 셀에서 %pip install control==0.10.2를 실행하세요.

정현파로 이득·위상 측정

시작 조건

G(s)=1s2+0.5s+1G(s)=\frac1{s^2+0.5s+1}, u=sin⁡(ωt)u=\sin(\omega t), ω∈{.2,1,3}\omega\in\{.2,1,3\} rad/s. 0≤t≤2000\le t\le 200 s, Δt=.01\Delta t=.01 s입니다.

진행 방법

  1. ctl.forced_response로 출력을 계산하고 마지막 두 주기만 골라 입력과 출력을 그리세요.
  2. 출력을 asin⁡(ωt)+bcos⁡(ωt)a\sin(\omega t)+b\cos(\omega t)에 최소제곱 적합해 이득 a2+b2\sqrt{a^2+b^2}와 위상 atan2⁡(b,a)\operatorname{atan2}(b,a)를 구하세요.
  3. ctl.frequency_response의 magnitude·phase와 비교하세요. phase는 radian으로 반환됩니다. 표의 위상은 두 계산 모두 degree로 변환하세요.

남길 결과

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
G=1/(s*s+.5*s+1)
omega=1.;t=np.arange(0,200,.01);u=np.sin(omega*t)
response=ctl.forced_response(G,t,u)
y=np.asarray(response.outputs).reshape(-1)
keep=t>=t[-1]-4*np.pi/omega
# TODO: keep 구간의 a,b를 적합하고 이득·위상을 계산하세요.

결과 기록·자가 점검

ω [rad/s]:

측정 이득:

계산 이득:

측정 위상 [deg]:

계산 위상 [deg]:

확인할 점

Damping과 공진 비교

시작 조건

분모를 s2+as+1s^2+as+1로 두고 a∈{.2,.5,1}a\in\{.2,.5,1\}을 비교합니다. ω는 logspace(-2,2,400)입니다.

진행 방법

  1. 세 모델의 이득·위상을 같은 주파수축에 그리세요.
  2. 각 모델의 최대 이득과 그 주파수, DC Gain을 표로 적으세요.
  3. 최대 이득 부근의 정현파 한 조건을 골라 첫 활동의 방법으로 확인하세요.

남길 결과

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
omega=np.logspace(-2,2,400)
for a in [.2,.5,1.]:
    response=ctl.frequency_response(1/(s*s+a*s+1),omega)
    print(a,np.max(response.magnitude))
# TODO: 위상과 공진 주파수 표를 완성하세요.

결과 기록·자가 점검

a:

최대 이득:

최대 이득의 ω:

DC Gain:

확인할 점

시간축에서 주파수 단위 확인

시작 조건

ω=1\omega=1 rad/s와 f=1f=1 Hz를 구분합니다. 두 번째 입력은 sin⁡(2πt)\sin(2\pi t)입니다.

진행 방법

  1. 두 입력의 주기를 먼저 적고 같은 G에서 응답을 계산하세요.
  2. 위상차를 시간 지연으로 읽은 값과 각도 값으로 읽은 값을 함께 적으세요.
  3. rad/s와 Hz를 섞었을 때 Bode plot에서 어떤 점을 잘못 읽게 되는지 설명하세요.

남길 결과

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
G=1/(s*s+.5*s+1)
for w in [1.,2*np.pi]:
 print(w,'period',2*np.pi/w)
# TODO: 두 입력의 응답을 비교하세요.

결과 기록·자가 점검

입력:

ω [rad/s]:

주기 [s]:

이득:

위상 [deg]:

확인할 점