7.5 고윳값과 대칭행렬

실습 · 연습문제 2개

이차형식의 타원 축 ellipse-axes

대칭 양의 정부호 행렬 S\mathbf{S}에 대해 x⊤Sx=1\mathbf{x}^\top\mathbf{S}\mathbf{x} = 1인 점들의 집합은 타원(고차원에서는 타원체)이다. 스펙트럴 정리 S=QΛQ⊤\mathbf{S} = \mathbf{Q}\boldsymbol{\Lambda}\mathbf{Q}^\top로 좌표를 바꾸면 ∑iλiyi2=1\sum_i \lambda_i y_i^2 = 1이 되므로, 타원의 축은 고유벡터 qi\mathbf{q}_i 방향이고 반축의 길이는 1/λi1/\sqrt{\lambda_i}이다.

함수 ellipse_axes(S)를 완성해 (lengths, directions)를 반환한다.

반환 shape 내용
lengths (n,) 반축의 길이, 긴 것부터 내림차순
directions (n, n) ii번째 열이 lengths[i]에 대응하는 단위 방향 벡터

S\mathbf{S}가 대칭이 아니거나(허용오차 1e-10) 양의 정부호가 아니면 ValueError를 발생시킨다.

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

  • 대각행렬 diag⁡(4,0.25)\operatorname{diag}(4, 0.25)에서 반축 (2,0.5)(2, 0.5)와 방향 (0,±1)(0, \pm 1), (±1,0)(\pm 1, 0)
  • 반축 끝점 ℓidi\ell_i\mathbf{d}_i가 타원 위에 있다: (ℓidi)⊤S(ℓidi)=1(\ell_i\mathbf{d}_i)^\top\mathbf{S}(\ell_i\mathbf{d}_i) = 1
  • 방향 벡터들이 정규직교다
  • 고윳값에 0이나 음수가 있으면, 또는 비대칭이면 ValueError

힌트: np.linalg.eigh는 고윳값을 오름차순으로 준다. 긴 반축은 작은 고윳값에 대응한다는 점을 떠올리면 정렬을 따로 하지 않아도 된다.

거듭제곱법 power-iteration

정사각행렬 A\mathbf{A}의 절댓값이 가장 큰 고윳값(지배 고윳값)이 하나이고 나머지보다 엄격히 클 때, 거듭제곱법은 다음 반복으로 그 고유벡터를 찾는다.

vk+1=Avk∥Avk∥,λk=vk⊤Avk(∥vk∥=1).\mathbf{v}_{k+1} = \frac{\mathbf{A}\mathbf{v}_k}{\lVert\mathbf{A}\mathbf{v}_k\rVert}, \qquad \lambda_k = \mathbf{v}_k^\top\mathbf{A}\mathbf{v}_k \quad (\lVert\mathbf{v}_k\rVert = 1).

함수 power_iteration(A, num_iters=10000, tol=1e-10, seed=0)를 완성해 (lam, v)를 반환한다.

  • v: 길이가 1인 고유벡터 추정, shape (n,)
  • lam: Rayleigh quotient로 구한 고윳값 추정(실수)
  • 시작 벡터는 np.random.default_rng(seed)로 만든 무작위 벡터를 쓴다.
  • 연속한 두 고윳값 추정의 차이가 tol보다 작아지면 멈춘다. 최대 num_iters번 반복한다.

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

  • 대칭행렬에서 np.linalg.eigh의 지배 고윳값·고유벡터와 같다(고유벡터는 부호를 무시하고 비교).
  • 본문 실습의 Leslie 행렬(비대칭)에서 지배 고윳값 1.0801을 찾는다.
  • 지배 고윳값이 음수인 행렬(예: 고윳값 −3-3과 11)에서도 −3-3을 찾는다.

힌트: 지배 고윳값이 음수이면 vk\mathbf{v}_k의 부호가 매 step 바뀐다. 그래서 벡터끼리의 차이 ∥vk+1−vk∥\lVert\mathbf{v}_{k+1} - \mathbf{v}_k\rVert로 수렴을 판정하면 영원히 멈추지 않는다. 고윳값 추정의 변화로 판정하거나, 부호를 무시하고 비교한다.