AEGLOSLAB 제어공학 종합 핸드북

제2부 고전 제어: 해석과 설계

2.1 안정성

제2부 고전 제어: 해석과 설계 · 시작. 안정성은 제어의 전제 조건이다(0.1.7) — 불안정하면 정확도·속도를 따질 것도 없이 발산한다. 안정성의 정의(BIBO·극 판정), 특성방정식, 그리고 근을 직접 안 풀고 안정성을 판정하는 Routh-Hurwitz를 다룬다.

이 장을 마치면 폐루프의 안정 여부를 극 위치로 정의하고, Routh-Hurwitz로 근을 풀지 않고도 판정하며, 안정성을 보장하는 이득 범위를 구할 수 있어야 한다.

2.1.1 왜 안정성이 먼저인가

피드백은 양날의 칼이다(0.1.3). 잘 걸면 외란을 억제하지만, 잘못 걸면 오차가 스스로 커져 발산한다 — 마이크 하울링, 진동하다 부서지는 기계. 그래서 어떤 성능 지표(정확도·속도·오버슈트)보다 안정성이 0순위다. 불안정한 시스템에서 "정상상태 오차"를 논하는 것은 의미가 없다.

좋은 소식: 선형(LTI) 시스템의 안정성은 극의 위치 하나로 완전히 판정된다.

2.1.2 안정성의 정의들

2.1.2.1 BIBO 안정 (입력-출력 관점)

BIBO(Bounded-Input Bounded-Output) 안정: 유계인(bounded) 입력에 대해 출력도 유계로 남으면 BIBO 안정. 즉 "유한한 입력에 유한하게 반응"한다.

2.1.2.2 극 판정 — 좌반평면이면 안정

LTI 시스템에서 BIBO·점근 안정성은 극의 실부 부호로 결정된다(0.2·1.2의 그 극). 각 극 $p=\sigma+j\omega$가 응답에 $e^{\sigma t}$ 포락선을 만들기 때문이다.

극 위치응답판정
모든 극 $\operatorname{Re}<0$ (좌반평면)모든 모드 감쇠안정 (점근·BIBO)
극 하나라도 $\operatorname{Re}>0$ (우반평면)그 모드 발산불안정
단순 극이 허수축 $\operatorname{Re}=0$, 나머지 LHP지속 진동(안 커지지만 안 잦음)경계 안정(marginal)
허수축 중복 극$t\cdot\sin$처럼 커짐불안정
✓ 안정 ✗ 불안정 경계(허수축) σ jω
s-평면 안정성 판정

⚠️ 경계 안정의 함정: 허수축 위 단순 극(예: 순수 적분기, 무감쇠 진동자)은 발산은 안 하지만 BIBO 안정은 아니다 — 그 진동수에 맞는 입력(공진)을 주면 출력이 무한히 커진다. 그래서 엄밀한 BIBO 안정은 "모든 극이 열린 좌반평면(strictly LHP)"을 요구한다. 경계는 별도 범주로, 설계에서는 보통 피한다(취약하다).

2.1.3 특성방정식 — 안정성이 결정되는 곳

폐루프의 극은 폐루프 전달함수 $T(s)$의 분모, 즉 특성방정식의 근이다. 단위 피드백·개루프 $L(s)=C(s)G(s)$면(1.2.5.3):

  • $T(s) = L/(1+L)$ → 특성방정식: $1 + L(s) = 0$

L=N_L/D_L로 쓰면 1+L=0 ⇔ D_L(s)+N_L(s)=0. 이 다항식의 근이 모두 좌반평면이면 폐루프 안정. 그러니 문제는 "이 다항식이 우반평면 근을 갖는가"로 귀결된다.

근을 직접 풀면(numpy.roots) 끝이지만, ① 손으로 고차를 풀기 어렵고 ② 파라미터(이득 $K$)가 들어가면 근이 $K$의 함수라 일일이 못 푼다. 그래서 근을 안 풀고 판정하는 도구가 필요하다 — Routh-Hurwitz.

2.1.4 필요조건 — 계수 부호로 1차 걸러내기

본격 판정 전, 추가 비용 없는 필터가 있다. 특성다항식 $a_ns^n+\cdot\cdot\cdot+a_1s+a_0$가 안정하려면(필요조건):

  • 모든 계수가 존재해야 한다(빠진 차수 = 계수 0이 있으면 의심).
  • 모든 계수의 부호가 같아야 한다.

이 중 하나라도 어기면 즉시 불안정(우반평면 근 또는 허수축 근 존재) — Routh를 돌릴 것도 없다.

주의: 이것은 필요조건일 뿐 충분조건이 아니다. 계수가 다 있고 부호가 같아도 불안정할 수 있다(차수 ≥3). 예: $s^3+s^2+2s+8$은 계수가 다 양수지만 불안정(아래 Routh로 확인). 그래서 충분한 판정에는 Routh가 필요하다.

2.1.5 Routh-Hurwitz 판별

근을 풀지 않고 우반평면 근의 개수를 세는 방법. 특성다항식 계수로 표를 만든다.

2.1.5.1 배열 만들기

$a_3s^3+a_2s^2+a_1s+a_0$(3차 예시)의 Routh 배열:

$$\begin{array}{c|ccl} s^3 & a_3 & a_1 & \\ s^2 & a_2 & a_0 & \\ s^1 & b_1 & 0 & \qquad b_1 = (a_2\cdot a_1 - a_3\cdot a_0) / a_2 \\ s^0 & a_0 & & \qquad (\text{맨 아래는 } a_0 \text{ 그대로 내려옴}) \end{array}$$

각 새 행은 바로 위 두 행에서 "엇갈려 곱해 빼고 바로 위 행의 첫 항으로 나눈" 값이다. 일반식: 두 단계 위 행을 $(p_1,p_2,p_3,\ldots)$, 바로 위 행을 $(q_1,q_2,q_3,\ldots)$라 하면 새 행의 $k$번째 항은

$$r_k = (q_1\cdot p_{k+1} - p_1\cdot q_{k+1}) / q_1$$

행은 $s^0$까지 내려간다. ($q_1=0$이면 이 나눗셈이 정의되지 않는다 — 2.1.5.3의 $\varepsilon$ 치환으로 처리한다.)

2.1.5.2 판정 — 첫 열의 부호 변화 = 우반평면 근 수

Routh-Hurwitz 판정: 배열 첫 열의 부호 변화 횟수 = 우반평면(불안정) 근의 개수. 부호 변화가 0이면(첫 열이 모두 같은 부호) 안정.

예제 $s^3+6s^2+11s+6$ (= (s+1)(s+2)(s+3), 안정해야 함):

$$\begin{array}{c|l} s^3 & 1 \quad 11 \\ s^2 & 6 \quad 6 \\ s^1 & (6\cdot 11 - 1\cdot 6)/6 = 10 \\ s^0 & 6 \end{array}$$

첫 열 1, 6, 10, 6 — 전부 양수, 부호 변화 0 → 안정. ✓ (근이 −1,−2,−3과 일치.)

반례 $s^3+s^2+2s+8$:

$$\begin{array}{c|l} s^3 & 1 \quad 2 \\ s^2 & 1 \quad 8 \\ s^1 & (1\cdot 2 - 1\cdot 8)/1 = -6 \\ s^0 & 8 \end{array}$$

첫 열 1, 1, −6, 8 — 부호가 +→−→+로 두 번 바뀐다 → 우반평면 근 2개, 불안정. (계수가 다 양수였는데도! 2.1.4의 경고 그대로.)

2.1.5.3 특수 경우 둘

  • 첫 열에만 0이 나오면: 그 0을 작은 양수 $\varepsilon$로 치환하고 계속 진행한 뒤 $\varepsilon\to0^+$로 부호를 본다. ($\varepsilon$ 위아래 부호가 바뀌면 우반평면 근.)
  • 한 행이 전부 0이면: 허수축에 대칭인 근(주로 $\pm j\omega$ 쌍)이 있다는 신호 → 경계/진동. 바로 윗행으로 보조다항식(auxiliary polynomial)을 만들어 그 근이 곧 대칭 근이다. (다음 절 $K=6$ 예에서 실제로 본다.)

예제 — 첫 열에만 0인 경우 $s^4+s^3+2s^2+2s+1$:

$$\begin{array}{c|cccl} s^4 & 1 & 2 & 1 & \\ s^3 & 1 & 2 & 0 & \\ s^2 & b_1 & b_2 & & \qquad \begin{array}{l} b_1 = (1\cdot 2 - 1\cdot 2)/1 = 0, \\ b_2 = (1\cdot 1 - 1\cdot 0)/1 = 1 \end{array} \end{array}$$

$s^2$ 행의 첫 항이 0이다(나머지 항은 0이 아니므로 "한 행 전부 0"이 아니라 "첫 열에만 0"인 경우). $b_1\to\varepsilon$로 치환하고 계속:

$$\begin{array}{c|lll} s^4 & 1 & 2 & 1 \\ s^3 & 1 & 2 & 0 \\ s^2 & \varepsilon & 1 & 0 \\ s^1 & (2\varepsilon - 1)/\varepsilon & 0 & \\ s^0 & 1 & & \end{array}$$

($s^1$ 첫 항 $= (\varepsilon\cdot2 - 1\cdot1)/\varepsilon= (2\varepsilon-1)/\varepsilon$, $s^0$ 첫 항은 그 다음 행에서 1로 정리된다.) $\varepsilon\to0^+$일 때 $(2\varepsilon-1)/\varepsilon\to-\infty$ — 큰 음수다. 첫 열을 순서대로 보면 $1(+), 1(+), \varepsilon(+), (2\varepsilon-1)/\varepsilon(-), 1(+)$ → 부호가 +→+→+→−→+로 두 번 바뀐다 → 우반평면 근 2개, 불안정.

검증: numpy.roots([1,1,2,2,1]) (docker ce-verify로 직접 실행) → 근은 $0.1217\pm j1.3066$(우반평면, 2개)과 $-0.6217\pm j0.4406$(좌반평면, 2개). Routh가 예측한 부호변화 2회와 정확히 일치 — 이 다항식은 우반평면 근 정확히 2개로 불안정(경계가 아니라 확실한 불안정임에 주의: 허수축 위 근은 없다). ✅ 검증됨.

2.1.6 설계에 쓰기 — 안정 이득 범위

Routh의 실질적 힘은 파라미터가 든 경우다. 단위 피드백, $L(s)=K/[s(s+1)(s+2)]$(비례 이득 $K$). 특성방정식:

$$s(s+1)(s+2) + K = s^3 + 3s^2 + 2s + K = 0$$

Routh:

$$\begin{array}{c|l} s^3 & 1 \quad 2 \\ s^2 & 3 \quad K \\ s^1 & (3\cdot 2 - 1\cdot K)/3 = (6 - K)/3 \\ s^0 & K \end{array}$$

첫 열이 모두 양수일 조건:

  • $(6-K)/3 > 0$ → $K < 6$
  • $K > 0$
  • ⟹ $0 < K < 6$ 에서 폐루프 안정
  • $K$를 키울수록 좋을 것 같지만, $K=6$을 넘으면 불안정해진다. 이것이 피드백의 핵심 긴장 — 이득과 안정의 트레이드오프.
  • 임계 $K=6$: $s^1$ 행이 0이 된다(행 전체 0의 특수경우). 윗행 $s^2$로 보조다항식 $3s^2+K = 3s^2+6 = 0$ → $s=\pm j\sqrt2$. 즉 $K=6$에서 폐루프 극이 허수축 $\pm j\sqrt2$를 지나며 각주파수 √2 rad/s로 지속 진동한다(경계). 이 임계이득·임계진동수는 PID 튜닝(Ziegler-Nichols)의 핵심 재료다(2.5).

2.1.7 상대 안정성과 한계

  • Routh는 "안정/불안정(예-아니오)"과 우반평면 근 개수만 준다 — 얼마나 안정한지(여유)는 못 준다. 그 정량적 여유(이득·위상 여유)는 2.4이 다룬다.
  • 상대 안정성 변형: 모든 극이 $\operatorname{Re} < -\sigma$(특정 선보다 왼쪽, 즉 정착 사양 1.3.4)인지 보려면, $s \to s+\sigma$로 치환해 옮긴 다항식에 Routh를 적용하면 된다.

2.1.7.1 예제 — 축 이동으로 정착 여유 확인

2.1.6의 $L(s)=K/[s(s+1)(s+2)]$ 특성방정식 $s^3+3s^2+2s+K$를 다시 쓴다. Routh는 $0<K<6$이면 안정하다고 했지만, "안정"은 "겨우 좌반평면"일 뿐 — 정착 시간 사양(1.3.4, $ts\approx4/\sigma$)까지 만족하는지는 별개다. $ts\le10s$를 원한다고 하자 → $\sigma=4/10=0.4$, 즉 모든 극이 Re<−0.4이기를 요구한다.

s=w−0.4로 치환:

$$\begin{aligned} &(w-0.4)^3 + 3(w-0.4)^2 + 2(w-0.4) + K \\ &= w^3 + 3(1-0.4)w^2 + (3\cdot 0.4^2-6\cdot 0.4+2)w + (K-0.4^3+3\cdot 0.4^2-2\cdot 0.4) \\ &= w^3 + 1.8w^2 + 0.08w + (K-0.384) \end{aligned}$$

이 옮긴 다항식에 Routh:

$$\begin{array}{c|l} w^3 & 1\phantom{.8} \quad 0.08 \\ w^2 & 1.8 \quad (K - 0.384) \\ w^1 & (1.8\cdot 0.08 - 1\cdot(K - 0.384))/1.8 = (0.528 - K)/1.8 \\ w^0 & (K - 0.384) \end{array}$$

첫 열이 모두 양수이려면 K−0.384>0이고 0.528−K>0 — 즉 $0.384 < K < 0.528$에서만 모든 극이 Re<−0.4(정착 10초 이내)를 만족한다. 2.1.6의 "안정 범위" $0<K<6$과 비교하면 훨씬 좁다 — $K=3$처럼 Routh상 정상적으로 안정한 값도 이 사양은 못 만족한다는 뜻이다.

검증(numpy.roots, docker ce-verify): $K=0.384$에서 근 −2.154, −0.446, −0.400(경계, 최대실부 정확히 −0.4), $K=0.45$에서 $-2.176, -0.412\pm j0.192$(모두 Re<−0.4, 조건 만족), $K=0.528$에서 근 $-2.2, -0.4\pm j0.283$(다시 경계), $K=1$에서 $-2.325, -0.338\pm j0.562$(Re=−0.338>−0.4, 조건 미달) — 계산이 정확히 맞다. 흥미롭게도 이 시스템은 이득을 아무리 골라도 Re<−0.4을 지키는 폭이 K∈(0.384, 0.528)뿐이다 — 근궤적(2.2.4)의 분기점 −0.42(R5)보다 왼쪽으로는 어떤 $K$도 극을 이동시키지 못한다는 사실과 맞닿아 있다: 분기점 좌표가 이 방향의 한계에 가깝기 때문이다. ✅ 검증됨.

2.1.8 도구로 — 근 직접 계산

실무에서 고정 파라미터면 단순히 근을 수치로 푼다.

# stability.py — 특성다항식의 근으로 안정성 판정
import numpy as np
poly = [1, 3, 2, 6]                 # s³+3s²+2s+6  (K=6: 경계 예상)
roots = np.roots(poly)
print("roots:", roots)
print("안정?" , np.all(np.real(roots) < 0))   # 모든 극 Re<0 ?

$K=6$이면 $\pm j\sqrt2$ 근처 근이 나와 경계임을 본다. (여러분 환경에서 재현 — ✅ control 0.10.2 검증됨; 재현 권장.)

정직: 수치 근 계산이 있는데 Routh를 왜 배우나? ① 파라미터 범위($0<K<6$ 같은 기호적 조건)는 수치 근으로 못 얻는다. ② 손으로 구조를 보는 직관(어떤 계수가 안정성을 해치나)을 준다. ③ 임계이득·임계진동수가 튜닝에 바로 쓰인다(2.5). 둘은 보완재다.

2.1.9 정직 — BIBO vs 내부 안정, 그리고 상쇄

  • 숨은 모드: 극 판정은 전달함수가 내부 상태를 다 보여줄 때만 완전하다. 1.2.9의 불안정 극·영점 상쇄처럼, 전달함수에서 사라진 모드가 내부에 살아 발산할 수 있다(내부 불안정). 안전한 판정은 상태공간에서 가제어·가관측을 함께 본다(4.2). "$T(s)$가 안정해 보여도 내부가 안정하다는 보장은 아니다."
  • 경계의 취약성: 허수축 위 극은 모델 오차·작은 외란에 쉽게 우반평면으로 넘어간다. 설계 목표는 "겨우 안정"이 아니라 여유 있게 안정(2.4)이다.
  • 선형 한정: 이 모든 판정은 LTI 모델 기준이다. 포화·비선형이 크면 선형 안정성이 실제를 보장하지 못한다(6.2).

2.1.10 정리 — 그리고 다음 장

  • 안정성은 전제 조건. LTI에서는 모든 극이 열린 좌반평면 ⇔ 안정(2.1.2). 경계(허수축 단순극)는 별도 범주이며 취약하다.
  • 폐루프 안정성은 특성방정식 $1+L(s)=0$의 근으로 판정한다(2.1.3).
  • 필요조건(계수 다 존재·동부호)으로 1차 거르고(2.1.4), Routh-Hurwitz로 근을 안 풀고 우반평면 근 수를 센다(2.1.5). 파라미터가 들면 안정 이득 범위($0<K<6$)와 임계이득·임계진동수를 준다(2.1.6).

다음 2.2에서는 이득 $K$가 변할 때 폐루프 극이 어디로 움직이는지를 그리는 근궤적법을 다룬다 — Routh가 "어느 $K$까지 안정?"에 답했다면, 근궤적은 "극이 그리는 길 전체"를 보여 준다.

2.1.11 연습·생각해 볼 것

  1. 극으로 판정. 다음 폐루프 극 집합 각각을 안정/불안정/경계로 분류하라: ⓐ $\{-1, -2\pm j3\}$, ⓑ {−1, +0.1}, ⓒ $\{-2, \pm j5\}$, ⓓ {0, 0, −3}. (2.1.2)
  2. 필요조건. $s^4 + 2s^3 + 0\cdot s^2 + 5s + 3$ 와 $s^3 + 2s^2 - s + 4$는 Routh 없이도 불안정이라 말할 수 있다. 각각 어떤 규칙을 어겼나? (2.1.4)
  3. Routh 판정. $s^4 + 2s^3 + 3s^2 + 4s + 5$의 Routh 배열을 만들고 우반평면 근의 개수를 구하라. 안정한가?
  4. 안정 이득 범위. 단위 피드백 $L(s)=K/[s(s+2)(s+4)]$에 대해 폐루프가 안정한 $K$ 범위를 Routh로 구하라. 임계이득 K_c와 그때의 진동 각주파수를 구하라. (2.1.6)
  5. 경계의 의미. 4번의 K=K_c에서 폐루프 응답은 시간영역에서 어떤 모습인가? 왜 이 상태를 설계 목표로 삼으면 안 되나? (2.1.2.2 함정)
  6. 상쇄 재방문. 1.2.11의 6번(불안정 극 $s=2$를 제어기 영점으로 상쇄)에서, $T(s)$의 특성방정식만 보면 안정해 보일 수 있다. 왜 이 판정이 위험한지 2.1.9로 설명하라.
  7. (손으로) 4번에서 구한 K_c 부근(예: 0.9K_c, K_c, 1.1K_c)으로 numpy.roots를 실행해 극이 허수축을 넘어가는 것을 직접 확인하라. (검증 필요)

막히면 "안정 = 모든 극이 좌반평면", "Routh 첫 열 부호변화 = 우반평면 근 수" 두 문장으로 돌아가라.