# 제 3장: 고유값과 고유벡터

## 3.1 고유값과 고유벡터 (Eigenvalues and Eigenvectors)

선형 변환의 중요한 개념 중 하나는 고유값과 고유벡터이다. 고유값과 고유벡터는 행렬이 벡터를 변환할 때, 벡터의 방향을 변화시키지 않으면서 스칼라 배율만을 변형하는 특성을 나타낸다.

### 3.1.1 정의

행렬 $ \mathbf{A} $가 주어졌을 때, 벡터 $ \mathbf{v} $가 고유벡터이고 스칼라 $ \lambda $가 고유값이라고 한다면 다음을 만족해야 한다:

$$
\mathbf{A} \mathbf{v} = \lambda \mathbf{v}
$$

여기서:

* $ \mathbf{A} $는 $ n \times n $ 행렬이다.
* $ \mathbf{v} $는 고유벡터로, 제로가 아닌 벡터이다.
* $ \lambda $는 고유값으로, 스칼라 값이다.

### 3.1.2 고유값과 고유벡터 찾기

고유값 $ \lambda $를 찾기 위해서는 다음과 같은 방정식을 해결해야 한다:

$$
\text{det}(\mathbf{A} - \lambda \mathbf{I}) = 0
$$

여기서 $ \text{det} $는 행렬의 행렬식(determinant)이고, $ \mathbf{I} $는 단위 행렬이다. 이 방정식은 **고유다항식**(characteristic polynomial)을 정의하며, 이 다항식의 근이 고유값이 된다.

고유값 $ \lambda $를 알고 나면, 고유벡터 $ \mathbf{v} $는 다음 방정식을 통해 찾을 수 있다:

$$
(\mathbf{A} - \lambda \mathbf{I}) \mathbf{v} = \mathbf{0}
$$

## 3.2 대각화 (Diagonalization)

행렬 $ \mathbf{A} $가 대각화 가능한 경우, 즉 $ \mathbf{A} $를 대각 행렬 $ \mathbf{D} $로 변환할 수 있는 경우, 이를 대각화(diagonalization)라고 한다. 대각화는 다음과 같은 형태로 표현된다:

$$
\mathbf{A} = \mathbf{P} \mathbf{D} \mathbf{P}^{-1}
$$

여기서:

* $ \mathbf{P} $는 $ \mathbf{A} $의 고유벡터를 열 벡터로 하는 행렬이다.
* $ \mathbf{D} $는 대각 행렬로, 고유값을 대각선에 가진 행렬이다.
* $ \mathbf{P}^{-1} $는 $ \mathbf{P} $의 역행렬이다.

대각화가 가능한 경우, 행렬 $ \mathbf{A} $의 거듭제곱, 함수, 또는 기타 연산을 간단하게 처리할 수 있다.

## 3.3 C++ Eigen3를 이용한 고유값과 고유벡터 계산

Eigen3 라이브러리를 사용하여 행렬의 고유값과 고유벡터를 계산하는 방법을 살펴보겠다.

### 3.3.1 고유값과 고유벡터 계산 예제

```cpp
#include <Eigen/Dense>
#include <iostream>

int main() {
    // 행렬 정의
    Eigen::Matrix2d A;
    A << 4, 1,
         2, 3;

    // EigenSolver를 사용하여 고유값과 고유벡터 계산
    Eigen::EigenSolver<Eigen::Matrix2d> solver(A);

    // 고유값 출력
    Eigen::Vector2cd eigenvalues = solver.eigenvalues();
    std::cout << "Eigenvalues: " << eigenvalues.transpose() << std::endl;

    // 고유벡터 출력
    Eigen::Matrix2cd eigenvectors = solver.eigenvectors();
    std::cout << "Eigenvectors: \n" << eigenvectors << std::endl;

    return 0;
}
```

이 코드에서는 `Eigen::EigenSolver` 클래스를 사용하여 행렬 $ \mathbf{A} $의 고유값과 고유벡터를 계산한다. `eigenvalues()` 함수는 복소수 형태로 고유값을 반환하고, `eigenvectors()` 함수는 각 고유값에 대한 고유벡터를 반환한다.

## 3.4 예제: 고유값과 고유벡터

다음은 위 코드에서 사용된 행렬 $ \mathbf{A} $의 고유값과 고유벡터를 직접 계산한 결과이다:

$$
\mathbf{A} = \begin{pmatrix} 4 & 1 \ 2 & 3 \end{pmatrix}
$$

이 행렬의 고유값은 다음과 같다:

$$
\lambda\_1 = 5, \quad \lambda\_2 = 2
$$

고유벡터는 다음과 같다:

$$
\mathbf{v}\_1 = \begin{pmatrix} 0.7071 \ 0.7071 \end{pmatrix}, \quad \mathbf{v}\_2 = \begin{pmatrix} -0.7071 \ 0.7071 \end{pmatrix}
$$

여기서 고유벡터는 정규화되어 있으므로 길이가 1이다.

## 3.5 요약

이 장에서는 고유값과 고유벡터의 정의와 계산 방법을 소개하였다. 또한, 대각화를 통해 행렬의 특성을 이해하고 변환할 수 있는 방법을 설명하였다. Eigen3를 사용하여 이러한 계산을 간편하게 수행하는 방법도 살펴보았다. 다음 장에서는 선형 대수의 응용, 특히 시스템의 안정성 분석 및 데이터 분석에 대한 내용을 다루겠다.
