24.6 시스템 식별과 상태 추정

실습 · 연습문제 2개

칼만 필터의 갱신 단계 kalman-update

예측 단계가 끝난 사전분포 N(m−,P−)\mathcal{N}(\mathbf{m}^-, \mathbf{P}^-)와 새 측정 y=Hx+v\mathbf{y} = \mathbf{H}\mathbf{x} + \mathbf{v}, v∼N(0,R)\mathbf{v} \sim \mathcal{N}(\mathbf{0}, \mathbf{R})가 주어졌다. 갱신 단계는 다음과 같다.

S=HP−H⊤+R,K=P−H⊤S−1,\mathbf{S} = \mathbf{H}\mathbf{P}^-\mathbf{H}^\top + \mathbf{R}, \qquad \mathbf{K} = \mathbf{P}^-\mathbf{H}^\top\mathbf{S}^{-1}, m=m−+K(y−Hm−),P=(I−KH)P−.\mathbf{m} = \mathbf{m}^- + \mathbf{K}(\mathbf{y} - \mathbf{H}\mathbf{m}^-), \qquad \mathbf{P} = (\mathbf{I} - \mathbf{K}\mathbf{H})\mathbf{P}^-.

함수 kf_update(m, P, y, H, R)를 완성해 (m_new, P_new)를 반환한다.

인자 shape
m (n,)
P (n, n)
y (k,)
H (k, n)
R (k, k)

테스트는 다음을 확인한다.

  • 11.4장의 가우시안 조건부분포 공식으로 계산한 결과와 같다.
  • 측정 잡음이 매우 크면 갱신이 거의 일어나지 않는다.
  • 갱신된 공분산은 대칭이고, 측정한 방향의 분산은 줄어든다.

힌트: S−1\mathbf{S}^{-1}을 직접 구하지 말고 np.linalg.solve(S, ...)를 쓴다. K=P−H⊤S−1\mathbf{K} = \mathbf{P}^-\mathbf{H}^\top\mathbf{S}^{-1}이고 S\mathbf{S}가 대칭이므로 K⊤=S−1HP−\mathbf{K}^\top = \mathbf{S}^{-1}\mathbf{H}\mathbf{P}^-다.

STLSQ로 동역학 방정식 찾기 stlsq

시간미분 X˙∈RT×d\dot{\mathbf{X}} \in \mathbb{R}^{T \times d}와 후보 함수 라이브러리 Θ∈RT×p\mathbf{\Theta} \in \mathbb{R}^{T \times p}가 주어졌을 때

X˙≈Θ Ξ\dot{\mathbf{X}} \approx \mathbf{\Theta}\,\mathbf{\Xi}

를 만족하는 희소한 계수 행렬 Ξ∈Rp×d\mathbf{\Xi} \in \mathbb{R}^{p \times d}를 순차 임계 최소제곱(STLSQ)으로 구한다.

  1. 최소제곱 해 Ξ\mathbf{\Xi}로 시작한다.
  2. 절댓값이 thresh보다 작은 계수를 0으로 만든다.
  3. 출력 열 kk마다, 0이 아닌 계수에 해당하는 라이브러리 열만으로 최소제곱을 다시 풀어 그 계수들을 갱신한다.
  4. 2–3을 iters번 반복한다.

함수 stlsq(Theta, dX, thresh, iters=10)를 완성해 Xi(shape (p, d))를 반환한다. 한 번 0이 된 계수는 다시 살아나지 않는다(3단계에서 남은 열만 쓰므로).

테스트는 감쇠 진동자 x˙=−0.1x+2y\dot{x} = -0.1x + 2y, y˙=−2x−0.1y\dot{y} = -2x - 0.1y의 궤적과 2차까지의 단항식 라이브러리로, 참 계수 네 개만 남는지 확인한다.

힌트: np.linalg.lstsq(A, b, rcond=None)[0]. 열 선택에는 불리언 마스크를 쓴다.