이제 더위도 지나가려는 것 같습니다.(이 글을 쓰고 있는 시점에서는 비도오고 선선하네요^^) 저는 최근 예전에 배웠던 것들을 다시 확인하고 있는데요. 의외로 아주 재미있습니다.^^. 오늘은 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()
'Theory > ControlTheory' 카테고리의 다른 글
[필터연재] 2차 디지털 Band Pass, Band Stop 필터 (18) | 2017.01.11 |
---|---|
[필터연재] 2차 디지털 저역/고역 통과필터 (18) | 2017.01.06 |
[필터연재] 1차 디지털 저역/고역 통과필터 (16) | 2017.01.05 |
Bode Plot의 기초 중에서도 기초이야기 (28) | 2016.08.17 |
역 Z-변환된 차분 방정식을 C 코드로 계산하기 (4) | 2016.07.22 |
Craig의 Robotics 5장. Jacobian 자코비안 (25) | 2016.03.18 |
Craig의 Robotics 4장 예제. PUMA 560의 역기구학 풀이 (Inverse Kinematics) (14) | 2016.02.17 |