# 가우스 소거법: C++ Eigen3

가우스 소거법(Gaussian Elimination)은 선형 방정식 시스템을 푸는 데 널리 사용되는 알고리즘이다. 이 방법을 C++에서 Eigen3 라이브러리를 이용해 구현하는 과정은 선형 대수의 기본적인 이해를 요구하며, 효율적인 수치 해석을 가능하게 한다. Eigen3는 C++에서 행렬 연산을 효율적으로 수행할 수 있는 강력한 라이브러리이다.

#### 가우스 소거법 개요

가우스 소거법은 선형 방정식 시스템을 해결하기 위해 다음과 같은 두 가지 주요 단계를 수행한다:

1. **전진 소거(Forward Elimination)**: 시스템을 상삼각 행렬 형태로 변환한다.
2. **역방향 대입(Back Substitution)**: 상삼각 행렬로부터 해를 구한다.

이 방법은 시스템의 계수를 변형하여 해를 구할 수 있게 해주며, Eigen3는 이러한 수치적 연산을 효율적으로 수행할 수 있는 기능을 제공한다.

#### Eigen3 라이브러리 소개

Eigen3은 C++에서 행렬 연산을 지원하는 라이브러리로, 빠르고 직관적인 API를 제공한다. Eigen3는 다음과 같은 주요 특징을 가지고 있다:

* **템플릿 기반 설계**: 고성능 수치 연산을 위해 템플릿을 사용한다.
* **자동화된 메모리 관리**: 동적 배열 및 메모리 관리를 자동으로 수행한다.
* **고성능**: 최적화된 코드로 인해 매우 빠른 연산 성능을 제공한다.

Eigen3의 주요 클래스는 `Matrix`와 `Vector`로 구성되며, 이들은 기본적인 선형 대수 연산을 지원한다.

#### Eigen3에서의 가우스 소거법 구현

Eigen3을 사용하여 가우스 소거법을 구현하려면, 주어진 선형 시스템을 상삼각 행렬로 변환하고 해를 구하는 과정이 필요하다. 아래는 Eigen3을 사용한 가우스 소거법의 예제이다:

1. **헤더 파일 포함**: Eigen3 라이브러리를 사용하기 위해 필요한 헤더 파일을 포함한다.

   ```cpp
   #include <Eigen/Dense>
   #include <iostream>
   ```
2. **행렬 및 벡터 정의**: 선형 방정식 시스템의 계수 행렬과 상수 벡터를 정의한다.

   ```cpp
   Eigen::MatrixXd A(3, 3);
   Eigen::VectorXd b(3);
   Eigen::VectorXd x(3);
   ```
3. **행렬 및 벡터 초기화**: 계수 행렬과 상수 벡터의 값을 설정한다.

   ```cpp
   A << 2, 1, -1,
        -3, -1, 2,
        -2, 1, 2;
   b << 8, -11, -3;
   ```
4. **가우스 소거법 적용**: Eigen3의 `ColPivHouseholderQR` 또는 `PartialPivLU`를 사용하여 가우스 소거법을 수행한다.

   ```cpp
   Eigen::ColPivHouseholderQR<Eigen::MatrixXd> qr(A);
   x = qr.solve(b);
   ```
5. **해 출력**: 계산된 해를 출력한다.

   ```cpp
   std::cout << "해: \n" << x << std::endl;
   ```

이 예제는 Eigen3의 `ColPivHouseholderQR` 분해를 사용하여 시스템을 해결하는 방법을 보여준다. `ColPivHouseholderQR`는 선형 시스템을 효율적으로 해결하기 위해 부분 피봇팅을 사용하는 방법이다.

#### 관련 자료:

***

* Eigen3 공식 문서: <https://eigen.tuxfamily.org/dox/>
* C++ Eigen3 예제 및 사용법: <https://eigen.tuxfamily.org/dox/GettingStarted.html>
* "Numerical Linear Algebra" by Lloyd N. Trefethen and David Bau, III

이 자료들은 Eigen3 라이브러리의 사용법과 가우스 소거법을 보다 깊이 이해하는 데 도움이 될 것이다.
