본문으로 바로가기

이제 더위도 지나가려는 것 같습니다.(이 글을 쓰고 있는 시점에서는 비도오고 선선하네요^^) 저는 최근 예전에 배웠던 것들을 다시 확인하고 있는데요. 의외로 아주 재미있습니다.^^. 오늘은 2차계 시스템의 응답특성의 원리와 개념 등등 말고^^ 그냥 결과만 간략하게 정리를 해볼까 합니다. 뭐 전 그게 좋아용^^

궤환 시스템 중에서 2차 궤환시스템의 블럭 선도입니다. 심플하죠^^

입력과 출력을 s-domain에서 표현하면 위 수식처럼 될 것입니다.

2차계의 표준형으로 표현될 수도 있습니다.^^

여기에 입력을 단위계단을 넣으면 시스템의 단위계단 응답 특성을 알 수 있습니다.

R(s)에 대입해서 정리하면 위와 같이 되겠죠...

그걸 라플라스 역변환을 하면 위와 같이 됩니다. 저 식을 MATLAB이나 Python으로 그려보면~

이런 결과를 얻게 됩니다. 여기서부터 2차계 시스템의 응답특성을 하나씩 확인해보죠^^

퍼센트 오버슈트의 정의입니다. 최고값과 최종값의 차이에 대한 백분율입니다.

만약 정착시간이 0.02이내라면 위와 같이 정리가 가능합니다. 그러면~

정착시간(settling time)은 간략히 위 공식으로 구해집니다.

그리고 최고치로 올라가는 Peak Time은 위 식으로 도출되구요...

그 때의 첨두값(peak value)은 위 식으로 구해집니다.

PO를 좀더 공식화하면 위와 같습니다.^^

Rising Time의 10%부터 90%지점만 계산한느 T_r1은 위에 나타나 있습니다.

아`~ 만약 zeta를 알지 못 한다면, 정착시간에 들어올때까지 몇 번 진동하는지 세어봐도 됩니다. 위 그래프에서는 1.5회정도 진동했는데요.

그걸 공식에 넣으면 위 결과를 얻습니다. 실제 zeta를 0.4로 두고 그렸는데 근하하네요. 이렇게 구한 zeta는 

0.2와 0.6 사이에 있어야 신뢰할 수 있습니다. 아~~ 위 그래프를 그린 Python Code는 아래에 있습니다.^^

import numpy as np
from matplotlib import pyplot as plt

zeta = 0.4
omega_n = 1

beta = np.sqrt(1-np.square(zeta))
theta = np.arccos(zeta)

Fs = 10*1000
Ts = 1/Fs

endTime = 20

t = np.arange(0.0, endTime, Ts)

y = np.zeros(len(t))
for n in np.arange(0,len(t)):
    y[n] = 1 - (1/beta) * np.exp(-zeta*omega_n*t[n]) * np.sin(omega_n*beta*t[n]+theta)

plt.figure(figsize=(15,6))
plt.plot(t, y, lw=3)
plt.axhline(y=1, color='k', lw=2, ls='dashed')

Tp = np.pi / (omega_n * np.sqrt(1-np.square(zeta)))
M_pt = 1 + np.exp(-zeta*np.pi/np.sqrt(1-np.square(zeta)))

plt.axvline(Tp, color='k', lw=2, ls='dashed')
plt.annotate('Peak Time $ T_p = \pi / ( \omega_n \sqrt{1-\zeta^2} ) $', 
             xy=(Tp, M_pt), xytext=(5,1.25), 
             size=13, arrowprops=dict(facecolor='black'))
plt.text(7.35, 1.15, 'Peak Value $ M_{Pt} = 1+e^{-\zeta \pi / \sqrt{1-\zeta^2}} $', 
         size=13, horizontalalignment='center', verticalalignment='center')
     
Ts = 4/zeta/omega_n

plt.axvline(Ts, color='k', lw=2, ls='dashed')
plt.annotate('Settling Time $ T_s = 4/(\zeta\omega_n) $', 
             xy=(Ts, 1.02), xytext=(11,1.1), 
             size=13, arrowprops=dict(facecolor='black'))

P_O = 100*np.exp(-zeta*np.pi/np.sqrt(1-np.square(zeta)))
plt.text(6, 0.75, P_O, 
         size=13, horizontalalignment='center', verticalalignment='center')
plt.annotate('P.O. $ = 100e^{-\zeta\pi / \sqrt{1-\zeta^2}} $', 
             xy=(Tp, 1.1), xytext=(4,0.8), 
             size=13, arrowprops=dict(facecolor='black'))

plt.axvline(2.16, color='k', lw=2, ls='dashed')
plt.annotate('Rising Time $ T_r $ ', xy=(2.16, 0), xytext=(4, 0.1), size=13,
            arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=0.7'))

plt.plot([0, 0.5, 0.5], [0.1, 0.1, 0], 'k--', lw=2)
plt.plot([0, 1.92, 1.92], [0.9, 0.9, 0], 'k--', lw=2)
plt.plot([0.5, 1.92], [0.05, 0.05], 'c--', lw=2)
plt.annotate('Rising Time $ T_{r1} = (2.16\zeta+0.6)/\omega_n $ ', xy=(1.21, 0.05), xytext=(4, 0.3), size=13,
            arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=0.7'))
T_r1 = (2.16*zeta+0.6)/omega_n
plt.text(9.6, 0.32, T_r1, 
         size=13, horizontalalignment='center', verticalalignment='center')

plt.grid(True)
plt.ylim(0,1.45)
plt.show()

신고