Frequency-Domain Stability

실행 준비

Python 경로는 python-control을 사용합니다. 모듈이 없으면 Colab·Jupyter의 코드 셀에서 %pip install control==0.10.2를 실행하세요.

학습 목표

Time Response를 모두 돌리기 전에, Frequency Response와 열린 고리의 Pole로 안정성을 판단해 봅니다.

Open-loop와 Closed-loop의 불안정 Pole

시작 조건

G(s)=s2+10s+24s2−8s+15G(s)=\frac{s^2+10s+24}{s^2-8s+15}, K=.5K=.5,1. 음의 단위 Feedback입니다.

진행 방법

  1. Open-loop의 우반평면 Pole 수 P를 세세요.
  2. 각 K의 Nyquist plot을 그리고 Closed-loop Pole의 우반평면 개수 Z를 직접 계산하세요.
  3. -1점의 감김 방향에 대한 본인의 부호 규약을 적고 P·감김 수·Z의 관계를 확인하세요.

남길 결과

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
G=(s*s+10*s+24)/(s*s-8*s+15)
print('open-loop',ctl.poles(G))
for k in [.5,1.]:print(k,ctl.poles(ctl.feedback(k*G,1)))
# TODO: Nyquist 그림과 감김 수를 기록하세요.

결과 기록·자가 점검

K:

P:

감김 수와 방향:

Z:

Closed-loop 안정 여부:

확인할 점

안정 여유와 Gain 변화

시작 조건

G(s)=50s3+9s2+30s+40G(s)=\frac{50}{s^3+9s^2+30s+40}, K∈{1,3,5}K\in\{1,3,5\}를 비교합니다.

진행 방법

  1. margin(K*G)의 Gain Margin·Phase Margin·각 교차 주파수를 구하세요.
  2. Gain Margin은 선형 비와 20log10 변환한 dB 값을 나누어 표기하세요.
  3. 각 Closed-loop Pole과 Time Response를 확인해 여유와 안정성의 관계를 설명하세요.

남길 결과

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
G=50/(s**3+9*s*s+30*s+40)
for k in [1,3,5]:
 gm,pm,wcg,wcp=ctl.margin(k*G)
 print(k,gm,pm,wcg,wcp)
# TODO: ratio와 dB 열을 구분하고 Pole·응답을 확인하세요.

결과 기록·자가 점검

K:

GM [ratio]:

GM [dB]:

PM [deg]:

교차 ω [rad/s]:

안정 여부:

확인할 점

주파수 범위를 바꾸었을 때

시작 조건

같은 G에서 ω=[.1,1,10]만 본 경우와 logspace(-2,3,1000)을 본 경우를 비교합니다.

진행 방법

  1. 두 격자의 이득·위상을 비교하세요.
  2. 성긴 세 점만 보고 교차점과 안정 여유를 판단할 때 놓치는 정보를 적으세요.
  3. 판별 결과와 그래프 해상도를 혼동하지 않도록 계산 값과 시각적 근거를 함께 기록하세요.

남길 결과

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
G=50/(s**3+9*s*s+30*s+40)
coarse=np.array([.1,1,10]);fine=np.logspace(-2,3,1000)
# TODO: 두 격자의 frequency_response를 비교하세요.

결과 기록·자가 점검

주파수 격자:

관측한 교차점:

계산 GM·PM:

판단의 한계:

확인할 점