제1부 시스템 모델링과 동특성
1.4 시스템 식별 입문
제1부 시스템 모델링과 동특성 · 마무리. 1.1~1.3이 물리에서 모델→응답으로 갔다면, 이 장은 거꾸로 측정 데이터→모델이다. 실제 플랜트에 입력을 넣고 나온 응답으로 $K, \tau, \omega_n, \zeta$를 추정하고, 그 모델을 검증하는 법.
이 장을 마치면 계단·주파수 응답 측정에서 1·2차 모델을 도출하고, "이 모델을 신뢰해도 되나"를 과적합 없이 판단할 수 있어야 한다. 실물 로봇(제7부 7.2)에서 내 모터의 모델을 얻는 출발점이다.
1.4.1 왜 식별 — 제1원리만으로 부족할 때
1.1의 제1원리 모델은 강력하지만 한계가 있다.
- 파라미터를 모른다: $K_t, J, b$를 데이터시트가 안 주거나, 마모·온도로 변한다.
- 물리가 복잡·미지: 마찰 비선형, 탄성, 부하 변동을 다 적기 어렵다.
- 블랙박스: 내부를 모르는 장치(남이 만든 액추에이터)도 제어해야 한다.
시스템 식별(system identification)은 실제 입출력 데이터로 모델을 맞추거나 보정한다. 제1원리와 경쟁이 아니라 보완이다 — 물리로 구조를 정하고(몇 차계인지), 데이터로 숫자를 채운다($\tau$가 얼마인지). 이 장으로 제1부의 모델→응답→모델 고리가 닫힌다.
1.4.2 식별 절차 — 다섯 단계
⑤가 핵심이다. 적합(④)만으로 끝내면 과적합을 검출하지 못한다(1.4.8).
1.4.3 무엇을 식별하나 — 구조 고르기
- 비모수(non-parametric): 임펄스·계단응답 곡선, 주파수응답(Bode) 점들 자체. 구조 가정이 적다.
- 모수(parametric): 전달함수·차분방정식의 계수($K, \tau, \omega_n, \zeta$ 또는 ARX 계수). 콤팩트해 설계에 바로 쓴다.
원칙: 단순한 구조부터 시도하라. 1차(+지연)나 2차로 시작해 잔차(residual)를 보고, 부족하면 차수를 높인다. 처음부터 고차 모델은 잡음까지 외워(과적합) 새 데이터에서 맞지 않는다. "충분히 단순한 가장 좋은 모델"(1.1.11과 같은 정신).
1.4.4 계단응답 식별 — 가장 실용적
입력에 계단을 주고 출력 곡선을 읽는다. 현장에서 가장 많이 쓴다.
1.4.4.1 1차 + 지연 (FOPDT) — 공정제어의 표준
많은 실제 플랜트는 1차 + 시간지연(First-Order Plus Dead Time)으로 잘 근사된다:
$$G(s) \approx \frac{K\cdot e^{-Ls}}{\tau s + 1} \qquad K\text{: 정상상태 이득},\ \ \tau\text{: 시정수},\ \ L\text{: 지연(死time)}$$
측정 계단응답에서 그래픽으로 도출한다.
- 이득 $K = \Delta y/\Delta u$ (출력 변화 ÷ 입력 계단 크기).
- 두 점 법(Smith): 최종값의 28.3%·63.2% 도달 시각 $t_1, t_2$에서
$$\tau = 1.5\cdot(t_2 - t_1), \qquad L = t_2 - \tau$$
- 지연 $L$은 측정·전송·수송 지연(컨베이어, 열전달)에서 생기며, 제어를 까다롭게 한다(위상 손실, 2.4).
수치 예(위 그림): 참값 $K=2, \tau=3, L=1$인 FOPDT를 계단응답으로 읽으면 28.3% 도달 시각 $t_1\approx2.0 \,\mathrm{s}$, 63.2% 도달 시각 $t_2\approx4.0 \,\mathrm{s}$다. 두 점 법에 대입하면 $\tau=1.5\cdot(4.0-2.0)=3.0$, L=4.0−3.0=1.0 — 참값 $\tau=3, L=1$을 정확히 되찾는다. 그래프만 보고 $t_1, t_2$를 읽을 수 있다면, 이 두 줄 계산으로 모델이 나온다.
1.4.4.2 2차 저감쇠 — 오버슈트·피크로 역산
응답이 진동하면(오버슈트 있음) 2차 저감쇠다. 1.3.3.3의 역산을 그대로 쓴다.
- $\zeta = -\ln(M_p) / \sqrt{\pi^2 + \ln^2 M_p}$, $M_p =$ (오버슈트량)/(정상값) $= \%\mathrm{OS}/100$
- $\omega_n = \pi / (T_p\cdot\sqrt{1-\zeta^2})$, $T_p =$ 피크 시각
- $K =$ 정상값 / 입력 계단 크기
즉 오버슈트로 $\zeta$를, 피크시간으로 $\omega_n$을 읽는다. (정착시간 $Ts\approx4/\zeta\omega_n$로 교차검증하면 좋다.)
1.4.5 주파수응답 식별
플랜트에 여러 주파수의 정현파를 하나씩 넣고, 정상상태에서 출력의 진폭비와 위상차를 잰다. 그 점들이 곧 Bode 선도(2.3)다.
각 $\omega$에서: 이득 $\vert G(j\omega)\vert= \mathrm{B/A}$, 위상 $\angle G(j\omega) = \psi$. $\omega$를 스윕하며(sine sweep / chirp) 점을 모아 곡선에 적합한다.
- 장점: 각 주파수에서 여러 주기를 평균하므로 잡음에 강하다. 공진($\omega_n$)·대역폭이 직접 보인다.
- 단점: 시간이 걸리고, 시스템을 한동안 여기해야 한다. 불안정 플랜트에는 폐루프로 조심히.
- 결과 Bode에서 꺾임 주파수·기울기로 극·영점을 읽어 전달함수를 맞춘다(2.3에서 역으로 활용).
1.4.6 최소제곱·ARX — 모수적 적합 (개념)
디지털로 데이터를 모았다면, 차분방정식 모델을 최소제곱으로 한 번에 맞출 수 있다(ARX: AutoRegressive with eXogenous input):
$$y[k] = -a_1 y[k-1] - \cdots - a_n y[k-n] + b_1 u[k-1] + \cdots + b_m u[k-m] + e[k]$$
측정 데이터를 행렬로 쌓아 $Y = \Phi\cdot\theta$ 꼴로 만들면, 파라미터 $\theta=(a_1\ldots,b_1\ldots)$는
$$\hat{\theta} = (\Phi^T\Phi)^{-1}\cdot\Phi^T\cdot Y$$ — 최소제곱해 (잔차 제곱합 최소)
로 단번에 나온다. 이산모델·z변환은 제3부(3.1)에서 제대로 다루므로, 여기서는 "데이터를 쌓아 최소제곱으로 계수를 푼다"는 감만. 도구는 numpy.linalg.lstsq, MATLAB System Identification Toolbox, Python SIPPY 등.
1.4.7 실험 설계의 함정 — 좋은 데이터가 먼저다
"Garbage in, garbage out." 적합 알고리즘보다 데이터 품질이 결과를 정한다.
- 충분 여기(persistent excitation): 입력이 시스템을 충분히 다양하게 여기해야 한다. 일정한 입력은 동특성을 안 드러낸다(정상상태만 보임). 계단 여러 번, PRBS(의사난수 이진열), chirp(주파수 스윕)가 좋다. 파라미터가 $p$개면 그만큼 풍부한 입력이 필요.
- 신호 대 잡음비(SNR): 입력을 너무 작게 주면 잡음에 묻힌다. 너무 크게 주면 포화·비선형 영역에 들어간다.
- 동작점: 식별은 여기한 그 동작점 근처의 선형 모델이다(1.1.9). 다른 동작점에서는 다시 식별해야 할 수 있다.
- 표본주기: 너무 느리면 빠른 동특성을 놓치고(에일리어싱, 3.2), 너무 빠르면 잡음만 증폭한다.
- 개루프 vs 폐루프: 불안정 플랜트는 폐루프로 식별하되, 피드백이 입력-출력 상관을 만들어 편향을 부를 수 있음을 유의.
1.4.8 검증 — 과적합을 피하라
⚠️ 가장 흔한 실수: 적합 데이터에 모델이 잘 맞는 것을 성공으로 착각하는 것. 고차 모델은 잡음까지 외워 적합 오차를 0에 가깝게 만들 수 있지만 — 그것은 과적합이고 새 데이터에서 맞지 않는다.
올바른 검증:
- 데이터 분리: 데이터를 추정용(estimation)과 검증용(validation)으로 나눠, 검증용에서 모델 예측 vs 실측을 비교한다(교차검증).
- 새 데이터 시뮬레이션: 모델로 검증용 입력을 시뮬레이션해 실측 출력과 겹쳐 본다.
- 잔차 분석: 잔차(실측−예측)가 백색잡음에 가까워야 한다. 잔차에 패턴(추세·진동)이 남으면 모델이 무언가를 놓친 것(차수 부족·비선형).
- 물리 점검: 추정된 $K, \tau$가 물리적으로 타당한가? $\tau$가 음수면 불안정하다는 뜻 — 데이터·구조를 의심.
좋은 모델 = 적합 데이터가 아니라 못 본 데이터를 잘 맞히는 모델.
1.4.9 도구로 — curve_fit으로 FOPDT 맞추기
계단응답 데이터 $(t, y)$(단위 계단 가정)에 1차+지연을 맞추는 예:
# fopdt_fit.py — 계단응답에서 K, τ, L 추정
import numpy as np
from scipy.optimize import curve_fit
# t, y : 측정한 시간·출력 배열 (단위 계단 입력 가정)
def fopdt(t, K, tau, L):
return np.where(t >= L, K*(1.0 - np.exp(-(t - L)/tau)), 0.0)
popt, pcov = curve_fit(fopdt, t, y, p0=[1.0, 1.0, 0.1]) # 초기추정 p0
K, tau, L = popt
print(f"K={K:.3f} tau={tau:.3f} L={L:.3f}")
# 검증: 다른 구간 데이터에 대해 fopdt(t_val, *popt) vs y_val 비교
- $p0$(초기추정)이 부정확하면 잘못된 국소해로 수렴한다 — 1.4.4.1의 그래픽 추정값을 $p0$로 주면 안정적이다.
- 더 본격적인 식별은 MATLAB sysid toolbox·
SIPPY등을 쓴다.
(코드 동작·추정값은 여러분의 데이터·환경에서 재현해 확인 — 검증 필요. 위 예는 합성/실측 데이터가 있어야 돌아간다.)
1.4.10 정직 — 식별 모델의 한계
- 국소·대역 한정: 여기한 동작점·주파수 범위 안에서만 유효하다. 밖에서는 어긋난다.
- 편향-분산 절충: 너무 단순하면 구조적 오차(편향), 너무 복잡하면 과적합(분산). 검증으로 균형점을 찾는다.
- 불확실성은 남는다: 추정에는 항상 오차가 따른다(
pcov가 그 척도). 이 불확실성을 견디게 설계하는 것이 견고 제어(6.3)다.
식별 모델도 결국 근사다. 다만 데이터로 뒷받침된 근사라는 점이 강점이고, 어느 범위에서 유효한지를 아는 것이 그 모델을 안전하게 쓰는 길이다.
1.4.11 정리 — 제1부 마무리
- 시스템 식별 = 데이터→모델. 제1원리(1.1)와 보완 관계: 물리로 구조, 데이터로 숫자.
- 실용 1순위는 계단응답 식별(FOPDT 두 점 법, 2차는 오버슈트·피크로 역산), 잡음에는 주파수응답 식별이 강하다.
- 적합보다 검증이 중요하다 — 데이터를 나눠 못 본 데이터로 확인하고, 잔차·물리 타당성을 점검해 과적합을 피한다(1.4.8).
- 데이터 품질(충분 여기·SNR·동작점·표본주기)이 결과를 좌우한다(1.4.7).
이로써 제1부(모델링과 동특성)를 마친다. 우리는 이제 플랜트를 ① 물리로 세우고(1.1), ② 전달함수로 적고(1.2), ③ 응답을 읽고(1.3), ④ 데이터로 보정(1.4)할 수 있다. 다음 제2부(2.1~)부터는 이 모델 위에 제어기를 설계한다 — 먼저 안정성(2.1)부터.
1.4.12 연습·생각해 볼 것
- FOPDT 추정. 단위 계단(Δu=1)에 대한 응답이 최종값 2.0에 정착했고, 0.566(=28.3%)에 도달한 시각이 1.2 s, 1.264(=63.2%)에 도달한 시각이 2.0 s였다. $K, \tau, L$을 두 점 법으로 구하라. (1.4.4.1)
- 2차 역산. 계단응답이 정상값 1.0을 12% 넘겨(피크 1.12) 피크시각 0.8 s를 보였다. $\zeta, \omega_n$을 추정하고 전달함수를 적어라. 정착시간(2%)은 얼마로 예상되나? (1.4.4.2)
- 여기 부족. 어떤 학생이 모터에 일정한 전압을 계속 주고 속도를 기록해 모델을 식별하려 했다. 왜 이 데이터로는 $\tau$를 알 수 없는가? 어떤 입력을 줘야 하나? (1.4.7)
- 과적합 판별. 두 모델 A(2차)·B(8차)가 있다. A는 추정 데이터에서 오차 5%, B는 0.1%였다. 그런데 검증 데이터에서는 A가 6%, B가 40%였다. 어느 모델을 택해야 하며 왜인가? (1.4.8)
- 잔차 읽기. 식별 후 잔차에 느린 사인파가 남아 있다면, 모델이 무엇을 놓쳤을 가능성이 큰가? 어떻게 대응하겠나? (1.4.8)
- (생각거리) 제7부에서 제어할 실제 DC모터(1.1.7)가 있다고 하자. 1.4.2의 다섯 단계를 그 모터에 어떻게 적용할지 한 문단으로 설계하라 — 어떤 입력, 무엇을 측정, 어떤 구조, 어떻게 검증?
- (손으로) 임의의 1차계(예: $1/(2s+1)$)를
python-control로 계단응답을 만들고 잡음을 약간 더한 뒤,fopdt_fit.py(1.4.9)로 $K, \tau$를 되찾아 보라. 잡음을 키우면 추정이 얼마나 변동하나? (검증 필요)
막히면 "구조는 단순하게, 검증은 못 본 데이터로"를 떠올려라 — 식별의 절반은 보수적 검증이다.