2020년 7월 14일 화요일

가우스 소거법(Gaussian Elimination)

[경고] 아래 글을 읽지 않고 "가우스 소거법"을 보면 바보로 느껴질 수 있습니다.
누가 뭐라고 하더라도 행렬(行列, Matrix) 이론이 시작되고 행렬이 강점을 발하는 분야는 연립 방정식(聯立方程式, simultaneous equations or system of linear equations)의 체계적인 해법이다. 예를 들어 아래와 같은 3원 1차 연립 방정식의 해를 행렬로 구하자.

                          (1)

여기서 값을 모르는 원소(元素, element) 혹은 변수(變數, variable)가 세 개이므로 3원(元)이다. 식 (1)에 나온 미지수 $x, y, z$를 풀기 위해 다음과 같은 행렬을 만든다.

                          (2)

식 (2)를 풀 때 손쉬운 방법은 다음처럼 역행렬(inverse matrix)을 구해서 행렬 곱을 계산하면 된다.

                          (3)

하지만 식 (3)이 연립 방정식을 푸는 효과적인 방법일까? 식 (3)에는 복잡한 연산이 필요한 역행렬이 있고 계산 시간을 늘리는 행렬 곱이 있다. 식 (3)과는 다르지만 쉽고 빠른 연립 방정식 풀이법이 있을까? 이러한 기초적인 의문에 효과적인 대답이 가우스 소거법(Gaussian elimination) 혹은 행 줄임(row reduction)이다. 가우스 소거법을 식 (2)에 적용하면 다음과 같은 사다리꼴 형태(echelon form)로 만들 수 있다.

                          (4)

식 (4)에 의해 미지수 $x, y, z$는 다음처럼 간략히 표현된다.

                          (5)

식 (2)로 표현한 행렬을 식 (4)처럼 만들기 위해서 가우스 소거법은 다음 세 가지의 기본 행 연산(elementary row operation)을 반복해서 사용한다.
  • 행 곱하기 $e^{(m)}$(row multiplication): 현재 행에 $0$이 아닌 스칼라[$c$]를 곱한다.[$\bar r_i \leftarrow c \bar r_i$]
  • 행 더하기 $e^{(a)}$(row addition): 현재 행과 $0$이 아닌 스칼라[$c$]를 곱한 다른 행을 더한다.[$\bar r_i \leftarrow \bar r_i + c \bar r_j$] 여기서 두 행은 서로 다르다.
  • 행 바꾸기 $e^{(s)}$(row switching): 두 행을 서로 바꾼다.[$\bar r_i \leftrightarrow \bar r_j$]
여기서 $e^{(i)}$는 $i$에 해당하는 행 연산(row operation)을 표현, 스칼라(scalar)는 행렬이나 벡터(vector)가 아닌 숫자, $\bar r_i$는 $i$번째 행 벡터(row vector)를 뜻한다. 거창하게 기본 행 연산이라고 했지만, 사실은 우리가 연립 방정식을 풀 때 항상 사용하는 절차이다. 연립 방정식은 어떻게 푸는가? 우리는 식 (4)처럼 방정식에서 미지수를 하나씩 줄여서 결국 미지수를 하나만 남긴다. 다음으로 방정식에 해를 차례 차례 대입해서 그 다음 해를 구한다. 예를 들어 $i$번 방정식에서 미지수 $x_n$을 없애려면 다음과 같은 연산이 필요하다.

                  (6)

여기서 $a_{in} + c a_{jn}$ = $0$, $c = - a_{in}/a_{jn}$이다. 식 (6)에 등장하는 기본 행 연산이 $e^{(m)}$과 $e^{(a)}$이다. 또한 곱하는 행이 항상 다르기 때문에, 연산 $e^{(m)}$과 $e^{(a)}$는 서로 같을 수 없다. 다음과 같은 계산 절차를 사용하면, $e^{(s)}$를 $e^{(m)}$과 $e^{(a)}$로 만들 수 있다[1]. 우리가 교환하고 싶은 행 번호가 $i, j$라면, 다음과 같은 순서로 기본 행 연산을 반복해서 $e^{(s)}$를 만들 수 있다.
  •  $e^{(a)}$: $c = 1$일 때 $\bar r_j' \leftarrow \bar r_j + \bar r_i$
  •  $e^{(a)}$: $c = -1$일 때 $\bar r_i' \leftarrow \bar r_i - \bar r_j' = - \bar r_j$
  •  $e^{(a)}$: $c = 1$일 때 $\bar r_j' \leftarrow \bar r_j' + \bar r_i' = \bar r_i$
  • $e^{(m)}$: $c = -1$일 때 $\bar r_i' \leftarrow -\bar r_i' = \bar r_j$
여기서 $\bar r_i, \bar r_j$는 연산 전의 최초 행 벡터, $\bar r_i', \bar r_j'$는 연산 후에 저장된 행 벡터이다. 그래서 우리는 $e^{(m)}$과 $e^{(a)}$만 고려해서 가우스 소거법에 대한 다양한 증명을 할 수 있다.
기본 행 연산을 수학적으로 더 세련되게 다루려면, 기본 행 연산을 행렬로 표현해야 한다. 이를 위해 $i$번째 기본 행 연산 $e_i$에 해당하는 기본 행렬(elementary matrix)을 ${\bf E}_i$라 하자. 그러면 가우스 소거법을 행렬로 처리하기 위한 다음 관계가 성립한다.

                           (7)

물론 식 (7)처럼 표기한다고 그 관계가 성립된다는 뜻은 아니다. 연산 $e^{(m)}$과 $e^{(a)}$에 대해 식 (7)을 하나씩 증명해야 한다. 연산 $e^{(s)}$는 $e^{(m)}$과 $e^{(a)}$의 결합이기 때문에 따로 증명할 필요는 없다. 먼저 $e^{(m)}$에 대한 ${\bf E}^{(m)}$의 원소(element)를 $E_{ij}^{(m)}$라 한다. 그러면 $n$번째 행에 대한 행 곱하기 연산 $e^{(m)}$은 다음과 같다.

                           (8)

여기서 $\delta_{ij}$는 크로네커 델타(Kronecker delta)이다. 크로네커 델타는 $i$ = $j$이면 $1$, 아니면 $0$이 된다. 식 (8)을 식 (7)에 대입해 행렬 곱 ${\bf E}^{(m)} {\bf A}$의 원소를 구하면 다음 관계를 얻는다.

                          (9)

여기서 ${\bf A}$의 원소는 $a_{ij}$이다. 마찬가지로 $l$번째 행에 $c$를 곱해 $n$번째 행에 더하는 행 더하기 연산 $e^{(a)}$도 행렬로 표현할 수 있다.

                           (10)

여기서  $e^{(a)}$에 대한 ${\bf E}^{(a)}$의 원소는 $E_{ij}^{(a)}$이다. 행렬 곱 ${\bf E}^{(a)} {\bf A}$의 결과는 다음과 같다.

                          (11)

또한 행 바꾸기 연산 $e^{(s)}$를 위한 기본 행렬  ${\bf E}^{(s)}$의 원소 $E_{ij}^{(s)}$도 다음처럼 기술한다.

                           (12)

식 (12)에 나오는 크로네커 델타 $\delta_{ij}$는 $i,j$를 바꿀 수 있으므로, ${\bf E}^{(s)}$ = $({\bf E}^{(s)})^T$가 성립해서 ${\bf E}^{(s)}$는 대칭 행렬(symmetric matrix)이 된다. 이를 종합하면, 기본 행 연산을 식 (7)과 같은 기본 행렬로 항상 표현할 수 있다. 또한 행 바꾸기 연산  $e^{(s)}$는 $e^{(m)}$과 $e^{(a)}$의 기본 행렬의 곱으로도 나타낼 수 있다.

                          (13)

최종적으로 식 (4)에 제시한 상삼각 행렬(upper triangular matrix) ${\bf U}$를 만들기 위한 가우스 소거법을 기본 행렬의 유한 곱으로 멋있게 표현할 수 있다.

                          (14)

여기서 $r$은 기본 행 연산을 적용한 회수이다. 행렬식(determinant)의 정의 혹은 행렬식은 방향성 있는 부피 개념에 따라 기본 행렬의 행렬식도 구해본다.

                          (15)

기본 행렬의 행렬식은 $0$이 아니므로 역행렬(inverse matrix)이 항상 존재한다. 기본 행렬의 역행렬은 기본 행 연산의 역연산 관점으로 쉽게 이해할 수 있다. 우리가 기본 행렬의 행렬식을 계산하지 않더라도, 행 곱하기, 행 더하기, 행 바꾸기는 당연히 역연산이 존재하므로 기본 행렬의 역행렬은 반드시 존재함을 바로 알 수 있다. 그러므로 기본 행렬 ${\bf E}^{(m)}$과 ${\bf E}^{(a)}$의 역행렬인 $({\bf E}^{(m)})^{-1}$과 $({\bf E}^{(a)})^{-1}$은 행렬 원소를 다음처럼 정의할 수 있다.

                           (16)

                          (17)

여기서 $n$은 기본 행 연산을 적용한 행 번호이다. 행렬 ${\bf E}^{(s)}$의 역행렬은 식 (12)처럼 $({\bf E}^{(s)})^{-1}$ = ${\bf E}^{(s)}$이다.
행렬 이론에서 가장 중요한 분해법인 LU 분해(lower–upper decomposition) 혹은 LU 인수 분해(lower–upper factorization)는 식 (14)를 이용해서 아래처럼 증명할 수 있다.

[LU 분해]
행렬 ${\bf A}$의 모든 선행 주부분 행렬(leading principal submatrix)의 행렬식이 $0$이 아니면, 다음 분해를 만족하는 행렬 ${\bf L}, {\bf U}$는 유일하게 존재한다.

                           (18)

여기서 ${\bf L}$은 대각선 원소가 모두 $1$인 하삼각 행렬(lower triangular matrix), ${\bf U}$는 대각선 원소가 $0$이 아닌 상삼각 행렬이다.

[증명]
가우스 소거법을 적용해 식 (14)처럼 ${\bf A}$를 ${\bf U}$로 바꾼다. 기본 행렬의 행렬식은 항상 0이 아니므로, 식 (14)의 좌변과 우변에 기본 행렬의 역행렬을 계속 적용해서 다음 관계식을 얻는다.

                          (19)

여기서 $r$은 기본 행렬을 만든 회수이다. 행렬 ${\bf L}$의 특성을 이해하기 위해 기본 행렬을 살펴본다. 기본 행렬 ${\bf E}^{(m)}$은 대각 행렬(diagonal matrix)이므로 특이한 점은 없다. 기본 행렬 ${\bf E}^{(a)}$는 식 (10)으로 인해 항상 하삼각 행렬이다. 이 특성을 간단히 증명해본다. 가우스 소거법을 적용해서 상삼각 행렬 ${\bf U}$를 만들고 있는 중이므로[∵ 대각선 원소의 아래쪽을 0으로 만들어야 상삼각 행렬], $l$번째 행에 $c$를 곱해 더해주는 행 번호인 $n$은 $n > l$이 성립한다. 따라서 행 더하기인 식 (10)으로 인해 대각선 원소[대각선 열 번호는 $n$]의 왼쪽 위치[$l < n$]에 원소 $c$가 생긴다. 이 성질은 ${\bf E}^{(a)}$가 하삼각 행렬임을 의미한다. 또한 행렬 곱 관점으로 보면, 하삼각 행렬끼리는 서로 곱하더라도 항상 하삼각 행렬이다. 마찬가지로 하삼각 행렬의 역행렬도 하삼각 행렬이다. 예를 들어, 어떤 하삼각 행렬 ${\bf T}_l$의 역행렬 ${\bf T}_l^{-1}$을 만들려면 식 (14)처럼 상삼각 행렬을 만드는 기본 행 연산을 적용하면 된다.

                          (20)

여기서 ${\bf I}$는 항등 행렬(identity matrix)이다. 그러면 ${\bf U}$를 만드는 기본 행렬의 곱은 항상 하삼각 행렬이다. 이 모든 고찰을 합치면, 식 (19)에 정의한 ${\bf L}$은 필연적으로 하삼각 행렬이다. 추가적으로 ${\bf L}$의 대각선 원소가 $1$이 아닐 수도 있다. 이때는 ${\bf L}$의 대각선 원소를 가지는 대각 행렬 ${\bf D}$를 정의해서 ${\bf L}$을 다음처럼 분해한다. 그러면 대각선 원소가 $1$인 ${\bf L}'$과 그 짝인 ${\bf U}'$으로 분해할 수 있다.

                          (21)

식 (21)에 의해 LU 분해의 존재성(existence)이 증명되었으므로, LU 분해의 유일성(uniqueness)을 살펴보자. 먼저 선행 주부분 행렬(leading principal submatrix)을 정의하자. 주부분 행렬(principal submatrix)은 특정 행이나 열을 지워서 만든 정방 행렬(square matrix)이다. 행렬의 좌측 상단(upper left)을 시작점으로 1행 1열로 구성한 가장 작은 주부분 행렬에서 행렬의 차원(matrix dimension)을 하나씩 키워서 원래 행렬까지 커지는 주부분 행렬 중의 하나를 선행 주부분 행렬이라 한다. 더 쉬운 말로 선행 주부분 행렬을 좌측 상단 주부분 행렬(upper left principal submatrix)이라 할 수 있다. 즉 좌측 상단 원소를 항상 포함하는 주부분 행렬이 선행 주부분 행렬이다. 예를 들어 식 (2)에 있는 $\bf A$의 모든 선행 주부분 행렬은 다음과 같다.

                          (22)

여기서 $a_{ij}$는 ${\bf A}$의 원소이다. 선행 주부분 행렬의 차원을 키워갈 때, 기본 행 연산으로 상삼각 행렬을 항상 만들 수 있는지 알아보자. 첫번째 부분 행렬에 대해 $a_{11} = u_{11}$이므로, $a_{11} \ne 0$이면 상삼각 행렬이 된다. 여기서 $u_{ij}$는 ${\bf U}$의 원소이다. 만약 $k \times k$의 차원을 가진 $k$번째 부분 행렬로 상삼각 행렬을 잘 만들었다면, $k+1$번째 부분 행렬은 다음과 같다.

                          (23)

LU 분해의 조건에 의해 식 (23)의 행렬식은 $0$이 아니므로, 식 (23)을 구성하는 벡터는 모두 선형 독립(linearly independent)이다. 그러면 적절한 기본 행 연산을 적용해서 식 (23)의 $k+1$번째 행에서 $k+1$열을 제외한 모든 원소를 다음처럼 $0$으로 만들 수 있다.

                          (24)

여기서 $\bar r_i$는 $i$번째 행 벡터이다. 따라서 모든 선행 주부분 행렬의 행렬식이 0이 아니면 대각선 원소가 $0$이 아닌 상삼각 행렬 ${\bf U}$를 항상 만들 수 있다. LU 분해의 유일성을 보려면 식 (21)에서 얻은 상삼각 행렬과 하삼각 행렬의 곱을 살펴봐야 한다.

                          (25)

여기서 $\min(\cdot)$는 최소값, $l_{ij}$는 ${\bf L}$의 원소이다. 예를 들어 처음 세번째 행까지 다음 관계가 성립한다.

                          (26)

행렬 ${\bf L}$과 ${\bf U}$의 원소에 대해 식 (26)을 다시 정리한다.

                  (27)

그러면 $k+1$번째 행에서 $j \le k$인 $l_{k+1, j}$는 식 (27)처럼 딱 한 값만 가능하다. 마찬가지로 $j \ge k+1$인 $u_{k+1, j}$는 이미 얻은 $l_{k+1, m}$과 $u_{m, j}$[$m = 1,2,\cdots,k$]를 식 (27)처럼 연산해 유일하게 결정된다. 따라서 ${\bf A}$가 정해지면 식 (18)을 만족하는 ${\bf L}$과 ${\bf U}$는 딱 하나만 존재한다.
______________________________

행렬 $\bf L$, $\bf U$의 역행렬이 존재하면 LU 분해의 유일성은 더 쉽게 증명된다. 행렬 $A$에 대한 LU 분해가 두 종류가 있다면, 다음 관계가 성립한다.

                          (28)

하삼각 행렬의 역행렬이나 곱은 하삼각 행렬이며, 상삼각 행렬의 역행렬이나 곱도 상삼각 행렬이다. 그러면 식 (28)의 우변에서 하삼각 행렬과 상삼각 행렬이 서로 같아야 한다. 따라서 식 (28)의 행렬 곱은 대각 행렬이 되어야 한다. 또한 하삼각 행렬의 대각선 원소는 $1$이므로, $({\bf L}')^{-1}{\bf L}$은 항등 행렬이 된다. 따라서 $\bf L$ = ${\bf L}'$, $\bf U$ = ${\bf U}'$가 성립한다.
식 (18)을 모든 행렬에 대해 적용하려면, ${\bf U}$의 대각선 원소가 $0$이 되지 않도록 ${\bf A}$에 행 바꾸기 연산을 다음처럼 적용해야 한다.

                           (29)

여기서 ${\bf P}$는 모든 행 바꾸기 연산의 합성을 나타내는 순열 행렬(permutation matrix)이다. 임의의 행렬 ${\bf A}$를 LU 분해하는 식 (29)와 같은 분해 방식은 행 연산만 사용하기 때문에 부분적 추축(部分的樞軸, partial pivoting)이라 한다. 만약 행과 함께 열에도 바꾸기 연산을 적용하면 전추축(全樞軸, full pivoting)이 된다. 행 바꾸기 한 행렬[$\bf PA$]까지 원래 행렬[$\bf A$]과 동일하다고 생각하면, LU 분해의 유일성은 성립하지 않는다. 예를 들어, ${\bf P}_1$과 ${\bf P}_2$을 사용한 LU 분해는 서로 다른 삼각 행렬로 분해된다.

                          (30)

여기서 순열 행렬의 역행렬은 식 (1.1)처럼 전치 행렬(transpose)이다. 식 (19)는 행렬 ${\bf A}$의 역행렬 존재 유무 혹은 행렬식의 값과는 관계없이 항상 성립한다. 그래서 역행렬이 존재하지 않는 경우 혹은 행렬식이 $0$인 경우에도 ${\bf A}$를 식 (19)처럼 LU 분해할 수 있다. 다만 이 경우는 ${\bf U}$의 대각선 원소 중 일부는 $0$이 되기 때문에 LU 분해의 유일성은 성립하지 않는다. 왜냐하면 ${\bf U}$의 대각선 원소가 $0$이어서 식 (26)에 의해 ${\bf L}$의 원소 일부는 임의로 배정될 수 있기 때문이다.

LU 분해는 행렬 연산에서 매우 중요한 위치에 있기 때문에, LU 분해를 열심히 적용하면 다양한 행렬 연산을 좀더 쉽게 처리할 수 있다.


   1. 기본(basics)   

[순열 행렬의 역행렬]
순열 행렬의 역행렬은 전치 행렬이다.

                          (1.1)

여기서 $(\cdot)^T$는 전치 행렬을 의미한다.

[증명]
식 (29)에 있는 순열 행렬은 다음과 같은 행 바꾸기 연산의 기본 행렬 ${\bf E}^{(s)}$의 곱으로 표현할 수 있다.

                          (1.2)

여기서 $p$는 행 바꾸기 연산을 적용한 회수이다. 동일한 행 바꾸기를 한 번 더 하면 원래 행으로 되돌아가기 때문에, 행 바꾸기 연산의 역연산은 자기 자신이다. 따라서 순열 행렬의 역행렬은 식 (1.2)를 반대로 적용하면 구할 수 있다.

                          (1.3)

여기서 $({\bf E}^{(s)})^T$ = ${\bf E}^{(s)}$이다. 식 (1.3)의 행렬 곱을 전치 행렬로 묶으면 식 (1.1)을 얻을 수 있다.
______________________________

식 (15)와 (1.2)에 의해 순열 행렬의 행렬식은 $|{\bf P}| = (-1)^p$이다.

[기본 행렬과 일반 행렬 곱의 행렬식]
기본 행렬과 일반 행렬 곱의 행렬식은 각 행렬식의 곱과 같다.

                          (1.4)

                          (1.5)

여기서 $r$은 기본 행렬을 적용한 회수이다.

[증명]
행렬식의 기하학적 의미를 고려하면 식 (1.4)는 쉽게 증명된다. 식 (1.5)의 좌변에 식 (1.4)를 연속적으로 적용하면 식 (1.5)의 우변을 얻을 수 있다.
______________________________

식 (1.5)를 두 행렬의 곱으로 확장하면, 행렬 곱의 행렬식 특성을 증명할 수 있다.


   2. 다양한 연산(various operations)   

[행렬식(determinant)]
행렬 ${\bf A}$를 LU 분해하면, ${\bf A}$의 행렬식은 상삼각 행렬 ${\bf U}$에 있는 모든 대각선 원소의 곱이다.

                          (2.1)

여기서 $u_{ii}$는 ${\bf U}$의 $i$번째 대각선 원소이다.

[증명]
행렬 곱의 행렬식은 각 행렬식의 곱으로 쉽게 계산할 수 있다.

                          (2.2)

또한 삼각 행렬의 행렬식은 대각선 원소의 곱이다. 따라서 $|{\bf L}|$ = $1$이므로, 식 (2.1)이 성립한다.
______________________________

식 (2.1)에서 LU 분해를 적용할 때 순열 행렬을 사용했다면, 식 (2.1)에 순열 행렬의 행렬식인 $(-1)^p$를 곱해야 한다. 여기서 $p$는 행 바꾸기 연산을 적용한 회수이다. LU 분해의 유용성은 식 (2.1)을 봐도 명확히 알 수 있다. 행렬식은 라플라스 전개(Laplace expansion)로 정의하지만, 라플라스 전개를 직접 계산하려면 시간이 너무 많이 걸린다. 이때는 LU 분해를 이용해 원래 행렬을 삼각 행렬로 분해한다. 그러면 식 (2.1)처럼 손쉽게 행렬식을 얻을 수 있다.

[계수 혹은 계급수(rank)]
행렬 ${\bf A}$를 LU 분해하면, ${\bf A}$의 계수는 상삼각 행렬 ${\bf U}$에 있는 $0$이 아닌 대각선 원소의 개수이다.

[증명]
행렬의 계수선형 독립(linearly independent)인 행 벡터나 열 벡터의 개수 중에서 최소값이다. 행렬 ${\bf A}$로부터 ${\bf U}$를 만들기 위해 기본 행 연산을 쓴다고 가정한다. 모든 행 벡터가 서로 선형 독립이면, 식 (2.1)에 의해 행렬식은 대각선 원소의 곱이 된다. 이 경우 행렬식은 $0$이 될 수 없기 때문에, 모든 대각선 원소는 $0$이 아니다. 그래서 $0$이 아닌 대각선 원소의 개수가 행렬의 계수가 된다. 만약 행 벡터 중에서 선형 종속(linearly dependent)인 벡터가 있으면, 다음과 같은 선형 결합(linear combination)으로 인해 특정 행의 원소는 모두 $0$이 된다.

                          (2.3)

당연히 이 행의 대각선 원소도 $0$이 되어서, 선형 종속인 벡터의 개수만큼 $0$인 대각선 원소가 늘어난다. 따라서 $0$이 아닌 ${\bf U}$의 대각선 원소 개수는 행렬의 계수이다.
______________________________

[연립 방정식의 해법]
행렬 ${\bf A}$를 LU 분해하면, 역행렬 없이 연립 방정식을 단계적으로 풀 수 있다.

                           (2.4)

여기서 ${\bf A}$의 차원(dimension)은 $n \times n$, ${\bf x}$와 ${\bf b}$는 열 벡터(column vector)이다.

[증명]
식 (2.4)에 제안된 절차에 따라 열 벡터 ${\bf c}$의 원소 $c_i$를 구하자.

                          (2.5)

여기서 ${\bf b}$의 원소는 $b_i$, $i$는 $1$부터 시작해 하나씩 더하며 대입한다. 식 (2.5)로 구한 $c_i$를 식 (2.4)의 마지막식에 대입해서 정리하면 ${\bf x}$의 원소 $x_i$를 계산할 수 있다.
                          (2.6)

여기서 $i$는 $n$부터 시작해 하나씩 빼면서 대입한다.
______________________________

식 (2.5)처럼 $c_i$를 대입하는 방법은 전진 대입법(forward substitution)이라 부른다. 식 (2.6)의 대입 방식은 후진 대입법(backward substitution)이다.

[역행렬(inverse matrix)]
역행렬이 존재하는 행렬 ${\bf A}$는 기본 행렬의 곱으로 표현할 수 있다.

                          (2.7)

여기서 $r$은 기본 행렬을 생성한 회수이다.

[증명]
상삼각 행렬을 만들기 위한 식 (14)의 과정을 더 진행해서 최종적으로 항등 행렬 $\bf I$가 되게 한다.

                          (2.8)

식 (2.8)에서 적용한 기본 행렬을 모두 곱하면 식 (2.7)의 첫째식이 된다. 역행렬인 식 (2.7)의 첫째식에 역행렬을 다시 적용하면 식 (2.7)의 둘째식이 된다.
______________________________

연립 방정식을 풀기 위한 사다리꼴 형태인 식 (4)를 만들 때, 기본 행 연산을 더 적용해서 식 (4)를 다음과 같은 대각 행렬 형태로 만들 수도 있다.

                          (2.9)

식 (2.9)를 관찰하면, 행렬이 대각선 원소만 가지고 있으므로 $x_i = b_i'' / a_{ii}''$를 이용해 쉽게 해를 구할 수 있다. 이러한 연립 방정식의 해법은 가우스–요르단 소거법(Gauss–Jordan elimination)이라 한다. 가우스Carl Friedrich Gauss(1777–1855)를 이어서 요르단Wilhelm Jordan(1842–1899)이 1888년요르단 46세, 조선 고종 시절에 이 방식을 처음 제안했다. 가우스–요르단 소거법은 역행렬을 구할 때도 매우 유용하다. 식 (2.7)의 첫째식은 기본 행렬을 계속 적용해 항등 행렬을 만들면 사용한 기본 행렬의 곱이 역행렬임을 뜻한다. 이 개념을 식 (2.8)에 적용하자. 행렬 $\bf A$를 $\bf I$로 만들 때 사용한 기본 행렬의 곱을 순서대로 $\bf I$에 곱하면 역행렬이 얻어진다. 따라서 가우스–요르단 소거법을 적용한 역행렬의 해법은 다음과 같다.

                          (2.10)

[대칭 행렬(symmetric matrix)]
대칭 행렬은 다음처럼 LU 분해할 수 있다.

                          (2.11)

[증명]
식 (21)부터 시작하자. 행렬 $\bf A$는 대칭이므로, 다음 관계가 성립한다.

                          (2.12)

식 (28)과 같은 LU 분해의 유일성으로 인해, 대칭 행렬의 LU 분해는 $\bf U$ = ${\bf L}^T$를 만족해야 한다.
______________________________


[참고문헌]
[1] "Exchange of rows as sequence of other elementary row operations," ProofWiki. (방문일 2020-07-13)

[다음 읽을거리]
1. QR 분해

2020년 7월 13일 월요일

스털링의 공식(Stirling's Formula)

[경고] 아래 글을 읽지 않고 "스털링의 공식"을 보면 바보로 느껴질 수 있습니다.


계승(階乘, factorial) $n!$은 인접한 숫자를 계속 곱하기 때문에, $n$이 커지면 계승값은 굉장히 빠르게 증가한다. 그래서 계승의 기호에 놀라움을 표현하는 느낌표가 붙어있다. 계승을 어림짐작하기는 쉽다. 모든 $n$에 대해 $n! \le n^n$이 성립한다. 하지만 조금 더 정확하게 근사하려면 어떤 방법을 쓰면 좋을까? 여기에 대한 해답이 스털링의 공식(Stirling's formula) 혹은 스털링의 근사(Stirling's approximation)이다. 유한 곱(finite product)을 직접 다루기는 불편하므로, 계승에 로그 함수(logarithmic function)를 적용해서 유한 합(finite sum)으로 바꾼다.

                  (1a)

                  (1b)

여기서 $\prod$는 유한 곱(finite product)을 의미한다. 다음으로 유한 합과 적분의 관계식인 오일러–매클로린 공식(Euler–Maclaurin formula)을 식 (1)에 적용한다.

                  (2)

                  (3)

지수 함수(exponential function)를 이용해 식 (3)을 다시 정리한다.

                  (4)

식 (4)의 결과는 드 무아브르Abraham de Moivre(1667–1754)가 1730년드 무아브르 63세, 조선 영조 시절에 얻었다. 하지만 $n$에 따라 느리게 변하는 계수 $C(n)$을 점근적으로 결정하지는 못했다. 계수 $C(n)$을 정복하는 첫걸음은 수치적인 관찰이다. 베르누이 다항식(Bernoulli polynomial)을 이용해 식 (4)에 나오는 $C(n)$의 변화 특성을 분석한다.

                  (5)

                  (6)

여기서 $B_1(x)$ = $x - 1/2$, $B_1(x)$는 제$1$차 베르누이 다항식이다. 식 (6)을 이용하더라도 $C(n)$의 정확한 값을 구하지는 못한다. 하지만 수치 계산에서 $n$이 커지면 $C(n)$은 약 $2.5$에 근접한다. 그래서 스털링James Stirling(1692–1770)은 과감하게 $C(n) \sim \sqrt{2 \pi}$라고 가정해서 식 (4)를 다음처럼 표기했다.

                   (7)

[그림 1] 스털링 공식의 정확도(출처: wikipedia.org)

식 (7)이 정말로 타당한지 확인하려면, $n$이 매우 커질 때 식 (6)의 극한값을 구해야 한다. 먼저 $C(n)$의 수렴성을 판단하기 위해 식 (3)에 있는 적분을 분해해서 수열 $\{a_k\}$와 $\{b_k\}$를 정의한다.

                  (8)

항 $a_k$는 항상 음이고 항 $b_k$는 항상 양이기 때문에, 수열 $\{a_k\}$와 $\{b_k\}$가 만드는 무한 급수는 교대 급수(alternating series)가 된다. 라이프니츠 기준(Leibniz criterion)에 따라 단조 감소하는 $\{a_k\}$와 $\{b_k\}$를 가진 무한 급수 $\lim_{n \to \infty} R_1(1, n)$은 수렴한다. 따라서 $n$이 커질 때 $C(n)$도 자동적으로 수렴한다. 하지만 복잡한 무한 곱(infinite product)으로 구성된 식 (6)을 직접 계산하기는 매우 어렵다. 그래서 식 (8)에 제시한 유명한 월리스 곱(Wallis product)에 식 (4)를 대입해서 $C(n)$의 점근값을 유도한다[1].

                       (9)

                       (10)

따라서 식 (10)에 의해 $n$이 매우 커질 때 $C(n) \sim \sqrt{2 \pi}$가 성립한다.
스털링 공식인 식 (7)을 얻을 때, 오일러–매클로린 공식의 제$1$차 잉여항만 고려했다. 잉여항의 차수를 식 (2)처럼 높이면 스털링 공식은 어떻게 변할까? 새로운 계승 공식을 유도하기 위해 식 (2)에 있는 베르누이 수를 $M$개까지 합산한다.

                       (11)

식 (11)에서 $n$이 커질 때의 점근값을 구하면 다음과 같다.

                        (12)

식 (12)는 첫인상이 매우 멋있어 보이지만 내면은 심각한 결함을 가지고 있다. 유한 합을 구성하는 성분이 베르누이 수이기 때문에, $M$을 계속 키우면 유한 합이 진동하기 시작한다. 즉, $M$이 커질 때 이 유한 합은 수렴하지 않고 진동하며 발산한다. 하지만 식 (12)가 수렴하지 않더라도 계승을 점근적으로 계산하는 식 (12)는 충분히 소중하다. 식 (12)로 표현한 스털링의 공식을 통해 우리의 고정 관념을 확 바꿀 수 있다. 수학에서 다루는 무한 급수는 수렴할 때만 가치 있다고 오판하지 말자. 무한 급수가 발산하거나 진동할 때는 유한 번만 더해서 값어치 있는 결과를 만들 수도 있다.

어떤 경우는 계승에 느낌표를 하나 더 붙여서 $n!!$처럼 표현하기도 한다. 이때는 그냥 계승이라 하지 않고 이중 계승(二重階乘, double factorial)이라 부른다. 이중 계승을 쓰면, 짝수나 홀수에 대한 계승을 깔끔하게 쓸 수 있다.

                       (13a)

                       (13b)

                       (13c)

여기서 $(-1)!!$ = $0!!$ = $1$로 정의한다. 식 (13)이 세련되기는 하지만, 짝수와 홀수의 계승 표현식에 사용하는 이중 계승은 선택 사항이다. 식 (1a)에 있는 계승의 원래 의미에 따라 짝수와 홀수의 계승을 표기할 수도 있다.

                       (14a)

                       (14b)

식 (14)를 보면 명확히 이해할 수 있지만, 식 (14)의 우변은 다소 지저분하고 복잡한 반면 식 (13)의 정의는 단순하고 직관적이다. 그래서 식 (13)의 이중 계승이란 개념을 써서 식 (14)와 같이 계승의 특별한 경우를 더 쉬운 방식으로 표현한다.

[참고문헌]
[1] "Stirling's formula," ProofWiki. (방문일 2020-07-13)

2020년 7월 12일 일요일

오일러–매클로린 공식(Euler–Maclaurin Formula)

[경고] 아래 글을 읽지 않고 "오일러–매클로린 공식"을 보면 바보로 느껴질 수 있습니다.
1. 베르누이 다항식
2. 테일러 급수


적분(integration)급수(series)를 공부할 때 크게 착각하는 점 중의 하나가 적분은 어렵고 급수는 쉽다는 생각이다. 적분은 피적분 함수의 원시 함수(primitive function)를 찾는 복잡한 과정이 있기 때문에 분명 어렵다. 반면에 급수는 단순하고 반복적인 합이므로, 덧셈만 계속 해가면 결과를 쉽게 얻을 수 있다. 하지만 유한이 아닌 무한한 급수(infinite series)에서는 항을 끝없이 더해가는 무한 급수의 연산 과정이 상상할 수 없을 정도로 복잡하다. 왜냐하면 무한 급수의 수렴과 발산 특성은 직관적으로 알 수 없고, 무한 급수를 구성하는 수열(sequence)의 특성을 사용해 수렴 판정을 하기 때문이다. 따라서 공부를 조금 더 하면 급수보다는 적분이 편하다고 느낀다. 그렇다면 근사 없이 적분과 급수를 서로 이어주는 정확한 관계식은 없을까? 아래에 제시한 리만 적분(Riemann integral)은 무한 급수와 적분의 관계를 설명하는 중요한 개념이다.

             (1)

하지만 식 (1)은 구간을 계속 줄여가는 무한 급수이므로, 우리가 고민하는 부분과는 약간 거리가 있다. 구간이 고정된 유한 급수(finite series) 혹은 유한 합(finite sum)을 적분과 정확하게 연결해주는 도구는 리만 적분이 아니고 오일러–매클로린 공식(Euler–Maclaurin formula)이다. 예를 들어, [그림 1]에 제시한 유한 합과 적분의 관계를 생각한다. 피적분 함수 $f(x)$ = $x^3$은 구간 $0 \le x \le 2$ 사이에서 연속적으로 변하며, 항이 $f(n)$인 유한 합은 이산적으로 합해진다. 그래서 직관적으로 보면 적분과 유한 합은 같아질 수가 없다. 그래서 [그림 1]에 보이는 유한 합과 적분의 오차를 원하는 만큼 정확히 표현해서 적분값을 보상해주면, 유한 합을 적분으로 정확히 표현할 수 있다. 유한 합과 적분의 오차를 표현하는 함수로 베르누이 다항식(Bernoulli polynomial)을 사용하는 기법이 오일러–매클로린 공식이다. 이 공식은 오일러Leonhard Euler(1707–1783)가 1735년오일러 28세, 조선 영조 시절에 느리게 수렴하는 무한 급수를 계산하기 위해 제안했다[1]. 오일러와는 독립적으로 매클로린Colin Maclaurin(1698–1746)은 1745년매클로린 47세, 조선 영조 시절에 이 공식을 재발견했다[2]. 매클로린은 여러 적분을 효과적으로 계산하기 위해 이 공식을 열렬히 사용했다. 매클로린이란 이름은 테일러 급수(Taylor series)의 특수한 경우인 매클로린 급수(Maclaurin series)에도 남아 있다.

[그림 1] $f(x)$ = $x^3$에 대한 유한 합과 적분(출처: wikipedia.org)

베르누이 수(Bernoulli number)의 확장인 베르누이 다항식의 성질을 적극 활용해서 유한 합과 적분에 대한 오일러–매클로린 공식을 증명한다.

[오일러–매클로린 공식]

                  (2)

여기서 $B_m$은 제$m$번 베르누이 수, $(\cdot)!$는 계승(factorial), $f^{(n)}(x)$는 $x$에 대한 $n$번 미분, $R_m(n)$은 제$m$차 잉여항(remainder term), $b_m(x)$ = $B_m(x - \lfloor x \rfloor)$, $B_m (x)$는 제$m$차 베르누이 다항식, $\lfloor x \rfloor$는 바닥 함수(floor function), $f(x)$는 $2M$번 미분 가능하다.

[증명]
아래에 제시한 베르누이 다항식의 미분을 이용해서 정적분을 다음처럼 바꿀 수 있다.

                  (3)

                  (4)

식 (4)를 유한 합 형태로 정리하면 다음과 같다.

                  (5)

식 (5)의 마지막 항인 잉여항에 대해 식 (3)을 다시 적용한다.

                  (6)

식 (6)과 같은 과정을 계속 반복해서 다음을 얻는다.

                  (7)

잉여항 정의에 사용한 $b_m(x)$는 주기가 $1$인 주기 함수(periodic function)이다. 따라서 식 (7)을 이용해 적분 구간을 $n$까지 확장하면 식 (2)를 얻을 수 있다.
______________________________

식 (2)에 도입한 잉여항 $R_m(n)$은 오일러나 매클로린이 만든 공식에는 없었던 성분이다. 하지만 오일러–매클로린 공식의 정확성을 평가할 때 필수적인 요소이다. 오일러–매클로린 공식을 실제적으로 완성한 잉여항은 푸아송Siméon Denis Poisson(1781–1840)에 의해 제안되었다.

[그림 2] $f(x)$ = $x^3$에 대한 적분의 사다리꼴 근사(출처: wikipedia.org)

오일러–매클로린 공식이 아름답기는 하지만, 식 (2)의 좌변에 있는 $1/2$ 성분이 눈에 거슬린다. 하지만 적분에 대한 정확한 계산을 하려면 이 성분이 꼭 필요하다. 예를 들어, [그림 2]를 고려한다. 리만 합(Riemann sum) 관점에서 적분에 대한 근사는 [그림 1]과 같은 직사각형도 가능하다. 하지만 더 정확한 근사는 [그림 2]와 같은 사다리꼴 형태이다. 사다리꼴 면적을 이용해 [그림 2]에 있는 사다리꼴의 면적을 계산한다.

                  (8)

그러면 양 끝점에 해당하는 $f(0)$과 $f(2)$에는 $1/2$가 곱해져야 한다. 따라서 식 (2)의 좌변에도 $1/2$ 성분이 있다.
식 (2)에서 유한 합의 시작이 $1$에서 $l+1$로 바뀐다면, 다음 식과 같이 오일러–매클로린 공식을 변경할 수 있다.

                  (9)

식 (9)의 관점으로 식 (2)를 보면, 식 (2)는 $l$ = $0$인 특별한 경우이다.
오일러–매클로린 공식을 적용하는 정말 좋은 예는 다음과 같은 자연수 거듭제곱의 합(sum of powers)이다.

                  (10)

식 (10)은 베르누이 수(Bernoulli number)를 만들어낸 유명하지만 간단한 계산식이다. 거듭제곱의 합 공식을 만들기 위한 처음 단계로 $f(x)$ = $x^p$를 식 (2)에 대입한다.

                  (11)

여기서 $2M > p$, $f(x)$의 미분은 다음과 같다.

                  (12)

식 (11)을 정리하면 베르누이 수로 표현한 거듭제곱의 합 공식을 얻을 수 있다.

                  (13)

식 (2)에 증명한 오일러–매클로린 공식이 어렵다면 더 쉬운 해결책을 사용할 수도 있다. 식 (5)에서 출발해서 $n$번 항까지 합하면 다음과 같다.

                  (14)

식 (14)에 있는 베르누이 다항식까지 1차 함수로 바꾸어서 1계 미분만 가진 매우 간단한 오일러–매클로린 공식을 만든다.

                  (15)

함수 $f(x)$가 $x$ = $0$에서 정의되지 않으면, 식 (5)를 $2$부터 $n$까지 합하고 마지막에 $f(1)$을 더해서 식 (15)와 다른 오일러–매클로린 공식을 유도할 수도 있다.

                  (16a)

                  (16b)

식 (15)와 (16)에 나오는 정적분은 리만–스틸체스 적분(Riemann–Stieltjes integral)으로 표현하기도 한다.

[참고문헌]
[1] L. Euler, "Inventio summae cuiusque seriei ex dato termino generali (Finding the sum of any series from a given general term)," Commentarii academiae scientiarum Petropolitanae (Commentary of the St. Petersburg Scientist Academy), vol. 8, pp. 9–22, Oct. 1735.
[2] C. Maclaurin, A Treatise on Fluxions, Edinburgh: T. W. and T. Ruddimans, 1742.

[다음 읽을거리]