이번에 포스팅할 내용은 미분방정식(Differential equation)을 선형대수를 이용하여 푸는 방법이다. 이번 포스팅의 내용을 이해하기 위해선 고유값/고유벡터 강의와 대각화(Diagonalization)내용을 먼저 학습하고 오는 것을 추천한다. 특히 지난 강의 Lecture 22에서 다루었던 대각화와 행렬의 거듭제곱, 그리고 차분방정식(Difference equation)과 관련이 깊기 때문에 이를 확실하게 이해한 뒤 이번 강좌를 보는 것이 좋다. 본격적인 내용을 학습하기전에 미분방정식이란 무엇이며, 이번 강의에 필요한 관련 내용들에 대해서 간략히 살펴보고 가도록 하자. 

 

 

1. 미분방정식의 개요(Introduction to Differential equation)

 

- What is a differential equation?

 

미분방정식(Differential equation)이란 어떤 방정식(equation)에 도함수, 즉 미분(derivative)이 포함된 것이다. 이는 물리학에서의 운동방정식, 가령 스프링에 매달린 추의 운동 분석에 대한 방정식 등을 세우는데에 사용되기도 하고 그밖에 경제학, 생물학 등 다양한 분야에 걸쳐 사용될 수 있는 수학적 방법이다. 미분방정식은 일반적인 방정식보다 식을 세우고 이해하거나 해(solution)를 구하기가 굉장히 까다롭다. 미분방정식에 대해서 본격적으로 알아보기 전에 다른 형태의 방정식들은 어떤 것들이 있는지 살펴보자. 아래는 미분방정식이 아닌 일반적인 형태의 방정식들을 나열해논 것이다. 

 

 

식 (1.1)부터 차례로 선형(일차) 방정식(Linear equation), 이차 방정식(Quadratic equation), 삼차 방정식(Cubic equation)을 각각 나타내며, 최고차항에 따라 구분되는 형태이다. 이들 방정식은 미지수(unknown)와 그들의 앞에 곱해져있는 상수인 계수(coefficient)로 구성되어 있으며, 덧셈, 뺄셈 연산을 통한 조합으로 구성되어 있다. 이와 같이 어떤 미지수의 거듭제곱과 계수들의 조합으로 구성되어있는 식을 대수방정식(algebraic equation)이라고 한다. 미지수의 최고차항에 따라 식을 구분할 때 차수가 일차인 식을 특히 선형방정식이라고 하는데, 이는 식 자체가 선형성(Linearity)을 가지기 때문이다. 2차식부터는 비선형성(non-linearity)을 가진다. 

 

사실 엄밀히 따지면 식 (1.1)은 대수방정식은 아닌데, 미지수가 x와 y 두 개로 구성되어있기 때문이다. (1.1)처럼 미지수가 한 개 이상으로 구성되어 있는 경우 이들을 다항방정식(polynomial equation)이라고 하며 종종 다항식(polynomial)이라고 쓰인다. 다항방정식은 대수방정식을 포괄하기 때문에 보통 대수방정식이라는 말 보다는 다항식이라는 용어를 사용한다. 

 

 

이제 미분방정식이 어떤 형태인지 살펴보자. 미분방정식의 형태는 식 (1)의 다항식(polynomial)형태의 식에 미분(derivative)의 개념이 더해진 식이기 때문에 훨씬 복잡해진다. 아래의 식을 보자. 

 

 

 

식 (2)는 하나의 미분방정식을 여러 가지 형태로 표현한 것이다. 식 (2.1)은 derivative form이고, y의 미분식을 prime을 이용하여 표현하였다. prime하나당 한 번의 미분을 나타내며, 이차미분은 y의 double prime으로 표현한다. 

 

식 (2.2)는 differential form이고 미분을 dy/dx(delta x, delta y로 읽음)로 표현한다. 여기서 분모에 존재하는 미지수 y는 종속 변수(dependent variable)이고, 분자인 x는 독립 변수(independent variable)라고 한다. 이는 (2.2)에서 y는 x에 대한 함수이기 때문이다. 즉 y는 x가 변함에 따라 그 변화량이 얼마나 되는지를 봐야 하는 x에 종속되는 변수이고, x는 어디에도 종속되지 않는 독립적인 변수이다. 예를 들어 어떤 공장의 온도에 따른 가스의 압력에 대한 관계를 미분방정식으로 만들었다고 생각해보자. 여기서 온도를 x, 가스의 압력을 y라고 했을 때 온도의 변화에 따른 가스의 압력을 dy/dx와 같은 미분식을 넣어서 만들 수 있을 것이다. x로 표기된 온도는 독립적으로 우리가 조정하는 것이고, y로 표시된 가스의 압력은 x를 임의로 변화시킴에 따라 변화된 결과를 관찰하는 종속변수라고 이해하면 된다. 

 

마지막 (2.3)은 differential operator이고 미분을 D문자로 표기한다. 많이 사용되지는 않는 표현법이지만 이러한 표현법이 있다는 것 정도만 알아두자. 

 

이러한 미분방정식은 크게 두 가지 형태로 분류할 수 있다. 첫 번째는 ODE(Ordinary differential equation), 두 번째는 PDE(Partial differential equation)이다. 각각 한글로 상미분방정식, 편미분방정식으로 부른다. ODE는 1개 혹은 여러 개의 종속 변수(dependent variable)를 가질 수 있으나, 오직 단 한개의 독립 변수(independent variable)만을 가진다. 반면에 PDE는 ODE와 달리 여러 개의 독립 변수(independent variable)를 가질 수 있다. 단 한 개의 종속 변수를 가지느냐, 아니면 여러 개를 가질 수 있냐, 이것이 가장 큰 차이점이다. 아래 식을 보자. 

 

 

식 (3.1)은 (2.2)와 같은 식이고, 여러 개의 dependent variable을 가질 수 있으나, 오직 하나의 독립 변수(independent variable)인 dx만을 가지는 형태의 식을 ODE라고 한다. 일반적으로 미분방정식이라고 하면 상미분방정식(ODE)을 의미한다. 반면 식 (3.2)와 같이 여러 개의 독립변수를 가지는 형태를 편미분방정식이라 하며, 종속 변수를 서로 다른 독립변수로 각각 편미분하기 때문에 delta인 d대신에 round인 를 이용하여 표기한다. 식 (3.2)에선 하나의 종속 변수 u를 각각 x와 y로 2차 편미분 하였다. 이번 강의에서는 편미분방정식은 따로 다루지 않고 상미분방정식만을 다룬다. 

 

 

- Relationship between Differential equation and Exponential function

 

미분방정식(Differential equation)은 지수함수(Exponential function)와 밀접한 관련이 있다. 이번 강좌를 학습하기 위해선 이 둘의 관계를 아는 것이 좋다. 아래의 식을 보자. 

 

 

식 (4.1)은 t의 변화에 대한 y의 변화율, 즉 y를 t로 미분한것을 나타낸다. 이 변화율은 y의 값에 어떤 상수 k를 곱한 것으로 나타낼 수 있다. 이 미분방정식에서 y의 값을 구하기위해 우리는 지수함수(exponential function)를 이용할 수 있다. 식 (4.2)는 지수함수를 이용한 y의 일반해(general solution)이고, (4.2)에서 C는 y의 초기값(initial value)이며 k는 비례 상수(proportionality constant)이다. 

 

그렇다면 식 (4.2)는 어떻게 (4.1)의 일반해가 될 수 있는 것일까? (4.1)의 식을 약간만 변형시킨다면 (4.2)와 같이 만들 수 있다. 아래 식을 보도록 하자. 

 

 

 

위의 식 (5.1)은 (4.1)과 같은 식이다. 양변을 y로 나누고 dt를 곱해준 뒤, 적분(integral)을 해주면 식 (5.2)와 같이 되고, 적분을 수행한 결과가 (5.3)이다. 좌변의 적분 상수 C1을 우변으로 넘겨주고 C1+C2=C를 만든 다음 양변에 지수함수(exponential function)를 취해주면 (5.4)와 같이 된다. 지수법칙에 의해 e^c를 분리한 뒤 C로 치환해주면 식 (5.5)와 같이 정리할 수 있다. 이때 (5.4)의 y의 절대값에 의해 C는 +C와 -C의 두 가지 경우가 발생하게 되는데, C자체가 임의의 값이 될 수 있으므로 +C를 선택하여 (5.5)와 같이 정리할 수 있다. 이렇게 하여 (5.5)와 같이 미분방정식의 일반해(general solution)를 도출하였다. 

 

이해를 돕기위해 아래의 연습문제를 풀어보도록 하자. 

 

Ex) 당신은 연이율 2.4% 복리의 거치식 적금에 가입하였고 100만원을 예금하였다. 이 적금이 10년후, 50년 후엔 각각 얼마가 되어있을까? 

 

식 (5.5)에 이 문제를 적용하면 각 변수는 다음과 같이 설정할 수 있다. 우선 예금금 100만원은 초기값으로 C=100만원이 되고, 연이율 2.4%는 비례 상수(proportionality constant)가 되어 k=0.024가 된다. 문제에서 나타난 수치들을 식 (5.5)의 수식으로 만들어보면 다음과 같다. 

 

 

식 (6.1)은 연습 문제의 내용을 식 (4.1)의 미분방정식의 형태로 나타낸 것이다. 해(t)가 지날 때마다 내가 저축한 원금(y)이 얼마만큼씩 변하는지가 (6.1)의 좌변이 나타내는 것이고, 이 변화율은 현재의 시간 t에서의 원금 y에 이율 2.4%를 곱한 것과 같다는 것이 우변이 의미하는 것이다. 문제의 내용을 미분방정식의 형태로 정리하긴 했는데, 이를 어떻게 풀지가 막막할 것이다. 이때 활용할 수 있는 것이 식 (5.5)의 일반해(general solution)이다. 식 (6.2)는 (6.1)의 미분방정식을 일반해로 나타내어 푼 것이다. 

 

계산 결과 10년 후에는 약 127만원, 50년 후에는 약 332만원이 통장에 남게된다. 이 값은 근사값(approximate value)으로 실제 값과는 약간 차이가 있으나 거의 근접한 값을 구할 수 있다. 그러나 t가 커질 수록 오차는 벌어지게 된다. 이와 같이 미분방정식(differential equation)은 지수함수(exponential function)가 포함된 일반해(general solution)의 형태로 표현할 수 있으며 이를 통해 미분방정식의 해(solution)를 구할 수 있다. 이 관계를 잘 숙지하도록 하자. 

 

 

 

2. 미분방정식과 선형대수

 

- Differential equations and Linear algebra

 

미분방정식은 식 자체가 굉장히 복잡한 만큼 여러 가지 풀이 방법이 존재한다. 이번 챕터에서 배울 내용은 이러한 미분방정식을 선형대수의 행렬을 이용해서 푸는 방법이다. 이곳에서 다룰 내용은 상미분방정식(ODE)만 해당한다. 우선 아래의 두 개의 선형미분방정식(Linear Differential Equation)을 살펴보자. 

 

 

식 (7)은 u1과 u2에 대한 선형미분방정식을 differential form으로 각각 나타낸 것이다. 이 표기법이 익숙치 않다면 u1, u2를 x, y로 각각 생각하면 된다. u1과 u2의 미분값은 각각 서로를 포함하고 있기 때문에 이 둘은 서로 관계가 있고 따라서 하나의 벡터로 만들어서 행렬을 이용해 함께 풀어낼 수 있다. 행렬을 이용하여 풀기 위해 이들을 벡터로 정의하면 아래와 같다.  

 

 

여기서 우리가 구하고자 하는 것은 식 (7)의 두 개의 미분방정식을 행렬을 이용하여 1차 식으로 만들어 푸는 것이다. 이를 위해 u1과 u2를 원소(component)로 하는 벡터 u(t)를 식 (8.1)과 같이 정의할 수 있다. (8.2)는 u를 미분한 du/dt를 나타낸 것이고, (8.3)은  t=0일때의 초기 조건(initial condition)에서의 값을 의미한다. 

 

u와 u'을 정의했으니 이제 남은 행렬 A를 정의하면 우리가 구하고자 하는 미분방정식의 행렬 형태를 정의할 수 있다. A는 어떻게 정할 수 있을까? 이를 위해 먼저 아래와 같이 식을 나열해보자. 

 

 

식 (9)의 u1'은 (7.1)의 좌변에 표현된 u1의 미분값에 해당한다. 이 u1'이 되기 위해선 우변의 u1과 u2에 각각 얼마씩이 곱해져야하는지를 생각해보면 A의 row1을 알 수 있다. -1과 2를 각각 u1과 u2에 곱하면 u1'이 된다. 따라서 A의 row1은 -1, 2가 되고, 마찬가지로 식 (7.2)를 참고하여 row2를 구해보면 1, -2가 되는 것을 알 수 있다. 

이렇게 하여 식 (9)를 다시 써보면 아래와 같다. 

 

 

위와 같이 식 (7)의 두 개의 미분방정식을 행렬에 대한 식으로 표현하였다. 이 식을 통해 두 미분방정식에 대하여 무엇을 알 수 있을까? 우리는 식 (7)에 표현된 u1과 u2에 대한 미분방정식이 시간이 지남에 따라 어떻게 변하는지를 식 (9)를 통해 알 수 있다. A의 고유값(eigenvalue)과 고유벡터(eigenvector)를 통해서 말이다. A의 고유값과 고유벡터를 구해보자. 

 

 

식 (10.1)을 통해 행렬 A의 고유값이 각각 0과 -3임을 알았다. A가 2x2이면서 특이행렬(singular matrix)이기 때문에 두 개의 고유값중 하나가 0이 나오는 것이다. 이 특성을 알고 2x2행렬에선 trace가 모든 고유값들의 합과 같다는 성질을 이용하여 계산과정 없이 고유값을 빠르게 구할 수도 있다. 다음으로 고유벡터를 구하기 위해 (A-λI)x=0 의 해인 null space를 구해야 한다. 이때의 행렬이 특이 행렬이므로 x2가 free variable이다. 이 free variable을 1로 설정한 뒤 나머지 해를 구하면 (10.2)와 (10.3)과 같이 고유벡터를 구할 수 있다. 

 

 

- General Solution

 

식 (9)의 행렬 A에 대한 고유값(eigenvalue)과 고유벡터(eigenvector)를 구했으니 이제 이들을 활용하여 u(t)에 대한 해를 구해보도록 하자. A는 2x2크기의 행렬이므로 두 개의 고유값과 고유벡터를 가진다. 따라서 u(t)에 대한 일반해(general solution)는 두 개의 special solution, 즉 두 개의 exponential solution의 조합으로 표현할 수 있다. 아래의 식을 보자. 

 

 

식 (11)은 (9)에 나타난 u(t)의 일반해(general solution)를 나타낸 것이다. 식 (5)에서 보인것과 같이 미분방정식의 일반해를 exponential solution의 형태로 보이긴 했는데, 과연 이들이 미분방정식의 해의 형태가 될 수 있는가에 대한 의문이 생길 수 있다. 우리가 최종적으로 구하고자 하는 du/dt = Au에 exponential solution을 대입해서 이를 확인해보도록 하자. 

 

 

(12.1)에서와 같이 초기값을 고려하지 않은 순수 지수함수(pure exponential)를 u로 여겨 원래의 식에 대입하여 정리하면 (12.2)와 같이 정리할 수 있다. 좌변은 u의 pure exponential을 t로 미분한 결과이며, 따라서 exponential의 지수부인 람다(λ)가 앞으로 나와 계수로 곱해진 것이다. (12.2)의 양변을 지수함수로 나누어주면 결과적으로 (12.3)과 같이 정리할 수 있으며, 이는 앞서 공부했던 고유값/고유벡터의 정의와 같은 것을 볼 수 있다. 마찬가지로 λ2에 대한 pure exponential을 대입 해도 해를 구할 수 있다. 이를 통해 우리가 구하고자 하는 (12.1)의 행렬로 정의된 미분방정식의 해를 지수함수(exponential function)를 통해 구할 수 있음을 증명한 셈이다. 

 

식 (11)에 정의된 지수함수(exponential function)로 정의된 미분방정식의 일반해는 지난 강의(Lecture 22)에서 배웠던 대각화(diagonalization)에서의 일반해와 같은 꼴로 생각할 수 있다. 단지 t로 정의된 연속적인(continuous) 개념인지, k로 정의된 이산적인(discrete) 개념인지가 다르다. 아래의 두 식은 2x2크기 행렬의 미분방정식(differential equation)과 차분방정식(difference equation)의 일반해를 각각 나타낸다.  

 

 

이제 지수함수와 벡터는 알겠는데, 각 항의 앞에 곱해진 상수 c1과 c2는 어떻게 알 수 있을까? 이들 상수는 초기 조건(initial condition)으로부터 계산할 수 있다. 이는 앞부분에 미분방정식의 개념을 설명할 때 배웠던 식 (4)의 일반해의 초기값(initial value) C에 해당하는 값이다. 식 (8.3)의 초기값으로부터 c1과 c2를 구해보도록 하자.  

 

 

우선 (14.1)은 앞서 구한 고유값과 고유벡터를 대입하여 일반해의 식을 정리한 것이다. 고유값이 각각 λ1=0, λ2=-3이므로 첫 번째 지수 함수는 1이 되고, 두 번째 지수함수의 지수부는 -3t가 되어 (14.1)과 같이 정리할 수 있다. 이때 t=0일 때의 초기값 u가 u(0)=[1 0]T이므로 t에 0을 대입하여 정리하면 (14.2)와 같이 정리할 수 있다. c1과 c2는 각각 column vector에 곱해진 계수가 되기 때문에 이 column vector(고유 벡터들)들을 행렬로 정리하면 (14.3)과 같이 나타낼 수 있으며, 이때의 행렬을 고유벡터 행렬(eigenvector matrix) S라고 한다. S를 가우스 소거(Gauss elimination)를 통해 c1과 c2를 계산하면 각각 c1=1/3과 c2=-1/3이 된다. (가우스 소거법은 Lecture 2참조)

 

고유벡터 행렬 S를 통해 우리는 해(solution)의 계수(coefficient) c1, c2, ...를 구할 수 있으며, 이 계수들은 해에서 각 순수 지수함수(pure exponential)들이 얼마만큼인지를 나타낸다. 이 계수들은 t=0일 때의 u인 u(0)로부터 구할 수 있으며, 이렇게 구한 계수들은 t가 무한대로 갔을 때 경우에 따라 극한값이 되기도 한다. 

 

c1과 c2를 구했으니 이들을 일반해 식에 대입하여 정리하면 아래와 같다. 

 

 

식 (15)가 (9)의 미분방정식의 일반해(general solution)이다. 일반해를 도출하기까지의 과정을 살펴보면 먼저 미분방정식을 행렬의 형태로 만든 다음, 초기 조건(initial condition)에 따른 초기 값을 구하고 행렬의 고유값과 고유벡터를 구한 뒤, 고유벡터행렬을 통해 각 term의 계수값들(c1, c2, ...)을 구한다. 행렬 A의 고유값, 고유벡터, 계수 등 모든 값들을 구하여 일반해 형태의 식에 대입하고 정리하여 최종적인 해를 구할 수 있다. 

 

식 (15)와 같이 일반해를 구했기 때문에 시간이 지남에 따라 미분방정식의 값이 어떻게 변하는지를 쉽게 알아낼 수 있다. 시간에 대한 변수인 t값만 대입해주면 해당 시간에서의 값을 알 수 있다. 그런데 우리가 세운 미분방정식이 만약 어떤 기계의 진동에 따른 기계 수명 예측과 같은 문제라고 한다면, 경영진 입장에서는 당연히 아주 오랜 시간이 지났을 경우 기계의 기대 수명이 궁금할 것이다. 즉 우리가 여기서 알고자 하는 것은 시간이 무한대로 지났을 때 미분방정식의 값이다. 이는 앞서 구했던 미분방정식 행렬의 고유값과 관련이 깊다. 다음 파트에서 고유값과 미분방정식의 무한대 시간에서의 해(infinite solution)의 관계에 대해 알아보자. 

 

 

- Stability

 

우리는 지난 대각화 강의에서 고유값을 통해 해당 차분방정식의 특성을 파악할 수 있음을 언급했다. 마찬가지로 이번 강의에서 다뤘던 미분방정식 행렬의 경우에도 고유값을 통해서 관련 특성을 파악할 수 있다. 즉 식 (9)의 A의 고유값을 통해 우리는 행렬 A에 내포된 미분방정식들이 시간이 지남에 따라 어떻게 변하는지를 예측할 수 있다. 그리고 궁극적으로 시간이 무한대로 지났을 때 그 극값이 어떻게 되는 지를 알 수 있다. 

 

식 (10)에서 계산한 첫 번째 고유값은 0이고, 이 고유값은 식 (11)에서 일반해의 첫 번째 term인 c1*exp(0*t)*x1의 지수 함수의 지수부가 된다. 따라서 지수함수는 t가 아무리 증가해도 0의 거듭제곱 꼴이 되기때문에 항상 1이 되므로 식 (15)에서 첫 번째 term에서 지수함수 부분이 사라진 것이다. 이는 결국 미분방정식이 시간이 지날수록 정상상태(steady state)로 수렴함을 의미한다. 

 

두 번째 고유값은 -3이고 식 (11)에서 c2*exp(-3*t)*x2의 꼴이 되기 때문에 t가 커질수록 지수함수의 지수부는 작아지고 점점 작은 값이 된다. 따라서 두 번째 term의 식 자체가 시간이 증가할수록 굉장히 작은 값이 된다. 결과적으로 우리가 구한 일반해 (15)의 극한값(t가 무한대로 갔을 때의 값)은 아래와 같다. 

 

 

 

식 (16.2)가 극한 값이며, 실제 값은 [0.666... , 0.333...]T이다. 식 (7.1)의 미분방정식의 t가 무한대일때의 극한값은 0.666..., 식 (7.2)의 극한값은 0.333...이다. 이들은 2개의 미분방정식 (7.1), (7.2)가 연립된 형태인 시스템 (9)에 대한 해 벡터(solution vector)의 극한값 u(t=)=[0.666..., 0.333...]T이다. 

 

미분방정식은 대수방정식(Algebraic equation)처럼 어떤 값이나 값들의 집합의 형태로 해가 나오는 것이 아니다. 미분방정식의 해는 (15)와 같이 식의 형태로 나오며, MATLAB과 같은 프로그램을 통해 시간이 지남에 따라, 혹은 종속 변수(dependent variable)가 변함에 따라 해가 어떤 식으로 변하는지를 알 수 있다. 아래 그래프는 (15)의 해가 시간이 지남에 따라 변하는 과정을 나타낸 것이다. 

 

 

Fig. 1 미분방정식의 해가 시간이 지남에 따라 변화하는 과정

 

 

Fig. 1에서 빨간색 선과 파란색 선이 각각 일반해의 u1과 u2를 의미한다. t=0에서부터 시간이 지남에 따라 특정 값에 수렴하는 것을 볼 수 있는데, 최종적으로 수렴하는 값이 u1=0.666..., u2=0.333... 임을 알 수 있다. 이는 (16)에서 구한 극값과 일치한다. uf(first)라고 표시된 벡터는 일반해에서 첫 번째 고유값인 0이 속해있는 식을 의미한다. 녹색과 자홍색 그래프가 uf의 u1과 u2에 각각 해당하는데, 시간이 지나도 어떤 특정값에서 변화가 없음을 확인할 수 있다. 이는 고유값이 0이기 때문에 지수함수 부분이 항상 1이 되기 때문이다. 

 

us(second)라고 표기된 벡터는 일반해에서 두 번째 고유값인 -3이 속해있는 식을 의미한다. 지수부의 고유값이 음수이기 때문에 시간이 지날수록 값이 작아지는 것을 볼 수 있다. 하늘색과 검은색 그래프가 초기 값에서 시간이 지날수록 0으로 수렴하는 것을 볼 수 있다. 

 

이와 같이 미분방정식을 행렬을 이용하여 풀 때 행렬의 고유값에 의해서 우리는 연립미분방정식의 해가 시간이 지남에 따라 정상상태(steady state)수렴할 수도, 값이 0이 되어 사라질 수도 혹은 값이 무한대로 커져서 발산할수도 있다. 그렇다면 고유값이 어떤 상태일 때 발산 혹은 수렴이 될까? 아래의 정리를 살펴보자. 

 

(1) Stability  (2) Steady State  (3) Divergence 



 

 

미분방정식의 해는 크게 세 가지 상태가 될 수 있는데, 위의 표에 나타난 것과 같이 0으로 수렴하는 안정화 상태인 stability, 어떤 특정 값으로 수렴하는 정상 상태(steady state) 그리고 아예 값 자체가 무한정 커지는 divergence상태가 있다. 

 

만약 모든 고유값이 0보다 작다면 stability 상태가 된다. 이때는 해(solution) u(t)가 시간이 지날수록 0으로 수렴하게 되는데, 모든 고유값이 0보다 작은 음수인 경우 모든 지수함수의 값들이 점점 작아지기 때문이다. 여기서 고유값을 실수부(real part)라고 지정한 것은 해가 허수부(imaginary part)를 포함할 수도 있기 때문이다. 아래의 예를 보자. 

 

 

식 (17.1)은 허수부를 포함한 지수함수이다. 지수법칙에 의해 실수부와 허수부를 나눌 수 있는데, 이때 허수부의 크기는 오일러 공식에 의해 항상 1이 되기 때문에 t가 커진다고 해도 해에 실질적인 영향은 주지 않는다. 허수부는 오일러 공식 위키(https://en.wikipedia.org/wiki/Euler%27s_formula)에서 볼 수 있듯이 t가 증가해도 그저 복소 평면에서 단위 원(unit circle)을 반복해서 돌 뿐이다. 결국 Stability는 고유값의 실수부(real part)에 의해서만 결정된다

Stability를 만족시키는 조건은 2x2 크기의 행렬에서는 trace와 행렬식(determinant)로 쉽게 구할 수 있다. 2x2행렬에선 trace(A)=λ1+λ2, det(A)=λ1*λ2 임을 이용하여 trace < 0와 det > 0를 만족한다면 두 개의 고유값이 모두 음수이므로 Stability상태가 됨을 쉽게 알 수 있다. 

 

두 번째로 정상 상태(Steady state)의 경우는 해가 어떤 특정 값으로 수렴하는 경우를 의미하는데, (15), (16)에서 구한 해가 바로 이 경우 이다. 즉 어떤 하나의 고유값이 0이고 나머지 고유값이 0보다 작은 경우에 해당하는데, (16)의 경우에 첫 번째 고유값이 0이고, 두 번째 고유값이 0보다 작은 -3이므로 시간이 지날수록 두 번째 term은 0으로 수렴하여 사라지고 첫 번째 term의 상수인 c1=1/3과 첫 번째 고유값 x1=[2 1]T의 곱의 값으로 수렴하게 된다. Fig. 1의 빨간색과 파란색 그래프가 바로 이 특정 값으로 수렴하는 모습을 보여준다. 

 

마지막의 경우는 어떤 고유값이 하나라도 0보다 큰 경우 시간이 지날 수록 무한대로 커져서 발산하게 된다. 

 

종합해보면 복소수까지 고려했을 때 오직 실수부의 고유값만이 미분방정식의 해에 영향을 미치고, 고유값(eigenvalue)이 0보다 크고 작음, 혹은 같음에 따라 해의 상태가 결정된다. 

 

아래 그림은 Fig. 1을 plot하기 위한 MATLAB 소스코드이다. 

 

 

 

3. 마치며(continue)

 

이번 강의에선 미분방정식의 간단한 소개와 함께 선형대수를 이용하여 미분방정식을 푸는 방법을 배웠다. 기본적으로 미분방정식에 대한 식을 세운 뒤 고유값과 고유벡터를 구하여 일반해에 대한 식을 세운 다음 초기 조건으로부터 일반해의 계수를 구하는 순서로 해를 구하게 된다. 해는 지수함수의 고유값의 거듭제곱꼴로 나타나는데, 고유값이 0보다 크거나 같음 또는 작음에 따라 해의 상태가 결정됨을 배웠다. 다음 포스팅에서는 이번 강의에 이어서 미분방정식과 선형대수의 나머지 이야기를 하도록 하겠다. 

 

이번 포스팅에서 다룰 내용은 바로 행렬의 대각화(Diagonalization)이다. 행렬의 대각화는 지난 시간에 배운 고유값(eigenvalue)과 고유벡터(eigenvector)를 활용하기 위한 하나의 방법이라고 할 수 있으며, 다른 말로는 고유값분해(Eigendecomposition)라고도 불린다. 또한 행렬의 대각화를 통해 LU 분해, QR분해와 같이 행렬을 고유값과 고유벡터로 구성된 부분 행렬들로 분해할 수 있으며, 이는 어떤 반복적인 선형방정식을 풀 때 굉장히 유용한 특성을 가지고 있다. 대각화에 대해 공부해보자. 

 

 

1. 행렬의 대각화(Diagonalization)

 

- Diagonalizing a matrix

 

지난 시간에 우리는 고유값(eigenvalue)과 고유벡터(eigenvector)에 대한 내용을 배웠다. 일단 관련 식을 다시 써보자. 

 

 

식 (1)을 다시 한 번 설명해보면 람다(lambda, λ)는 고유값을, x는 고유벡터를 각각 나타내며, 행렬 A에 의해 선형 변환(Linear transformation)을 시켜도 변환 전과 후가 평행한(parallel) 벡터를 고유벡터, 그리고 길이 변화량의 정도를 나타낸 것이 고유값이다. 이 고유값/고유벡터를 알면 행렬 A의 중요한 특성과 정보를 알 수 있으며 다양한 곳에 응용할 수 있다. 그 중 하나가 바로 행렬의 대각화(diagonalization)이다. 그렇다면 고유값과 고유벡터를 이용하여 행렬 A를 어떻게 대각화 할 수 있는 걸까? 

 

우선 식 (1)은 하나의 고유벡터와 고유값에 대한 식이다. 그러나 일부 경우를 제외하곤 대부분의 nxn크기의 행렬은 n개의 고유값과 고유벡터를 갖는다. 어떤 행렬 A의 n개의 고유값과 고유벡터를 찾은 뒤엔 아래의 식에 따라 대각화를 수행하면 된다. 

 

 

식 (2)는 대각화에 대한 식이며, 이번 포스팅의 핵심적인 식이라고 보면 된다. 식 (2)에서 A는 원래의 행렬을 의미하고, 행렬 S는 A의 고유벡터들을 column vector형태로 차례로 끼워 넣은 nxn크기의 고유벡터 행렬이다. 이때 A의 앞에는 S의 역행렬이, A의 뒤에는 S가 각각 곱해진다. 이렇게 좌변을 계산하면 우변의 Λ (대문자 람다)행렬이 만들어지는데, 이 람다 행렬(Λ)은 대각 행렬(diagonal matrix)이고 각각의 대각 원소들은 고유값들로 차례로 채워져있다. 이제 식 (2)가 대충 뭘 나타내는지는 알겠는데, 도대체 저게 어떻게 만들어졌고, 무슨 의미가 있다는 걸까? 이제부터 차근차근 알아보도록 하자. 

 

그 전에 먼저 식 (2)에서 눈여겨봐야할 것이 있다. 앞에서 S는 A의 고유벡터들로 이루어진 고유벡터행렬(eigenvector matrix) 이라고 배웠다. 그런데 식 (2)의 A앞에 S의 역행렬(Inverse matrix)이 곱해져 있는 것을 볼 수 있다. 이것이 의미하는 것은 무엇일까? 바로 S가 역행렬을 가질 수 있어야 하고, 이는 S가 특이 행렬(singular matrix)이 아니어야 함을 의미하며, 결국 A의 고유벡터들이 n개의 독립(independent)인 벡터를 가져야 한다는 것이다

 

일단 A가 n개의 독립인 고유벡터를 가진다고 가정할 때, 이 고유벡터들을 column vector의 형태로 차례로 붙여서 S를 만들었다고 해보자. 이때 A와 S를 곱하면 어떤 일이 벌어질까? 아래의 수식을 통해 확인해보자. 

 

 

식 (3)은 행렬 A와 그의 고유벡터(eigenvector)들로 만들어진 행렬 S와의 곱을 나타낸다. S에서 x1, x2, ... xn은 각 고유벡터들을 column 형태로 삽입한 것이다. A와 S를 곱할 때 지난 강의(행렬 곱셈) Lecture 3에서와 같이 column-wise로 생각할 수 있다. 즉 A와 S의 첫 번째 column vector x1과 곱해져서 Ax1이라는 하나의 column vector가 만들어지고, 차례로 Ax2, ... Axn이 계산되어 결과적으로 이들 Ax1, Ax2, 등의 column vector들로 이루어진 동일한 크기의 행렬이 만들어진다. 

 

그런데 가만히 보면 Ax1은 원래의 행렬 A와 그의 첫 번째 고유벡터와의 곱이다. 여기서 우리는 식 (1)을 떠올릴 수 있다. Ax1은  λ1x1이다. 따라서 (3.2)와 같이 쓸 수 있다. 결국 AS의 곱을 (3.2)와 같이 각 column vector들을 고유값과 고유벡터들의 곱으로 표현할 수 있으며, 이는 식 (1)의 개념으로부터 나온 것이다. 

 

최초에 AS의 곱을 (3.2)와 같이 표현하였다. 여기서 고유값들을 고유벡터로부터 한 번 더 분리하여 나타낼 수 있다. 이때 중요한 것은 (3.2)를 S와 고유값들과의 곱으로 분리할 때 행렬끼리의 곱으로 나타내고 싶다는 것이다. 어떻게 할 수 있을까? 다시 한 번 column-wise의 행렬곱을 생각해보자. S를 고유벡터행렬, 여기에 곱해질 어떤 행렬을 가령 V라고 생각해 봤을 때, Sv1이 (3.2)의 첫 번째 column vector인 λ1x1이 되어야한다. 이렇게 되기 위해선 v1의 첫 번째 component만 λ1이고 나머지 component들은 모두 0이어야 한다.  λ2x2가 되기 위해선 v2의 두 번째 component만 λ2이고 나머지는 0이어야 한다. 이런식으로 만든 행렬이 바로 (3.3)의 오른쪽 고유값(eigenvalue)들로 이루어진 행렬이고, 대각 행렬(diagonal matrix)의 형태이다. 우린 이 고유값들로 이루어진 행렬을 대문자 람다(capital lambda)를 써서 Λ라고 표현한다. (※ 일반적으로 대문자는 행렬을, 소문자 볼드체는 벡터를, 소문자는 벡터의 원소나 스칼라 값을 나타냄)

 

결과적으로 (3.1)에 표현된 최초의 AS의 행렬곱셈을 (3.3)과 같이 SΛ로 표현할 수 있으며 AS=SΛ이다. 이렇게 표현할 수 있는 근간에는 우리가 지금까지 공부해왔던 고유값/고유벡터에 대한 식 (1)이 있다. 즉 식 (3)은 식 (1)의 확장판이라고 생각하면 된다. 식 (3)에서 얻은 결론을 다시 써보면 아래의 식과 같다. 

 

 

식 (4)가 의미하는 것은 어떤 행렬 A에 고유벡터행렬 S를 곱하면, 고유벡터행렬에 고유값행렬을 곱한 것과 같다, 즉 식 (1)을 모든 고유값/고유벡터에 대해서 한번에 정리한 식이라고 할 수 있다. 결국 식 (1)로부터 (4)를 유도한 셈이다. 식 (4)로부터 우리는 다양한 식을 유도할 수 있다. 양변의 왼쪽에 S의 역행렬(inverse matrix)을 곱해보자. 

 

 

식 (4)의 양변의 왼쪽에 S의 역행렬을 곱했더니 우리가 처음에 핵심적인 식이라고 배웠던 식 (2)가 만들어졌다. 이 과정이 임의의 정방행렬 A를 대각화(diagonalization)하는 과정이다. 여기서 중요한 것은 양변에 S 역행렬을 곱했는데, 이것은 S가 역행렬을 가질 수 있어야 한다는 조건을 만족해야 하며, A가 n개의 독립인 고유벡터를 가져야 함을 의미한다. 지난 강의 Lecture 21-(2)의 마지막에 n개의 독립인 고유벡터(eigenvector)를 가지지 못하는 행렬(triangular matrix)에 대해서 알아봤다. 그러나 이러한 경우는 일부이며, 대부분의 행렬은 n개의 독립인 벡터를 가지기 때문에 여기서는 고유벡터행렬(eigenvector matrix)이 역행렬을 가질 수 있음을 가정하겠다. 

 

 

- Factorization of a matrix

 

우리는 식 (4)로부터 행렬 A를 대각화(diagonalization)하여 고유값들로만 이루어진 식 (2)와 같은 대각 행렬을 만들었다. 그런데 이런 고유값행렬(eigenvalue matrix)말고도 다른 형태의 행렬을 만들 수 있다. 식 (4)에서 양변의 좌측에 S의 역행렬을 곱했다면, 이번에는 양변의 우측에 역행렬을 곱하는 것이다. 아래 식을 보자. 

 

 

식 (5.1)로부터 양변의 우측에 S의 역행렬을 곱했더니 식 (5.2)와 같은 식을 만들어냈다. 즉 A를 고유벡터행렬(eigenvector matrix)인 S와 고유값행렬(eigenvalue matrix)인 Λ, 그리고 고유벡터행렬의 역행렬의 곱으로 정의한 것이다. 이는 결국 A를 이전에 공부했던 LU factorization(가우스 소거로부터 행렬을 분해하는 방법, Lecture 4), QR decomposition(그람 슈미트 정규 직교화 방법으로 행렬을 분해하는 방법, Lecture 17-(2))과 같이 행렬을 분해하는 하나의 방법이며, 고유값과 고유벡터들의 행렬의 조합으로 행렬을 인수 분해(factorization)하는 방법이다. 조합되는 방법이 S와 대각 행렬, 그리고 다시 S의 역행렬이 반복됨을 주목하자. 

 

 

- Useful attribute

 

이제 이 행렬이 얼마나 유용한 특성을 가지는지 알아보도록 하자. 우리가 어떤 문제를 풀때 선형대수를 이용하여 선형연립방정식을 세우고, 이를 반복적으로 곱해서 계산해야 할 때가 있다. 이런 경우 A를 제곱, 3제곱, ... n제곱 과 같은 식으로 반복해서 곱해야할 때가 있는데, 이렇게 반복하여 자기 자신을 곱해야할 때 대각화에 의한 행렬 분해가 굉장히 유용한 특성을 가진다. 먼저 이 분해가 고유값과 고유벡터 식으로부터 유도된 만큼 A를 제곱했을 때 고유값/고유벡터 식 (1)이 어떻게 변하는지 알아보자. 

 

 

식 (6.1)은 고유값/고유벡터 식이다. 여기서 A를 제곱했다는 것은 식 (6.1)의 양변의 좌측에 각각 행렬 A를 곱한 것과 같다. 이렇게 양변에 A를 곱하면 식 (6.2)가 만들어지는데, (6.2)에서 우변의 람다는 상수이기 때문에 앞으로 빼서 정리했다. 이때 (6.2)의 우변에서 Ax는 λx와 같기 때문에 바꿔서 써주면 λλx가 되고, 최종적으로 (6.3)과 같이 정리할 수 있다. 결국 고유값/고유벡터 식에서 A를 제곱하면 우변의 고유값(eigenvalue)인 람다(λ)가 제곱이 된다. 이때 고유벡터는 A의 제곱과는 무관하게 변함없이 그대로이다. 

 

식 (6)에서 단일 고유값/고유벡터 식의 A제곱에 대한 내용을 살펴봤으니 이번에는 고유값행렬과 고유벡터행렬에 대한 식 (5)를 가지고 A의 제곱을 하면 어떤 결과가 나오는지 살펴보자. 식 (5.2)의 A를 제곱한 결과는 아래 식과 같다. 

 

 

식 (7.1)의 A를 제곱하면 식 (7.2)의 밑줄 친 부분이 단위행렬(identity matrix)이 되어 소거(cancel)되고, 결국 (7.3)과 같이 고유값행렬인 Λ의 제곱이 된다. 이는 단일 고유값/고유벡터에 대한 A제곱식 (6)과 같은 꼴이며 다만 그 형태가 n개의 고유값/고유벡터에 대한 행렬의 형식인 것이다. (6)과 마찬가지로 A를 제곱해도 고유벡터행렬(eigenvector matrix)은 그대로 유지되며 고유값행렬(eigenvalue)만 제곱의 형태로 나타난다. 

 

그런데 제곱이 아니라 세제곱, 네제곱, k제곱을 한다면 어떻게 될까? 실제로 계산을 해보면 세제곱을 하는 경우 역시 중간의 고유벡터행렬들은 단위행렬로써 소거되고, 우변의 고유값행렬만 세제곱이 된다. 결과적으로 A가 k번의 거듭제곱(power)를 하는 경우, 우변에서 고유벡터행렬(eigenvector matrix)은 그대로 유지되고 고유값행렬(eigenvalue matrix)만이 k번의 거듭제곱이 일어난다는 일반적인 식을 도출할 수 있다. 아래의 식 (8)은 이러한 일반식을 나타낸다. 

 

 

식 (8)을 잘 곱씹어보면 다음과 같은 통찰력을 얻을 수 있다. 어떤 행렬 A의 고유값(eigenvalue)과 고유벡터(eigenvector)는 A의 k번의 거듭제곱을 이해하는데에 아주 좋은 방법을 제공해준다. 예를 들어 LU분해나 QR분해 등의 방법을 이용하여 행렬을 인수분해 했을 경우, A를 1000제곱하면 LU*LU*...를 1000번 수행한 행렬이나 QR*QR*...를 1000번 수행한 행렬을 가지고 A의 1000제곱이 어떤 결과를 보일지를 예측하거나 A가 어떤 행렬인지를 분석해야 한다. 이들 분해 방법으로는 거의 불가능하다. 그러나 고유값행렬과 고유벡터행렬로 분해한 식 (8)의 방법은 A의 1000제곱에 대해서 단지 고유값행렬(eigenvalue matrix)의 1000제곱만 분석하면 된다. 이마저도 고유값행렬의 1000제곱을 할 필요도 없이 각 고유값들의 제곱을 계산해도 된다. 

 

 

식 (9)는 고유값행렬의 제곱을 나타내며, 그 결과는 대각 원소들인 각 고유값들이 자기자신을 제곱한 것과 같은 것을 볼 수 있다. 따라서 A의 거듭제곱에 대한 계산이 훨씬 쉽고 효율적으로 진행된다. 

 

또한 행렬 A를 고유값행렬과 고유벡터행렬로 대각화(diagonolization)하면 A가 어떤 특성을 가지는지, 혹은 k번의 거듭제곱을 했을 때, 어떤 결과가 나올지를 대략 유추해 볼수도 있다. 가령 아래와 같은 조건을 갖출 경우, 우리는 행렬 A를 안정 행렬(stable matrix)라고 할 수 있다. 

 

 

식 (10)의 조건에 따르면 어떤 행렬 A의 모든 고유값의 절대값이 1보다 작을 때 A의 거듭제곱(power)을 지속해 나갈 수록 A는 0으로 수렴한다. 이때 A는 stable하다 라고 할 수 있다. 그 아래 예를 보면 행렬 A의 고유값은 각각 λ1=0.4172, λ2=0.9828인데 둘 다 절대값이 1보다 작다. 이때 A를 거듭제곱한 결과가 그 아래 나와있는데, A의 10제곱, 50제곱, 100제곱을 거듭 할수록 A의 원소의 값들이 점점 작아지는 것을 볼 수 있다. 결국 어떤 행렬의 고유값(eigenvalues)들의 상태를 보고 해당 행렬의 특성이나 거듭제곱을 무한대로 반복했을 때의 결과를 끝까지 해보지 않아도 예측할 수 있는 것이다. 

 

 

2. 대각화 가능한 행렬(Diagonalizable matrices)

 

- Which matrices are diagonalizable?

 

지금까지 우리는 어떤 행렬 A를 대각화(diagonolization)과정을 통해 고유값행렬(eigenvalue matrix)과 고유벡터행렬(eigenvalue matrix)로 분해한다면 A의 거듭제곱을 계산하는데에 있어 굉장히 유용한 특성이 있음을 배웠다. 다시 한 번 강조하지만 대각화(diagonalization)를 위해 가장 중요한것은 A가 n개의 독립(independent)인 고유값과 고유벡터를 가지고 있어야 이 모든 것이 성립한다는 것이다. 그렇다면 어떤 행렬들이 대각화가 가능할까? 바로 아래의 정의를 만족시키는 행렬들이 대각화 가능한(diagonalizable)행렬들이다. 

 

 



대각화 가능한(diagonalizable) 행렬의 조건:
    • 어떤 행렬 A의 고유값(lambda, λ)들이 전부 서로 다른 값을 가진다면, 즉 반복되는 고유값이 없다면, A는 반드시 n개의 독립인 고유벡터(eigenvectors)를 가지며 대각화가 가능하다(diagonalizable)

 

위의 노란 박스안에 정의된 조건을 만족하는 행렬은 대각화가 가능한 행렬이다. 위의 정의에 대한 증명이 궁금하다면 여기를 참조하기 바란다. 혹시나 위의 정의가 맞는지 의심이 들 수도 있기에 MATLAB을 이용하여 실험을 해보았다. MATLAB의 랜덤 함수 rand()를 이용하여 20x20크기의 랜덤값을 가진 행렬을 만들고, 고유값행렬(eigenvalue matrix)과 고유벡터행렬(eigenvector matrix)을 eig()함수를 이용하여 구한 다음 고유값행렬에서 같은 고유값이 존재하는지 확인한다. 그 다음으로 n개의 독립인 고유벡터를 가지는지 확인하기 위해 고유벡터행렬의 rank를 계산하여 n보다 작은지를 검사하여 그 횟수를 세는 간단한 프로그램이다. for문을 이용하여 1000번 반복하였다. 아래 그림은 MATLAB코드와 그 결과를 캡쳐한 화면이다. 

 

 

 

 

Fig. 1 MATLAB코드와 n개의 서로 다른 고유값 실험

 

실험 결과 1000번의 반복에도 단 한번의 카운트가 되지 않았음을 알 수 있다. 이는 결국 서로 다른 n개의 고유값을 가지면 n개의 독립(independent)인 고유벡터가 존재함을 실험적으로 보인 것이다. 물론 완벽한 증명법은 아니겠지만, 이미 수학적으로 증명된 정의를 실험을 통해 한 번 더 확인하는 과정이라고 생각해도 좋을것이다. 

 

 

- When A has repeated eigenvalues (positive case)

 

A가 만약 반복되는 고유값을 가진다면 무조건 n개의 독립인 벡터를 가질 수 없는 걸까? 반드시 그렇지는 않다. 다만 반복되는 고유값을 가진 경우, 좀 더 면밀히 살펴봐야한다. 즉 아래의 정의로 설명할 수 있다. 

 



    • A가 반복되는 고유값(eigenvalues, lambdas)을 가진 경우, A는 n개의 독립(independent)인 고유벡터(eigenvectors)를 가질 수도, 혹은 가지지 않을 수도 있다.  

 

 

그렇다면 어떤 행렬이 반복되는 고유값을 가져도 n개의 독립인 고유벡터를 가질까? 한 예가 바로 단위 행렬(identity matrix)이다. 아래 단위 행렬의 고유값/고유벡터 예를 보자. 

 

 

 

 

식 (11)에서 2x2크기의 단위 행렬의 2개의 고유값은 1로 반복되었다. 그런데 고유값이 반복되었음에도 불구하고 고유벡터는 2개의 독립인 고유벡터가 나왔다. 이는 단위행렬이 어떤 벡터를 곱하여 변형시켜도 자기 자신이 나오게 만드는 특성을 고려해보면 당연한 것이다. 이 단위 행렬을 식 (2)와 같이 대각화(diagonalization)를 하면 어떻게 되는지 살펴보자. 

 

 

 

식 (12)와 같이 대각화에 대한 식에도 성립하는 것을 알 수 있다. 사실 식 (11)에서 계산한 고유벡터 말고도 단위행렬에 대한 2차원 공간의 무수히 많은 고유벡터가 존재한다. 2x2 이외에도 nxn크기의 단위행렬의 경우에도 마찬가지로 모두 동일한 고유값을 가지지만, n개의 독립인 고유벡터가 존재한다. 결과적으로 단위 행렬의 경우 동일한 고유값을 가졌음에도 n개의 독립인 고유벡터가 존재하는 case이다. 

 

또 한 가지 예를 살펴보자. 두 번째로 살펴볼 예는 지난 강의 Lecture 21-(2)에서 살펴봤던 180도에 대한 회전행렬(rotation matrix)이다. 자세한 관련 내용은 전 강의를 참고하도록 하고, 식을 다시 써보면 다음과 같다. 

 

 

단위 행렬과 마찬가지로 고유값은 -1로 동일하게 두 번 반복됐지만, 고유벡터는 2개의 독립인 벡터가 존재함을 볼 수 있다. 지난 강의에서 봤겠지만 180도를 회전시키는 행렬의 경우 변환 전과 후의 벡터가 비록 방향은 완전히 반대로 바뀌지만 평행(parallel)하기 때문에 역시 무수히 많은 고유벡터들이 존재하게 된다. 

 

 

- When A has repeated eigenvalues (negative case)

 

이번엔 고유값이 반복되었을 때 n개의 독립인 고유벡터가 존재하지 않는 경우를 살펴보자. 사실 이 역시 지난 강의 Lecture 21-(2)에서 이미 본 적이 있는 행렬이다. 바로 삼각행렬(triangular matrix)이다. 아래 식을 보자. 

 

 

 

식 (14)의 행렬 A는 삼각행렬의 형태를 띄고 있으며, 고유값은 전부 2로 같다. 지난 강의에서 배웠듯이 삼각행렬은 대각 원소들이 곧 고유값이 됨을 기억하자. det(A-λI)를 계산할 때 아래쪽 원소들 값이 모두 0이기 때문에 반대편(cross) 대각 원소들은 방정식에 포함되지 않는다. 따라서 대각 원소들만이 방정식 계산에 포함되기 때문에 대각 원소들 값이 곧 고유값이 된다. 

 

고유벡터를 구해보면 식 (14)의 아래와 같이 되는데, 보다시피 한 개의 고유벡터만이 존재한다. (A-λI)의 null space인 고유벡터를 구할 때, 식을 만족시키기 위해서는 x2에는 어떤 값도 들어가서는 안된다. 따라서 무조건 0이 되어야 하고 x1에만 임의의 값을 넣을 수 있다. 그런데 이렇게 되면 x는 1차원 공간에 존재하게 되고, 결국 두 고유벡터가 같은 부분 공간에 존재하게 된다. 따라서 2x2행렬에서 단 1개의 고유벡터만 존재하게 된다. 이렇게 되면 n개의 독립인 고유벡터가 존재하지 않기 때문에 삼각행렬의 경우 대각화(diagonolization)가 불가능한 경우다. 

 

 

정리해보면 어떤 행렬 A가 n개의 서로 다른 고유값을 가지는 경우엔 A는 반드시 서로 다른 독립인 고유 벡터를 가지며, A는 대각화가 가능하다. 

반면 A가 어떤 반복되는 고유값을 가지는 경우엔 독립인 고유벡터를 가질 수도 있지만(단위 행렬, 회전 행렬), 그렇지 않을 경우도 존재한다(삼각 행렬)

 

 

 

3. 대각화와 차분방정식(Diagonalization and Difference Equation)

 

- Difference Equation

 

앞서 배운 대각화를 이용하면 방정식(equation)을 손쉽게 풀 수 있다. 지금껏 공부한 선형대수(Linear Algebra)가 선형연립방정식을 손쉽게 풀기 위함인데 갑자기 방정식이라니? 그냥 방정식이 아니라 우리나라말로 차분 방정식, 혹은 계차방정식이라 불리는 Difference equation이다. 계차방정식(difference equation)은 시간이 지남에 따라 상태가 변화하는 문제를 방정식으로 만들어놓은 것이다. 이를테면 바이러스가 1초마다 자기 자신을 둘로 분열시킨다고 했을 때, 처음 1마리가 1000초 후엔 몇 마리가 되어 있는가? 와 같은 문제들 말이다. 즉 방정식(equation)시간(time)과 그에 따른 미분(derivative)의 개념이 들어가 있는 것이다. 

 

여기서 어떤 사람은 "그렇다면 계차방정식이 결국 미분방정식(differential equation) 아닌가?"라고 생각할지도 모르겠다. 이 둘은 비슷해보이지만 약간 다르다. 둘 다 미분(derivative)이라는 개념이 들어가 있지만, 시간을 어떻게 보느냐에 따라 달라진다계차방정식(difference equation)은 시간을 정수단위로 끊어서 생각하는, 즉 이산적인(discrete)개념이고, 미분방정식(differential equation)은 시간을 끊어지지 않고 쭈욱 이어지는 개념, 즉 연속적인(continuous) 개념으로 생각하는 것이다. 아래 식은 똑같은 개념을 각각 계차방정식과 미분방정식의 방법으로 표현한 것이다. 

 

 

식 (15)에서 계차방정식(Difference equation)의 경우 a의 시간에 따른 변화를 n으로 표현하였다. n에 들어갈 수 있는 숫자는 오직 정수뿐이며 소수 등의 다른 숫자는 들어갈 수 없다. 계차방정식이 말하고자 하는 것은 a가 n일때를 기준으로 a의 이전 상태(n-1)는 a의 바로 앞의 상태(n+1)에서 현재 상태(n)를 뺀 값이 되며, 이것이 계속 반복된다는 것이다. n이 +1씩 변화할 때 그에 따라 a가 어떻게 변화는지를 보는 것, 즉 미분(derivative)을 이산적(discrete)으로 나타낸 것이다. n는 보통 시간이나 시퀀스(sequence)를 나타내는데 결국에는 시간(time)의 개념이 들어갈 수밖에 없다. 

 

반면 식 (15)의 우측의 미분방정식(differential equation)을 보면, 여기서 dx는 delta x를 의미하고 x의 변화를 의미한다. dy도 마찬가지로 delta y를 의미하는데, 이때 변화량을 의미하는 delta가 나타내는 그 "변화량"은 무한대로 작은 값을 의미한다. 즉 상상하기 힘들 정도로 아주 찰나의 순간을 의미하며, 결국 이 변화량은 끊어지지 않고 연속적인(continuous) 개념이 된다. dx는 시간일수도 있고 혹은 다른 물리량을 의미할 수도 있다. 여기서는 일단 시간으로 생각해보자. dy는 dx, 즉 x가 아주 찰나의 순간의 변화가 발생했을 때 y가 얼마만큼 변하는지를 나타내며, dy/dx의 나눗셈을 했기 때문에 결국 x가 변화했을 때 y가 얼만큼 변하는지에 대한 비율(ratio)을 의미하게 된다. 계차방정식(difference equation)과의 관계를 살펴보면 x는 n과 관련이 있고, y는 a와 관련이 있다. 식 (15)는 미분에 대한 똑같은 내용을 계차방정식과 미분방정식으로 각각 다르게 표현한 것이다. 

 

사실 현실세계의 문제는 미분방정식이지만, 이를 인간이 보다 이해하기 쉽고 무엇보다도 컴퓨터가 계산하기 좋게 만든 것이 계차방정식이다. 계차방정식도 n과 n+1사이의 간격(or 주기 등)이 짧으면 짧을수록 미분방정식에 가깝게 된다. 

 

 

다시 선형대수 문제로 돌아와서, 우리가 어떤 순서나 시간의 개념이 들어가있는 계차방정식(difference equation)을 선형대수를 이용하여 푼다고 가정해보자. 시간의 개념이 있기때문에 분명 초기값(initial value or initial condition)이라는 것이 존재할 것이다. 이 방정식을 u에 대한 계차방정식이라고 했을 때, 식은 아래와 같다. 

 

 

식 (16)은 u에 대한 계차방정식이며 k번째 u를 시스템 A를 통해 계산했을 때 k+1번째 u의 값을 계산하는 방정식이다. 여기서 u가 순차적으로 변화한다고 했을 때 어느 타이밍 혹은 어느 순서에서 어떤 값이 나올지를 계산하기 위함이므로 u는 초기값 u0상태에서 시작한다. 이를 실제 문제에 빗대어 설명하자면 어느 도시의 인구 증가율을 A라는 방정식으로 만들고, u0가 도시의 초기 인구, k를 초기 년도로부터 몇년 이후의 년도인지를 나타내는 인덱스라고 하자. uk는 도시의 초기 인구 u0로 부터 k년도가 지났을 시점의 인구의 값이다. 이와 같은 문제를 계차방정식(difference equation)으로 표현하면 아래의 식과 같다. 

 

 

식 (17.1)을 보면 초기값 u0에서 A라는 방정식을 통해 u의 다음 시점의 변화된 값 u1을 계산할 수 있다. u1은 다시 A를 통해 그 다음 시점의 값 u2가 되고, k번째 u의 값 uk는 A를 통해 그 다음 차례의 u값인 uk+1이 된다. 그런데 u2를 계산할 때를 보면 u1을 A에 곱하여 계산하는데, u1은 Au0이다. 따라서 식 (17.1)의 u1을 Au0로 치환시켜주면 u2=AAu0가 되고, 결국 A가 2번 거듭제곱 된 형태이다. 이 식을 일반적으로 쓰면 u의 k번째 값 uk를 계산하기 위해선 u0를 A의 k번째 거듭제곱식에 곱해주면 된다. 결국 식 (17.2)의 상자속 식과 같은 일반적인 식이 도출된다. 이 식이 바로 계차방정식(difference equation)을 나타내며, 1차 시스템(first order system)이다. 위의 식이 1차(first order)인 이유는 식 (17.1)과 같이 k에서 k+1로 딱 한 단계만을 연결시키기 때문이고, 시스템(system)이라고 부를 수 있는 것은 우리가 구하고자 하는 미지수(unknown) 단일 숫자가 아닌 벡터(vector)이기 때문이다. 

 

 

- Real solution of difference equation

 

결국 우리는 식 (17.2)의 상자속 식을 통해 u의 100번째, 혹은 1000번째 값을 u의 초기값 u0에 A의 거듭제곱을 곱해서 쉽게 구할 수 있다. 사실 A행렬을 직접 100번 곱해서 u100을 구할 수도 있지만, 앞서 배운 행렬의 대각화(diagonolization)를 이용하면 이 계차방정식을 진짜로 풀 수 있다. 여기서 진짜로 풀 수 있다는 의미는 이 계차방정식에서 k가 커질수록 미지수의 값이 얼마만큼 증가하고 감소하는지 그 증가폭을 알 수 있다는 것이다. 즉 이 계차방정식의 Dynamics를 아는 것이 우리가 구하고자 하는 진정한 해답이고 이를 대각화를 통해 알 수 있다. 단순히 A만 거듭해서 곱해서는 이 시스템에 대한 자세한 정보를 알 수 없다. 이제 계차방정식에 대한 진정한 해를 어떻게 구하는지 알아보자. 

 

우선 주어진 방정식은 초기값 u0가 주어진다. 계차방정식을 진짜로 푸는 과정은 이 초기값인 u0 벡터를 행렬 A의 고유벡터들의 선형 결합(Linear combination)으로 표현하는 것으로부터 시작한다. 아래 식을 보자. 

 

 

식 (18)은 초기값 벡터 u0를 행렬 A의 고유벡터(eigenvectors)들의 선형 결합으로 표현한 것이다(x는 고유벡터, c는 상수). 이를 행렬의 곱 형태로 나타내면 고유벡터행렬(eigenvector matrix)인 S와 상수값 벡터인 c와의 곱인 u0=Sc로 나타낼 수 있다. 그런데 u0는 A의 고유벡터들의 선형 결합으로 표현이 가능한가? 정답은 Yes이다. 단 A가 n개의 독립(independent)인 고유벡터를 가지고 있다는 전제가 있어야 한다. n개의 독립인 고유벡터는 n차원 공간인 Rn의 기저(basis)를 형성하기 때문이다. 따라서 u0는 어떤 값이던 Rn공간내에 존재하기 때문에 A의 고유벡터들의 선형결합으로 표현이 가능한다. 

 

이제 식 (18)의 u0에 행렬 A를 곱하면 어떻게 정리가 되는지 살펴보자. 

 

 

식 (18)의 u0에 행렬 A를 곱하면 (19)와 같이 각각의 분리된 파트에 A가 곱해지는 것과 같다. c는 상수이므로 앞으로 빼서 정리하면 (19.1)처럼 정리할 수 있다. 여기서 각 파트는 cAx의 형태가 되는데, Ax는 고유값/고유벡터 식 (1)에 의해 (19.2)와 같이 λx로 바꿔서 정리할 수 있다. 결국 초기값 u0를 A를 통해 변환시킨 결과를 식 (19)와 같이 고유값과 고유벡터의 선형결합으로 나타냈다. 그러나 우리가 알고자하는 것은 A를 지속적으로 곱했을 때의 결과, 즉 예를 들면 A의 100제곱을 하면 초기값 u0가 어떻게 변화하는지, 그 변화의 정도는 얼마만큼인지 등이다. 식 (19)에서 A의 100제곱을 했을 때 식이 어떻게 되는지 살펴보자. 

 

 

우선 식 (19)에서 A를 한 번 더 곱하면 상수인 c와 λ를 앞으로 빼서 정리하여 (20.1)과 같이 만들 수 있다. 다시 고유값/고유벡터 식을 통해 치환하여 정리하면 식 (20.2)와 같이 되고, 이는 A를 제곱한 수 만큼 각 파트의 람다값이 제곱되는 꼴이 된다. A의 100제곱은 식 (20.3)과 같이 각 파트의 고유값인 람다(lambda)가 100제곱이 되고 이들의 조합으로 정리할 수 있다. 

 

다음으로 식 (20.3)을 앞서 배웠던 행렬의 대각화(diagonalization)방법을 통해 정리해보자. 행렬 A를 대각화하고 u0를 Sc로 나타내면 가운데 S행렬이 단위행렬이 되어 소거되고 식 (20.4)와 같이 정리가 된다. 이를 행렬(matrix)의 형태로 나타낸 것이 식 (20.5)이며, 이 식을 정리하면 (20.3)과 같은 결과가 나오는 것을 알 수 있다. 이를 통해 우리는 초기값 u0가 어떤 방정식 시스템 A에 의해 100번 변환된 결과인 u100을 고유값과 고유벡터로 풀 수 있다. 결과적으로 초기값 u0를 A의 k거듭제곱번 변화시킨 계차방정식(difference equation)은 고유벡터행렬(eigenvector matrix)과 고유값 행렬(eigenvalue matrix)의 k거듭제곱, 그리고 상수벡터 c의 곱으로 식 (20.6)과 같이 정리할 수 있다. 

 

정리해보면 어떤 계차방정식을 제대로 푼다는 것은 이를 고유값과 고유벡터로 풀어내는 것을 의미하며, 여기서 중요한 것은 고유값을 통해 우리는 이 계차방정식의 변화의 추이를 가늠해볼 수 있다는 것이다. 이는 단순히 A를 k번 거듭제곱하여 결과값만을 도출하는 것과는 달리 해당 시스템의 특성을 정확하게 파악하는데에 그 의의가 있다고 볼 수 있다. 다음 section에서 실제 예를 통해 이에 대한 이해를 높여보자. 

 

 

4. 대각화의 응용(Application of the Diagonalization)

 

- Fibonacci number

 

대각화(diagonalization)를 피보나치 수열(Fibonacci sequence)에 응용해보도록 하자. 피보나치 수열은 맨 처음 0과 1로 시작해서 다음 숫자는 앞의 숫자 두 개의 합이 되는 규칙을 가지고 있다. 

 

 

식 (21)은 피보나치 수열을 나타내며 F1, F2는 피보나치 수열에서 각 원소의 인덱스를 나타낸다. 여기서 우리가 알고자하는 것은 이런식으로 수열이 지속적으로 증가할 때 F100번째 값은 무엇인지, 그리고 얼마나 빠르게 값이 증가하는지 이다. 피보나치 수열은 보다시피 F1, F2, ... 와 같이 순서가 더해질 수록 값이 증가하는 체제이다. 이와 같이 시간이나 순서에 따라 특정 규칙으로 값이 변화하는 체제를 우리는 앞서 배웠던 계차방정식(Difference equation)으로 만들 수 있고, 대각화를 통해 고유값과 고유벡터들의 조합으로 표현할 수 있다. 피보나치 수열을 계차방정식으로 만들면 특정 인덱스에서의 값이 무엇인지 알 수 있고, 고유값을 통해 이 계차방정식의 증가/감소 폭이 얼마나 되는지 알 수 있다. 이제 피보나치 수열의 계차방정식을 만들어보자. 

 

피보나치 수열의 규칙은 다음과 같이 정리할 수 있다. 

 

 

식 (22)와 같이 Fk+2는 이전의 두 개의 값 Fk+1과 Fk의 합으로 나타낼 수 있다. 이제 이 수식을 식 (17.1)과 같이 선형계차방정식(Linear Difference Equation)으로 만들어보자. 그런데 두 가지 문제가 있다. 일단 현재로썬 식이 (22) 하나뿐이다. 어떤 시스템이 되기 위해선 식이 두 개 이상 존재해야 하고, 해(solution)도 벡터로써 존재해야 한다. 또 하나의 문제는 식 (22)가 2차미분방정식(second-order differential equation)과 같다는 것이다(여기서 식 자체는 계차방정식으로 표현함). 식을 보면 Fk가 두 단계 이후의 Fk+2와 연결되어 있고 영향을 미치게 된다. 따라서 k가 두 번에 걸쳐 변화할 때 그 값에 대한 변화가 어떻게 이루어지는지 보기 때문에 이차미분과 같다. 식 (17.1)과 같이 1차식의 시스템으로 만들기 위해선 약간의 트릭이 필요하다. 먼저 시스템의 입력값인 uk가 필요한데, 벡터형태여야 한다. 이 문제에서 uk벡터는 어떤식으로 만들어야 할까? 

 

피보나치 수열을 정의한 식 (22)를 보면 Fk+2라는 결과값은 Fk+1 + Fk의 이전 두 개의 입력값으로 정의되어 있다. 즉 입력값은 Fk+1과 Fk가 될 것이고 이들을 uk벡터로 정의하면 될 것이다. 또한 식 (17.1)과 같이 1차 시스템이 되기 위해선 어떤 선형시스템 A에 uk를 곱했을 때 uk+1이 나와야한다. 즉 uk+1은 uk의 원소들인 Fk+1과 Fk가 각각 한 단계씩 더 나아간 상태, 즉 Fk+2와 Fk+1이 될 것이다. 이를 식으로 정리하면 아래와 같다. 

 

 

uk와 uk+1를 만들었으니 다음 단계는 시스템 행렬 A를 만드는 것이다. 우리가 현재 하고 있는 작업은 단일 방정식으로 구성된 2차 미분방정식 (22)를 1차 선형계차방정식으로 만드는 것이다. 따라서 식 (22)의 내용이 그대로 반영이 된 1차 시스템식이 나와야 한다. 그렇다면 식 (23)의 uk를 곱했을 때 uk+1이 되면서 식 (22)의 내용이 반영되기 위해선 시스템 A가 어떻게 구성되어야 할까? 아래의 식을 보자. 

 

 

식 (24.1)이 피보나치 수열의 시스템 방정식(system equation)이다. 첫 번째 줄은 식 (22)와 동일하고 두 번째 줄은 1차식으로 만들기 위한 트릭이다. (24.1)의 좌변이 결국 uk+1이 되는 것을 볼 수 있다. 우변의 식들은 미지수(unknown) uk가 어떤 시스템 행렬 A에 곱해져서 만들어지는 행렬인데, 이와 같은 식이 되기 위해서는 식 (24.2)의 A와 같은 식이 만들어지면 된다. 

 

이렇게 하여 우리는 단일 식으로 구성된 2차 미분방정식의 꼴인 피보나치 수열 문제를 1차 시스템으로 바꾸었다. 이제 다음으로 할 일은 이 1차 선형방정식을 풀기 위해 식 (20.6)과 같이 고유값과 고유벡터로 표현하는 것이다. 먼저 행렬 A의 고유값과 고유벡터를 구해보자. 

 

 

우선 식 (25.1)의 행렬 A를 보면 대각 행렬(diagonal matrix)형태인 것을 알 수 있다. Lecture 21-(2)에서 배웠듯이 대각 행렬의 고유값은 허수(imaginary number)가 아닌 실수(real number)가 나온다. 또한 trace A가 고유값들의 합과 같은 규칙을 통해 고유값들의 합이 1이 된다는 것을 알 수 있고, det A가 고유값들의 곱과 같다는 규칙을 통해 고유값들의 곱이 -1이 됨을 알 수 있다. 실제로 식 (25.2)와 같이 고유값을 계산하여 더하고 곱해보면 trace A=1, det A=-1와 각각 같음을 알 수 있다. 

 

여기서 한 가지 주목할 점은 (25.1)의 고유값에 대한 2차식이다. 이 고유값의 방정식은 피보나치 수열의 계차방정식 행렬 A를 통해 만든 것이고, 행렬 A는 피보나치 수열의 규칙을 나타내는 식 (22)에 약간의 트릭을 써서 1차식으로 만든 것이다. 결국 최초의 2차 미분 방정식 (22)로부터 만들어온 것인데, 실제로 고유값에 대한 식을 구해보니 이 최초의 식과 같은 양상을 보인다. 

 

 

결국 행렬 A의 고유값에 대한 det(A-λI)는 A의 특성방정식(characteristic equation)을 만들어내고, 이 특성방정식은 해당 행렬이 수행하는 어떤 작업에 대한 특성을 나타내는 식이 된다. 최초의 피보나치 수열에 대한 식 (22)의 형태가 행렬 A의 특성방정식으로 고스란히 드러남을 통해 이러한 사실을 알 수 있다

 

이렇게 하여 식 (25.2)와 같이 2x2행렬 A에 대한 2개의 고유값을 구했다. 첫 번재 고유값 λ1은 1보다 크고, λ2는 1보다 작다. 이와 같이 2개의 고유값이 서로 다르기 때문에 A는 2개의 독립인 고유벡터가 존재하며, 대각화(diagonalization)가 가능하다

 

 

이제 처음에 가졌던 질문을 다시 생각해보자. 피보나치 수열은 계속 증가하는 함수이다. 그렇다면 얼마나 빠르게 증가하는가? 그리고 임의의 순서의 수열의 값, 예를 들어 F100의 값은 얼마가 되는가? 첫 번째 질문에 대한 답은 고유값에 있다. 얼마나 빠르게 증가하는지, 즉 피보나치 수열의 Dynamics는 고유값(eigenvalue)에 있다. 두 번째 질문에 대한 답은 앞서 정리했던 식 (17.2)를 활용하면 된다. 식 (17.2)를 다시 고유값과 고유벡터에 대한 식 (20.3)으로 분리하면 아래의 식과 같이 정리할 수 있다. 

 

 

F100의 값은 초기값 u0에 A의 100제곱을 곱한 u100을 구하는 것과 같다. 이 식은 (27.2)와 같이 고유값과 고유벡터들의 선형 조합으로 정리할 수 있고, 실제 고유값을 넣어서 (27.3)과 같이 정리할 수 있다. 이때 두 번째 고유값인 λ2는 1보다 작은 수이기 때문에 거듭제곱을 할 수록 0으로 수렴하여 실제로 F100에 미치는 영향은 0으로 봐도 무방하다. 따라서 (27.3)의 첫 번째 term만 고려해도 된다. 결국 위의 식에서 피보나치 수열의 값의 증가를 제어하는 요소는 고유값이고, 그 중에서도 1보다 큰 첫 번째 고유값이다. 이제 식을 완성시키기 위해 고유벡터(eigenvector)를 구해보자. 

 

 

기존에 고유벡터를 구하던 방법과 같이 각 고유값을 대입하고 가우스소거를 한 다음, free variable에 1을 설정하여 고유벡터를 구할 수도 있으나, 고유값을 뺀 행렬이 특이 행렬(singular matrix)이고, 곱한 결과가 영벡터가 되야 함을 염두해 봤을 때 고유벡터는 x=[λ 1]T임을 유추할 수 있다. 이때 식 (28.2)의 row1의 식은 식 (25.1)의 특성방정식이다. 고유벡터의 식에 고유값인 λ1, λ2를 각각 대입하면 (28.3)과 같이 고유벡터를 구할 수 있다. 

 

마지막으로 구할 파라미터는 계수값 c1과 c2이다. 이 둘은 아래의 식으로부터 구할 수 있다. 

 

 

먼저 우리가 이미 알고있는 초기값 u0를 구하는 계차방정식을 세운 다음, 이를 고유값과 고유벡터에 관한 식으로 정리한다. 초기값을 구하는 계차방정식은 행렬 A가 0제곱이기 때문에 식 (29.2)와 같이 고유값도 역시 0제곱이 되어 사라지고 u0=c1x1+c2x2만 남게 된다. 이를 (29.3)과 같이 고유벡터행렬(eigenvector matrix) S와 계수 벡터(coefficient vector) c의 곱으로 나타낼 수 있다. 이제 식 (29.3)을 가우스소거법(Gauss Elimination)으로 풀면 계수벡터 c를 구할 수 있다. S행렬의 소거 과정과 c의 값을 구하는 과정은 아래 식과 같다. 

 

 

식 (30.1)에서 S의 첫 번째 pivot원소가 있는 row1에 역수를 곱해 1을 만들어 주고, row2에서 row1빼주면 (30.2)와 같이 정리가 된다. 이때 식에 루트가 있기 때문에 계산 과정에서 분모의 유리화(Rationalization)를 해준다. 소거된 식으로부터 후방대입법(back-substitution)을 통해 c1과 c2를 각각 계산할 수 있다. 

 

필요한 파라미터들인 c, xλ들을 다 구했기 때문에 식 (27.3)에 이 값들을 대입하여 피보나치 수열의 100번째 값인 F100에 대한 값을 행렬 A를 100번 제곱하지 않아도 고유값의 100제곱을 통해 계산할 수 있다. 또한 고유값을 통해 해당 시스템(피보나치 수열)이 얼마나 빠르게 증가하는지를 파악할 수 있다.  

 

 

5. 마치며

 

이번 강좌에선 행렬의 대각화(diagonalization)에 대해 공부하였다. 대각화의 핵심엔 고유값(eigenvalue)과 고유벡터(eigenvector)가 있으며, 어떤 행렬을 고유값행렬(eigenvalue matrix)과 고유벡터행렬(eigenvalue matrix)로 분해하여 표현하는 방법이다. 대각화를 통해 어떤 반복적인 행렬곱셈(Matrix multiplication)을 해야 하는 문제를 훨씬 적은 계산량으로 효과적으로 풀 수 있으며, 이를 활용해 계차방정식(difference equation)의 형태로 정리한 피보나치 수열 문제를 해결하였다. 중요한것은 대각화를 통해 고유값/고유벡터로 분해하여 문제를 해결한다면 그 시스템 A에 대한 Dynamics를 파악할 수 있다는 것이다. 행렬 A의 거듭제곱(power)이 지속될 수록 얼마만큼 빠르게, 혹은 느리게 값이 증가 혹은 감소하는지에 대해서 분석할 수 있다. 

또한 행렬의 대각화는 다음 포스팅에서 다룰 미분방정식(differential equation)을 푸는 중요한 방법이 되므로 잘 공부하도록 하자. 

 



서점에 갔다가 베스트셀러 코너에서 눈에 띄어 구입한 책이다. 제목만 봤을 때 뭔가 심리학적 방어기제를 독자들에게 주문할것만 같은 느낌이었다. 일부 그런 부분이 아주 없진 않으나, 막상 내용은 정신과 전문의로써 다양한 상담 사례를 통해 환자들의 심리 분석과 그들이 겪고 있는 문제의 원인들을 심리학적 지식으로 풀어서 설명하는 내용이었다. 이와 같은 실제 사례와 분석 내용을 기반으로 독자로 하여금 자기 자신을 돌아보고 성찰하고 대인관계에 있어서 상처받지않는 방법을 가르쳐주는 내용이었다. 


필자가 책을 읽고 판단한 대인관계에서 상처받지않고 건강한 관계를 만드는 방법은 요약하자면 두 가지다. 나 자신에 대해서 인정할 것. 그리고 적당한 거리를 둘 것


책 내용중에 다음과 같은 구절이 나온다. "인간은 누구나 지독한 나르시시즘적 존재다". 그렇다. 필자를 비롯한 모든 대부분의 인간은 아마 정도의 차이는 있겠지만, 어느 정도 자기중심적 사고방식을 가지고 있다. 상대방과의 언쟁이 발생하면 어느 순간 객관적 판단능력은 상실한 채 오로지 자신의 주장이 옳다고 밑도록 만들고싶은 생각이 머릿속을 지배할 때가 있고, 후배만 보면 제 앞가림은 제대로 하지도 못하면서 이런 저런 조언 따위를 늘어놓고 혼자 뿌듯해하는 선배들, 나는 분명 상대방에게 잘 해줬다고 생각하지만 나의 기대에 부흥하지 못한 상대방에게 섭섭함, 분노 따위의 감정을 느끼는 일들, 성인이 되어 사회생활을 해본 사람이라면 누구나 한 번쯤 겪었본적이 있을것이다. 그러다 누군가가 자신에게 반기라도 들면 그날부로 적이 되어버리는 경우도 적지 않다. 나는 항상 상대방보다 합리적이고 객관적인 사람이라고 판단하기 때문이다. 


그러나 결코 자신을 객관적으로 판단하는 것은 쉽지 않다. 우리는 그런 존재이기 때문이다. 그리고 그 이면에는 누군가로부터 인정을 받고 싶고, 소중한 존재로 인식되기를 바라는 욕구가 존재한다. 그러나 쉽게 간과할 수 있는 점은 누군가로부터 인정받기를 원한다면 먼저 상대방을 존중하고 인정해야 한다는 점이다. 즉 내가 맞는 것 같지만 틀릴 수 있고, 상대방이 틀린 것 같지만 맞을 수 있음을 인정하는 것이다. 물론 이것만으로는 안되고 그 이전에 기본적인 실력과 인성은 필수이다. 실력 없이 그저 남을 인정한다고 해서 인정받지는 않는 것 같다. 참 어려운 일이다. 



또 한 가지는 적당한 거리 두기. 이게 참 어려운 일이다. 얼마나 거리를 둬야 "적당한"걸까? 그런데 이 적당한 거리 두기가 참 다양하게 해석될 수 있는 말인 것 같다. 책에는 거절을 잘 하지 못해 어려움을 겪는 사람의 사례가 나온다. 이 사람은 결국 상대방과의 적당한 거리 두기에 실패하여 어려움을 겪고 있는 것이다. 이 사람의 심리적 이면에는 남에게 인정받고 싶어하는 욕구가 있을 것이다. 그러한 욕구가 무리한 부탁도 거절하지 못하고 계속해서 들어줄 수밖에 없고, 결국 본인을 괴롭게한다. 참 무서운 욕구인 것 같다. 한 가지 방법은 상대방에게 자신의 주장을 부드럽지만 단호하게, 그리고 간결하고 명료하게 하는 것이다. 처음에야 힘들겠지만, 이렇게 거리를 두는 것이 상대방으로부터 상처를 받지않고 건강한 관계를 이어나가는 방법일 것이다. 



나 자신에 대한 객관적 판단능력을 가지고, 상대방과의 적당한 거리를 두는 것은 결코 쉬운 일이 아니다. 운동을 잘하기 위해서 훈련이 필요하듯 건강한 까칠함을 얻기 위해서도 역시 훈련이 필요하다. 필자는 요즘 남몰래 혼자서 하는 훈련이 있다. 바로 말을 아끼기. 특히나 상대방에 대한 비판을 하고싶을 때 말을 아끼는 훈련을 하고있다. 당신의 의견은 완전히 틀렸어! 그건 말도 안돼! 대체 무슨 소리를 하는 거야? 라는 말을 하고싶을 때마다 그에 대해선 침묵으로써 반대 의견을 대신하는 것이다. 이와 관련해서는 지난번에 읽었던 데일카네기의 인간관계론과도 연결되는 부분이 굉장히 많다. 이렇게 직접적인 비난을 하지 않는 것만으로도 예전에 비해 상대방과의 관계가 훨씬 건강해지는 느낌이다. 물론 무조건적인 침묵은 오히려 독이 될 수 있기에 적당한 피드백과 부드럽지만 단호하고 간단명료한 나의 주장도 반드시 필요하다. 그럼에도 불구하고 비난을 참을 수 없게 만드는 사람은 반드시 있게 마련이지만, 이런 사람들은 최대한 피하는 것이 정신건강에 좋은 것 같다. 


지난 강의 Lecture 21-(1)에 이어 고유값(eigenvalue)과 고유벡터(eigenvector)에 대한 두 번째 강의다. 이번 포스팅에서는 고유값과 고유벡터에 대한 실제 계산법과 유용한 공식, 그리고 여러 가지 행렬들에 대한 고유값/고유벡터에 대해 알아보도록 하겠다. 지난 첫 번째 강의에서 주로 개념 위주의 설명을 했기 때문에 앞 강의를 먼저 공부하고 오는 것을 추천한다. 

 

 

3. 고유값(Eigenvalue)과 고유 벡터(Eigenvector)의 계산 방법

 

- How to get eigenvalues/eigenvectors?

 

앞선 포스팅을 통해 우리는 고유값과 고유벡터에 대한 전반적인 개념을 파악하였다. 어떤 선형시스템 A에 의해 변환 되는 수많은 벡터들 중, 변환 전과 변환 후가 평행한(parallel), 다른 말로 표현하면 변환 전/후의 벡터가 동일한 부분공간(subspace)에 존재하는 벡터들을 고유벡터(eigenvector)라고 한다. 그리고 그 변하는 정도를 나타내는 scale값을 고유값(eigenvalue)이라 한다. 지난 포스팅에서 다뤘던 것들 중에 이 고유값과 고유벡터를 이해하는데에 가장 중요한 식이 바로 식 (2)이다. 이를 다시 한 번 써보자. 

 

 

어느 정도 개념 파악을 했으니 이제 실제로 고유값과 고유벡터를 어떻게 계산하는지를 식 (2)로부터 유도하여 알아보자. 우선 식 (2)의 우변의 λx를 좌변으로 이항하면 아래 식과 같이 된다. 

 

 

※ (식 번호가 11부터 시작하는 이유는 지난 강의와 연결되는 강의이기 때문)

식 (2)의 우변을 좌변으로 이항하여 (11.2)와 같이 만들었다. 그런데 식 (11.1)까지는 이해가 가지만, x텀을 묶어서 식을 다시 쓰는 과정에서 원래 없던 단위행렬(Identity matrix) I가 붙었다. 이게 붙는게 맞는 것일까? 람다(lambda)가 단위행렬과 곱해지게 되면 대각 원소에만 람다 값이 곱해지게 되고 결국 A의 대각 원소들의 값에서 람다 만큼 뺀 것과 같다. 이것이 식 (11.1)과 같은 결과를 보이는지 알아보자. A를 2x2로 가정하고 식을 풀어서 쓰면 아래와 같다. 

 

 

식 (11.1)을 풀어서 정리했더니 식 (12)의 맨 아래와 같은 결과가 나왔다. 이번엔 식 (11.2)를 풀어서 써보자. 

 

 

식을 풀어서 다시 정리한 결과, (12)와 (13)이 같음을 알 수 있다. 따라서 식 (11.2)에서 x를 중심으로 묶어줄 때 반드시 단위행렬을 람다(lambda)에 곱해줘야 한다

 

람다에 단위행렬을 곱해줘야 한다는 사실을 알았으니 다시 식 (11.2)를 보도록 하자. 이 식을 다시 이해해보면 일단 괄호 안의 식은 원래의 행렬 A의 대각 원소들을 람다(lambda)만큼 이동(shift)시킨 행렬이다. 이 대각 원소들을 shift시킨 행렬에 벡터 x를 곱하면 그 결과가 영벡터(zero vector)가 된다. 이는 Ax=0의 꼴이며, null space에 대한 해를 찾는 과정이다.(이때 단순히 x가 영벡터인 것은 제외하고 생각하자) 이 말은 무엇을 의미할까? 

 

Ax=0를 만족시키는 해를 찾는 다는 것은 행렬 A의 null space를 찾는 것인데, 이때 행렬 A의 null space가 존재하기 위해선 행렬 A가 반드시 특이행렬(singular matrix)이어야 한다. 결국 식 (11.2)의 좌변의 괄호 안 식, 즉 A의 대각 원소들을 람다만큼 쉬프트 시킨 행렬은 특이 행렬이 되어야만 한다는 의미다. 만약 식 (11.2)의 괄호 안의 식이 특이행렬이 아니라면, 이 식을 만족시키는 유일한 해(solution) x는 오직 영벡터(zero vector)만이 존재한다. 따라서 이 식은 특이 행렬이 되어야한다. 

 

식 (11.2)의 괄호안의 식이 특이행렬이 되어야 한다는 것은 알았다. 그런데 특이 행렬 하면 떠오르는 특성이 있을것이다. 바로 특이행렬(singular matrix)의 행렬식(determinant)은 0이라는 것이다. 이 특성을 이용해서 고유값 문제를 해결할 수 있다. 식으로 써보면 아래와 같다. 

 

 

식 (14)는 식 (11.2)의 괄호 안의 식에 대한 determinant를 나타낸 것이다. 그런데 가만히 보면 x가 없고 람다만이 남았다. 즉 원래 식 (11.2)에서는 미지수가 x와 람다(lambda) 두 개였는데, determinant에 관한 식으로 정리하면서 미지수가 람다 한 개만 남게된 것이다. 결국 이 determinant의 식으로 정리하는 아이디어는 두 개의 미지수 x와 람다중, 고유값(eigenvalue)인 람다(lambda)를 먼저 찾겠다는 아이디어이다. 이때 찾을 람다(lambda)값은 한 개가 아니라 n개의 람다(고유값)이다. n개의 람다가 전부 다른 값을 가질 수도 있지만, 동일한 값을 가질 수도 있다. 만약 람다가 동일한 값을 가진다면 문제가 발생할 수도 있다. 고유값이 동일한경우 왜 문제가 발생하는지 이 포스팅 마지막 부분에서 언급하도록 하겠다. 

 

고유값(eigenvalue)인 람다를 구한 다음엔 고유벡터(eigenvector)를 구해야 한다. 일단 고유값을 찾으면 고유벡터 구하기는 그리 어렵지 않다. 고유벡터 x를 찾는 것은 우리가 지금까지 많이 해왔던 null space를 찾는 것이기 때문이다. 먼저 구한 고유값을 식 (13)에 차례로 대입한 뒤, 가우스소거(Gauss Elimination)를 통해 pivot을 찾고 free variable을 찾은 다음, free variable에 값을 설정하여 null space를 찾으면 된다. null space를 구하는 방법은 Lecture 7을 참고하기 바란다. 

 

 

eigenvalues/eigenvectors calculation method 

 

지난번 포스팅에서 예로 들었던 식 (3)의 선형시스템 A의 고유값(eigenvalue)과 고유벡터(eigenvector)를 실제로 계산해보자. 우선 A에 대한 고유값/고유벡터 식을 다시 써보면 다음과 같다. 

 

 

식 (11.1)과 (11.2)와 같이 우변을 좌변으로 이항시키고 x로 묶어주면 아래와 같은 식이 된다. 

 

 

식 (16.3)이 (A-λI)x=0을 의미한다. 이제 식 (14)와 같이 괄호 안의 식에 대한 determinant식을 세워보자. 

 

 

determinant의 계산 방법은 Lecture 19를 참고하기 바란다. determinant를 계산하면 (17.2)를 거쳐 식 (17.3)과 같이 식이 만들어진다. (17.3)을 보면 중학교때 배웠던 이차식의 인수분해 방법으로는 풀기가 어렵다. 근의 공식(quadratic formula)을 이용하여 해를 구해보자. 

 

 

식 (18)은 근의 공식을 이용하여 식 (17.3)의 람다(lambda)에 대한 이차방정식의 해를 구한것이다. 이전 포스팅의 고유값과 같음을 알 수 있다. 이렇게 하여 고유값(eigenvalue)은 어렵지 않게 구하였다. 이제 고유 벡터(eigenvector)를 구할 차례이다. 

 

고유벡터를 구하기 위해선 먼저 구한 고유값을 식에 대입하여 미지수를 한 개로 만들어야 한다. 식 (16.3)에 첫 번째 고유값인 람다1을 대입해보자. 

 

 

식이 조금 복잡해졌지만 (19)와 같이 고유값을 대입한 Ax=0꼴의 식을 만들었다. 이제 이 식을 만족시키는 고유벡터를 구해보자. 다시 한 번 말하지만 대각 원소들에서 람다 값을 빼준 형태인  (19)의 행렬 A는 특이행렬(singular matrix)이다. 따라서 null space가 존재하고, null space가 곧 고유벡터가 된다. null space를 구하기 위해 차례로 가우스소거(Gauss Elimination)를 해보도록 하자. 

 

 

먼저 식 (19)의 A의 a11의 원소를 pivot으로 설정하고, row2를 제거해주기 위해서는 pivot원소를 1로 만들어서 row2에서 row1을 빼줘야 한다. row1에 a11의 역수를 곱해서 pivot을 1로 만든 뒤, row2에서 빼주면 아래와 같은 결과가 나온다. 

 

 

결과적으로 람다1에 대한 고유벡터는 식 (20)과 같다. 가우스소거를 한 다음, free variable에 임의의 값을 대입하여 해를 구했으며 임의의 값은 간단히 1을 대입하였고, 이때 이 식을 만족시키는 벡터 x는 식 (20)의 맨 마지막과 같다. 지난 포스팅에서 그래프로 표현했던 고유벡터와 같은 결과임을 볼 수 있다. 

 

마찬가지로 람다2에 대한 고유벡터를 계산하면 아래와 같은 결과가 나온다. 동일한 절차이기 때문에 자세한 계산 과정은 생략하겠다. 

 

 

 

이렇게하여 식 (3)에 대한 고유값과 고유벡터를 구하는 법을 배웠다. 앞서 언급했듯이 고유값(eigenvalue)은 유일하지만, 고유벡터(eigenvector)는 무수히 많은 수가 존재할 수 있기 때문에 고유공간(eigenspace)라는 공간이 존재한다고 배웠다. 이는 고유벡터를 계산할 때 free variable에 어떤 값을 넣고 푸는지에 따라 달라진다. 실제로 MATLAB과 같은 프로그램을 통해 계산한 고유벡터의 값은 조금씩 달라질 수 있는데, 이는 free variable에 대한 설정 기준이 다르기 때문이다. 비록 고유벡터의 결과가 달라질 수는 있으나, 동일한 eigenspace상에 존재하기 때문에 어떤 것이 더 옳다고 볼 수는 없다. 

 

이번 포스팅에서 배운 고유값/고유벡터의 계산 방법은 2x2행렬을 기준으로 하였다. 그러나 3x3, 4x4, nxn의 고유값/고유벡터 역시 계산방법은 동일한 절차에 의해 진행된다. 다만 처음에 고유값을 구할 때 determinant를 계산하는 과정이 복잡할 수는 있다. 그러나 지난 포스팅(Lecture 19)에서 배운 여인수(cofactor)를 통한 nxn 행렬의 determinant를 계산하고, 람다에 대한 n차방정식을 풀면 된다. 그리고 마찬가지로 가우스소거를 통해 소거된 행렬을 만들고, pivot을 제외한 free variable에 1과 같은 간단한 숫자를 대입하여 해당 행렬의 null space를 계산하면 된다. 3x3이상의 행렬에 대한 행렬식 계산방법은 인터넷에 많이 존재하고 푸는 개념은 2x2와 동일하기 때문에 여기서 따로 다루지는 않겠다. 3x3행렬의 determinant계산 방법만 잘 숙지하고 있으면 어렵지 않게 구할 수 있다. 

 

사실 다른 것들도 마찬가지 겠지만, 고유값이나 고유벡터는 어떤 개념인지를 아는 것이 중요하지 푸는 방법은 그렇게 중요하지 않을 수 있다. 실전에서 계산은 컴퓨터가 다 하기 때문이다. 그래도 어떤 개념과 철학에 의해 고유값과 고유벡터가 계산되는지는 알아둘 필요가 있다

 

 

 

4. 여러 가지 행렬의 고유값(Eigenvalue)과 고유 벡터(Eigenvector)

 

- permutation matrix

 

일반적인 행렬 외에 몇 가지 특수한 형태의 행렬에 대한 고유값과 고유벡터에 대해 알아보자. 먼저 다음의 치환행렬(permutation matrix)에 대해 알아보자. 

 

 

치환행렬의 역할은 무엇일까? 지난 포스팅(Lecture 5)을 통해 치환행렬이 어떤 행렬의 앞에 곱해지면, 행 교환(row exchange)이 일어난다는 것을 배웠다. 마찬가지로 임의의 벡터를 곱했을 때 벡터의 각 컴포넌트들의 위치를 변화시킨다. 식 (22)의 행렬 A의 경우, 어떤 벡터 x를 A를 통해 선형변환(Linear transformation)을 시켜주면 x1 컴포넌트와 x2 컴포넌트가 뒤바뀐다. 예를 들어 x=[-2 3]T를 A에 곱해주면 아래와 같이 변환된다. 

 

 

그렇다면 이 치환행렬이 공간상에서 갖는 의미는 무엇일까? 아래 그림을 보자. 

 

 

Fig. 9 치환행렬의 변환 예시

 

 

Fig. 9는 식 (22)의 치환행렬의 벡터의 변환 예시를 보여주고 있다. 빨간색과 파란색 실선 화살표가 변환 이전의 벡터들이고, 점선으로 표현된 화살표가 변환된 벡터들을 나타낸다. 변환 전과 후를 살펴보면 대각선인 y=x의 직선을 기준으로 마치 데칼코마니(decalcomanie)를 하는 것과 같이 벡터들을 변환 시킨다. 

 

그렇다면 식 (22)의 행렬 A의 고유값과 고유벡터는 어떤 것들일까? 사실 앞서 배웠던 계산 방법들을 통해 계산을 하지 않아도 Fig. 9를 보면 유추할 수 있다. 일단 먼저 보이는 고유벡터는 y=x선상에 존재하는 벡터, 즉 x=[1 1]T이다. 여기에 대응되는 고유값은 당연히 λ=1일 것이다. 이 대각선에 존재하는 모든 벡터들은 A의 고유벡터일텐데, 변환 후에도 벡터의 크기나 혹은 반대방향으로 변환시키지는 않기 때문이다. 

 

식 (22)의 A는 2x2크기이고, 따라서 고유값과 고유벡터를 각각 두 개씩 가진다. 나머지 고유값과 고유벡터는 어떤 것일까? 힌트는 Fig. 9의 빨간색 벡터 x1이다. 변환 전과 변환 후를 보면 방향이 반대 방향이긴 하지만 방향을 약간만 틀면 같은 Line선상에 존재할 것이다. 결국 y=x의 직선과 직교(orthogonal)하는 Line에 존재하는 벡터들이 A의 두 번째 고유벡터가 되고, 이 Line상에 존재하는 벡터들은 변환 후에 크기는 그대로이지만, 방향이 반대 방향으로 변하기 때문에 고유값은 λ=-1이 될 것이다. 이제 앞서 배웠던 계산방법을 통해 실제 고유값과 고유벡터를 계산해보자. 

 

 

 

식 (24)를 통해 고유값 λ1=1, λ2=-1을 구했다. 이제 각 고유값에 해당하는 고유벡터를 구해보자. 

 

 

 

계산 결과 우리가 예상했던 것과 일치하는 것을 알 수 있다. 사실 2x2 치환행렬은 간단해서 이런 계산 과정을 거치지 않아도 쉽게 유추할 수 있다. 그러나 계산 방법을 한 번더 상기시키고자 자세한 풀이를 시도하였다. 

 

어쨋든 이 치환행렬의 고유값과 고유벡터를 그래프로 다시 표현해보면 아래 그림과 같다. 

 

 

 

Fig. 10 치환행렬의 고유값과 고유벡터의 그래프 표현

 

 

Fig. 10의 청록색(cyan) 벡터가 λ1=1일때의 고유벡터(eigenvector), 녹색 벡터가 λ2=-1일때의 고유벡터이다. λ1=1의 고유벡터는 변환 전과 후가 완전히 같다. 따라서 변환 후의 고유벡터를 같은 색깔의 점선으로 표현했지만 겹쳐서 보이지 않는다. λ2=-1의 고유벡터의 경우엔 변환 전과 후가 동일한 1차원 공간(eigenspace)에 존재하지만, 그 방향이 고유값에 의해 반대방향으로 변한다. Fig. 10의 녹색 점선 화살표는 녹색 실선 화살표를 A를 통해 변환 시킨 결과, 혹은 고유값을 곱해서 변환시킨 결과를 나타낸다. 결과적으로 식 (22)의 치환행렬(permutation matrix)의 고유벡터들이 존재하는 2개의 부분 공간인 eigenspace는 y=x와 y=-x의 직선이고, 이 둘은 서로 직교(orthogonal)한다. 이 둘이 직교하는지 확인하기 위해선 간단히 내적(dot product)을 해서 0이 되는지를 확인하면 알 수 있다. 

 

 

- some rules of eigenvalues

 

여기서 고유값(eigenvalue)에 대한 한 가지 흥미로운 규칙을 알아보자. 식 (25)를 통해 구한 행렬 A의 고유값은 각각 λ1=1과 λ2=-1이다. 이 두 고유값을 더하면 그 결과는 0이 된다. 그런데 놀랍게도 고유값들의 합은 식 (22)의 행렬 A의 대각 원소(diagonal elements)들의 합, 즉 trace와 같다. A의 대각 원소들은 전부 0이고, 이들을 모두 더하면 결과는 동일하게 0이 된다. 

 

 

식 (26)의 규칙을 알고있다면 식 (22)의 행렬 A에 대한 고유값을 구할 때, 첫 번째 고유값만 구해도 나머지는 바로 알 수 있다. 이는 임의의 크기의 nxn행렬에 대해서도 동일하게 적용된다. 

 

또 하나의 규칙은 임의의 nxn 행렬 A의 행렬식(determinant)이 바로 고유값들의 곱(product of eigenvalues)과 같다는 것이다. 

 

 

앞서 구한 식 (22)의 행렬 A의 고유값들에 대해서 이 규칙들이 맞는지 검증해보도록 하자. 

 

 

식 (28)을 통해 A의 trace와 고유값들의 합이 같은 것과, A의 determinant와 고유값들의 곱이 같음을 확인하였다. 이 두 가지 규칙을 알아두면 고유값을 계산하거나 검증할 때 유용하게 사용할 수 있으니 잘 기억하도록 하자. 

 

 

- symmetric matrix

 

다음으로 알아볼 행렬은 대칭행렬(Symmetric matrix)이다. 아래의 행렬을 보자. 

 

 

식 (29)은 대각 원소를 기준으로 상삼각원소들과 하삼각원소들이 같은 대칭행렬이다. 우선 이 행렬은 공간상에서 어떤 변환을 일으키는지 아래 그림을 통해 확인해보자. 

 

 

Fig. 11 식 (27)의 대칭행렬의 변환 그래프

 

 

Fig. 11은 식 (29)의 행렬 A의 변환 모습을 나타낸 것이다. 파란색 벡터는 원래의 벡터 x를, 빨간색 점선 벡터는 A에 의해 변환된 Ax를 나타낸다. 그림에서 보다시피 A는 원래의 벡터를 원점을 중심으로 양쪽 대각선 방향으로 잡고 늘리는 변환을 수행한다. 각각의 빨간색 점선 벡터의 끝에는 어떤 벡터 x로부터 변환되었는지가 표시되어 있다. 이제 식 (29)의 행렬 A의 고유값과 고유벡터를 구해보자. 벌써 눈치 채신 분들도 있겠지만 Fig. 11을 보면 A의 고유값과 고유벡터, 그리고 고유공간(eigenspace)이 무엇인지 파악할 수 있다. 어쨋든 계산해보자. 

 

 

식 (30)은 식 (29)의 행렬 A의 고유값(eigenvalue) 계산과정을 나타낸다. 고유벡터(eigenvector)를 구하기 전에 여기서 한 가지 재미있는 규칙을 알아보자. 식 (30.4)는 (A-λI)의 determinant를 계산하여 얻은 람다에 대한 이차방정식이다. 여기서 재밌는 규칙은 식 (30.4)의 1차항의 계수 6은 원래의 행렬 A의 trace와 같고, 상수항인 8은 원래의 행렬 A의 determinant와 같다. 원래 행렬 A의 trace는 3+3=6이고, determinant는 ad-bc=3x3-1x1=9-1=8인데, 식 (30.4)의 1차항 계수, 상수항 계수와 같음을 볼 수 있다. 결과적으로 2x2의 고유값에 대한 이차방정식의 계수는 원래 행렬 A와 아래와 같은 관계를 가진다. 

 

 

 

식 (31)는 아주 중요한 것은 아니고 고유값의 방정식과 행렬 A와 이러한 관계가 있다 정도만 알아둬도 좋을 것 같다. 이제 고유벡터를 계산해보자. 계산 결과는 아래 식과 같다. 

 

 

결과적으로 식 (29)의 대칭행렬에 대한 고유벡터(eigenvector)는 식 (32)의 두 벡터 x=[1 1]T와 x=[-1 1]T과 같으며, 이 두 고유벡터는 Line의 형태로 표현되는 고유벡터들의 1차원 부분 공간(subspace)인 eigenspace의 기저(basis)가 된다. 이때의 고유공간(eigenspace)은 y=x와 y=-x의 두 Line이 된다. 

 

 

- Relationship between diagonal components of a matrix and eigenvalues

 

우리는 앞서 대칭행렬(symmetric matrix)에 대한 고유값을 먼저 구하고, 이를 이용하여 고유벡터(eigenvector)를 계산하였다. 그런데 막상 고유 벡터를 구하고보니 어디서 많이 봤던 고유벡터이다. 바로 앞서 계산했던 치환행렬(permutation matrix)의 고유 벡터와 같음을 알 수 있다. 그렇다면 이 두 행렬, 식 (22)의 치환행렬과 식 (29)의 대칭행렬은 어떤 관련이 있는 것일까? 일단 두 행렬과 고유값/고유벡터를 다시 써보자. 

 

 

식 (33.1)은 치환행렬(permutation matrix)과 그의 고유값, 고유벡터를, 식 (33.2)는 대칭행렬(symmetric matrix)과 그의 고유값, 고유벡터를 각각 나타낸다. 고유값은 다르지만 고유벡터는 같다. 이 두 행렬은 어떤 관계가 있을까? 그것은 바로 대칭행렬은 기존의 치환행렬에 3I(3 x Identity matrix)를 더한 것과 같다. 즉 치환행렬의 대각 원소들에 3씩 각각 더한 것이 식 (33.2)의 대칭행렬이다. 

 

기존의 행렬의 대각원소들에 어떤 동일한 특정 값을 더한 것은 고유값/고유벡터에 어떠한 영향을 줄까? 보다시피 고유벡터에는 영향을 주지 않는다. 그러나 고유값에는 바로 이 더한 만큼의 차이가 난다. 즉 치환행렬의 대각 원소에 3을 더했다면, 고유값에도 3을 더한 것과 같다는 것이다. 치환행렬의 첫 번째 고유값인 λ1=1에 3을 더하면 대각행렬의 첫 번째 고유값인 λ1=4와 같아진다. 마찬가지로 치환행렬의 두 번째 고유값 λ2=-1에 3을 더하면 대칭행렬의 두 번째 고유값 λ2=2와 같아진다. 정리하자면 다음과 같다. 

 

 

만약 Axx를 만족하는 고유값과 고유벡터가 존재한다고 했을 때, 양변에 같은 값을 더해줘도 그 식은 성립한다. 이때 좌변의 행렬에 더해지는 3x는 식 (13)과 같이 단위행렬의 곱이 포함되고, 결과적으로 행렬 A의 대각 원소들에게만 영향을 미치게된다. 따라서 어떤 행렬의 대각원소에 어떤 값을 더하거나 빼주게 되면, 그 값만큼 고유값에 영향을 미치게되고, 고유벡터에는 영향을 주지 않는다. 고유값과 고유벡터는 행렬의 중요한 정보들을 포함하고 있기 때문에 만약 행렬에 어떤 변화를 가했을 때, 그에 따른 고유값과 고유벡터에 어떠한 영향을 주는지를 잘 알아둘 필요가 있다. 

 

 

- Caution in eigenvalues/eigenvectors

 

이번에 알아볼 내용은 행렬들의 고유값을 다룰 때 유의해야할 점이다. 어떤 정방행렬 A와 B가 있고, 각 행렬에 대한 고유값을 알고 있다고 가정해보자. 이때의 고유값들을 람다(lambda)와 알파(alpha)라 하자. 

 

 

여기서 알아보고 싶은 것은 식 (35)과 같이 A와 B의 고유값과 고유벡터가 각각 존재한다고 했을 때, A+B는 람다+알파와 같을 수 있을까?이다. 즉 Ax+Byx+αy은 성립하는 식인가? 결론부터 말하자면 성립하지 않는다. A와 B는 완전히 다른 행렬이기 때문에 고유값과 고유벡터가 완전히 다를 것이다. 즉 B가 A와 다른 행렬인 경우 고유벡터 자체가 바뀌어버리게 된다. A의 고유벡터가 x라면, B는 y라는 전혀 다른 고유벡터를 갖게 된다. 결국 어떤 행렬 A와 B를 더했을 때, 고유값과 고유벡터가 달라지기 때문에 선형성(Linearity)을 만족하지 않는다. 

 

마찬가지로 행렬 A와 B의 곱셉인 AB도 이 선형성을 만족하지는 않는다. 다만 여기서 B가 단위행렬(Identity matrix)이라면 이야기는 달라진다. B가 만약 단위행렬이라면, 식 (34)와 같은 경우이기 때문에 식이 성립하게 된다. 결론적으로 고유값/고유벡터에 있어서 행렬끼리의 덧셈, 곱셈은 선형성(Linearity)를 만족하지 않는다

 

 

 

- Rotation matrix

 

다음으로 살펴볼 행렬은 회전 행렬(Rotation matrix)이다. 이번 소단원에서 고유값과 고유벡터에 대한 흥미로운 내용이 많이 나오므로 집중해서 보도록하자. 우선 아래의 회전 행렬을 살펴보자. 

 

 

식 (37.1)은 우리에게 익숙한 2차원 평면의 회전 행렬(Rotation matrix) R이다. 여기서 문제를 쉽게 만들기 위해 회전각도(theta)를 +90도(deg)로 가정한다면, 실제 행렬의 값은 식 (37.2)과 같이 될 것이다. 이때 기존의 문자 R을 사용하지 않고 Q를 사용한 것은 회전 행렬이 기본적으로 Lecture 17-(1)에서 배웠던 직교 행렬(orthogonal matrix)의 대표적인 예이기 때문이다. 직교 행렬을 알파벳으로 표기할 때 Q로 나타내었으며, 회전 행렬이 곧 직교 행렬임을 강조하기 위해 Q로 표현했다는 것을 알아두자. 

 

이제 식 (37.2)의 90도를 회전시키는 회전 행렬의 고유값(eigenvalue)과 고유벡터(eigenvector)에 대해 알아보자. 계산부터 하기 전에, 고유값에 대한 규칙인 식 (26)과 (27)을 적용해보자. 

 

 

고유값 규칙을 적용한 결과, 식 (38.1)을 통해 λ1+λ2=0임을 알았고, 두 고유값을 더해서 0이 되려면 λ1과 λ2가 부호가 반대이면서 같은 값을 갖겠구나! 하고 예상할 수 있다. 그런데 그 아래의 식 (38.2)를 보니 이번엔 λ1*λ2=1이라고 한다. 곱해서 1이 되려면 λ1과 λ2가 모두 +부호를 갖거나, 모두 -부호를 가져야한다. 뭔가 앞뒤가 맞지 않는다. 고유값 규칙이 애초에 틀린걸까? 고유값에 뭔가 문제가 있다는 것은 알았고, 회전 행렬의 고유벡터에 대해서도 생각해보자. 

 

 

우선 고유벡터(eigenvector)에 대한 정의를 다시 생각해보자. 어떤 행렬 A의 고유벡터는 A를 통해 변환을 시켜도 그 방향성이 변환 이전의 자기 자신과 같거나 평행(parallel)한 벡터여야 한다. 그런데 회전 행렬의 경우, 어떤 벡터를 무조건 정해진 각도 theta만큼 회전시키는데, 상식적으로 생각해보면 회전된 이후에도 원래 자기자신과 같거나 평행한 벡터가 존재할 수 있을까? 싶다. 결론부터 말하자면 회전 행렬(rotation matrix)에서 회전 각도가 0도와 180도인 경우에는 고유벡터가 존재한다. 그러나 이 부분은 잠시 후에 다루도록 하고, 0도와 180도를 제외한 나머지 각도에 대한 회전 행렬의 고유벡터가 존재하는지에 대한 의구심이 드는 것은 상식적으로 그럴만한 일이다. 

 

0도와 180도를 제외한 회전 행렬의 고유값과 고유벡터에 문제가 있음을 인지했다. 그렇다면 이들은 정말 고유값과 고유벡터를 정의할 수 없는 걸까? 당연히 정의할 수 있다. 우선 원래의 방식대로 회전 행렬의 고유값을 계산해보자. 

 

 

식 (39)는 기존의 방식대로 고유값을 구하는 과정을 보여준다. 회전 행렬(rotation matrix)의 고유값은 식 (39)의 2차 방정식을 만족시키는 람다인데, 제곱해서 -1이 되려면 답은 복소수(complex number)밖에 없다. 결국 회전 행렬의 고유값은 복소수의 형태를 띄며, 1i와 허수부(Imaginary part)의 부호가 반대인 켤레복소수(complex conjugate number) -1i이다. 식 (39)에서 구한 고유값으로 식 (38)의 조건을 다시 계산해보면 trace Q의 경우 i-i=0, det Q의 경우 i(-i)=-(-1)=1로 규칙을 만족하는 것을 확인할 수 있다. 

 

그런데 생각해보면 약간 신기한 면도 있다. 분명 식 (37.2)의 원래의 행렬의 원소들은 모두 실수(real number)인데, 어떻게 고유값이 허수가 나올 수 있을까? 앞서 언급했듯이 고유값과 고유벡터는 행렬의 많은 정보들을 담고 있다고 했다. 어떤 행렬의 고유값이 허수가 나왔다는 사실로부터 우리는 이 행렬이 어떤 특성을 가지고 있는지를 파악할 수 있다. 

 

다시 식 (37.2)의 행렬 Q를 보면 뭔가 익숙한 형태라는 느낌이 들 것이다. 바로 앞서 공부했던 식 (22)의 치환 행렬(permutation matrix)과 거의 유사한 형태인 것을 알 수 있다. 다만 a12의 원소의 부호가 -인 것만 빼면 말이다. 즉 a12와 대칭 관계인 a21의 원소는 +1인데, a12는 완전 반대 부호인 -1이다. 이것은 무엇을 의미할까? 치환 행렬이 대칭 행렬(symmetric matrix)의 형태인 것과는 달리, 90도의 회전 행렬(rotation matrix)은 대칭과는 거리가 멀다. 즉 식 (37.2)의 Q는 비대칭행렬(anti-symmetric matrix)이다. 여기서 알 수 있는 것은 대칭행렬(symmetric matrix)에 가까울 수록 고유값은 실수의 형태로 나오고, 비대칭행렬(anti-symmetric matrix)에 가까울 수록 복소수 형태의 고유값이 나온다는 것이다. 결국 고유값이 실수냐, 허수냐에 따라 원래의 행렬이 대칭이냐 비대칭이냐를 판단할 수 있다. 참고로 비대칭행렬은 아래와 같이 전치(transpose)시킨 것이 -부호를 취한 것과 같다

 

 

 

다시 계산 문제로 넘어가서, 앞서 구한 고유값을 이용하여 이제 회전 행렬의 고유벡터를 구해보자. 

 

 

 

행렬 계산에 복소수가 등장하다보니 계산식이 약간 복잡해보인다. 그러나 계산 과정이 번거로울 뿐이지 복잡할건 없다. 실수(real number)와 허수(imaginary number)를 구분하여 원래 방식대로 잘 계산하면 된다. 단지 연산이 복소수에 대한 사칙 연산일 뿐이다. 복소수의 사칙 연산과 관련된 내용은 위키(wiki)를 참고하자. 식 (41)에서 구한 고유벡터가 맞는지 확인해보면 다음과 같다. 

 

 

 

식 (42)는 회전 행렬 Q로 각 고유벡터를 변환시킨 결과와 고유값과 고유벡터의 곱의 결과가 일치함을 보여준다. 이렇게하여 회전행렬(rotation matrix)의 복소수(complex number)로 표현된 고유값과 고유벡터를 계산하였다. 

 

 

- Rotation matrix(180 deg)

 

2x2 회전행렬(rotation matrix)은 0도와 180도를 제외한 나머지 각도에서는 고유값과 고유벡터가 비대칭성(anti-symmetric)으로 인해 복소수 형태로 표현됨을 배웠다. 그렇다면 같은 회전행렬이라도 0도와 180도는 대칭성을 보이며 실수로 표현이 될까? 답은 YES이다. 일단 0도에 대한 회전행렬은 단위행렬(identity matrix)이기 때문에 따로 설명을 하진 않겠다. 아래의 180도에 대한 회전행렬을 보자. 

 

 

식 (43)을 보면 theta가 180도일 때의 회전행렬 값을 나타낸다. 보다시피 대칭 행렬의 형태이며 고유값과 고유벡터가 모두 실수(real number)형태로 나타난다. 이를 좌표평면에 표현해보자. 

 

 

Fig. 12 180도 회전행렬의 변환과 고유벡터 

 

 

Fig. 12는 180도 회전행렬(rotation matrix)의 변환과 그의 고유벡터를 그래프로 표현한 것이다. 실선 화살표는 변환 전의 벡터와 고유벡터들을 나타내고, 점선 화살표는 변환 후의 벡터들을 의미한다. 빨간색 벡터는 x=[-2 3]T 벡터로써 180도 회전행렬에 의한 변환을 나타낸다. 180도 회전했기 때문에 원래와는 반대방향으로 바뀌었다. 마찬가지로 녹색과 파란색으로 표현된 고유벡터들도 변환 이후 180도로 회전한 모습을 보인다. 

 

그런데 여기서 한 가지 짚고 넘어가야 할 부분이 있다. 고유벡터는 분명 녹색과 청색으로 표현된 벡터들이다. 이들은 변환 이후에도 원래 자기 자신과 평행(parallel)하다. 그런데 붉은색으로 표현된 벡터 역시 변환 전과 후가 평행하다. 어떻게 된걸까? 사실 0도나 180도는 고유벡터 측면에서 특수한 각이다. 즉 이 특수각에 해당하는 2차원 회전행렬은 2차원 평면에 존재하는 모든 벡터가 전부 고유벡터가 될 수 있다. 즉 2차원 평면 공간이 전부 고유공간(eigenspace)이 되는 셈이다. 단지 2차원 평면에 존재하는 무수히 많은 벡터중에 가장 심플하고 기본적이며 연산에 있어 효율적인 벡터가 x=[1 0]T, x=[0 1]T이기 때문에 일반적으로 이 기저벡터들을 180도 회전행렬의 고유벡터로 사용하는 것이다. 회전행렬에서 이러한 특수각의 경우를 잘 알아두자. 

 

참고로 회전행렬의 임의의 각도는 그 원소들의 값이 소수의 형태로 나오게 되는데, 컴퓨터를 이용하여 회전 함수를 구현할 때 0도, 90도, 180도, 270도 등의 각도에 대한 회전행렬값은 삼각함수를 이용하여 계산하는 것 보단 theta값이 정확히 이들 각도면 상수값을 대입하여 회전 행렬을 만드는 것이 효과적이다. 일단 계산과정이 생략되므로 속도가 훨씬 빠르고, 또한 컴퓨터의 부동소수점 방식의 수치 계산상의 오류로 인해 프로그램이 오작동하는 경우를 방지해준다. 예를 들면 실제로 MATLAB에서 삼각함수를 이용하여 180도에 대한 회전행렬을 계산했을 때, 0을 완전한 0으로 인식하지 못하고 0.0000000214와 같은 굉장히 작은 소수로 인식하게 된다. 이 경우 고유값/고유벡터가 복소수의 형태로 나오는 오류가 발생한다. 따라서 특수각들에 대한 회전행렬은 미리 구현하여 사용하도록 하자. 

 

 

- Triangular matrix

 

마지막으로 살펴볼 행렬은 삼각행렬(triangular matrix)의 형태이다. 앞서 대칭행렬(symmetric matrix)에서 봤던 식 (29)의 행렬에서 a21의 원소를 0으로 만들어서 상삼각행렬(upper triangular matrix)을 만들어보자. 

 

 

식 (44)와 같은 삼각행렬형태의 행렬들은 굉장히 유용한 특성을 가지고 있다. 바로 고유값을 구하기가 매우 쉽다는 것이다. 대각 원소들 그 자체가 바로 고유값이다. 식 (44)의 행렬 A의 고유값은 대각 원소와 같은 λ1=a11=3,  λ2=a22=3이다. 왜 이와 같이 계산이 되는지 알아보자. 

 

 

식 (45)와 같이 determinant를 계산해보니 방정식 자체가 대각 원소들에 대한 것들만 포함된다. 따라서 대각 원소들이 곧 고유값이 되는 것이다. 결국 삼각행렬에 대한 고유값은 곧 원래 행렬의 대각 원소로써 굉장히 쉽게 구할 수 있다. 

 

또 한 가지 알아둘 특징은 삼각행렬인데 대각 원소가 같은 경우 고유벡터가 오직 하나만 존재한다는 것이다. 아래 식을 보자. 

 

 

λ=3일때 고유벡터를 구했더니 x=[1 0]T가 나왔다. 그리고 두 번째 고유벡터를 구하려고 보니 값이 같다. 결국 식 (46)으로 고유벡터를 한 번더 구하는 셈이 되어 서로 독립인 두 번째 고유벡터를 구할 수 없다. 이러한 특징들을 잘 알아두도록 하자. 

 

 

 

5. 마치며

 

지난 포스팅에 이어 고유값과 고유벡터에 대해 알아보는 두 번째 시간이었다. 이번 포스팅에선 고유값/고유벡터의 실제 계산법과 여러 가지 형태의 행렬의 고유값/고유벡터에 대해 공부하였다. 또한 그래프를 통해 고유값과 고유벡터의 기하학적 의미와 그 이해도를 높이고자 하였다. 모든 것을 변화시키는 와중에 변하지 않는 속성, 그리고 이 속성을 통한 시스템의 특성 해석 및 응용 등이 고유값/고유벡터 단원에서 중요하다 할 수 있겠다. 

 

이번 시간에는 2x2크기의 행렬 위주로 공부를 하였지만, 나중에 기회가 된다면 3x3행렬에 대한 고유값/고유벡터의 포스팅을 하도록 하겠습니다. 다음 포스팅 역시 고유값/고유벡터에 관련된 내용이 될 예정입니다. 

 

이번 시간에 다룰 내용은 고유값(eigenvalues)고유벡터(eigenvectors)이다. 고유값과 고유벡터에 대한 관련 내용도 꽤 방대하기 때문에 몇 개로 나누어서 다루도록 하겠다. 고유값과 고유벡터에 대한 중요성이나 필요성은 이 포스팅을 찾아온 분들이라면 굳이 설명하지 않아도 이미 알고 있을 것이다. 

임의의 정방행렬(square matrix) A에 대한 특별한 숫자가 고유값(eigenvalue)이고, A에 대한 특별한 벡터가 고유벡터(eigenvector)이다. 이들은 행렬 A에 대한 많은 정보를 내포하고 있으며, 이들은 파악하는 것은 A라는 시스템을 파악하는 데에 있어 굉장히 중요하다. 이번 포스팅에서는 이들이 의미하는 것이 무엇인지 알아보고, 이후 포스팅에선 이들을 어디에 어떻게 응용할 수 있는지를 다루도록 하겠다. 

 

 

1. 고유값(Eigenvalue)과 고유 벡터(Eigenvector)

 

- What is the eigenvalue and eigenvector?

 

임의의 정방행렬(square matrix) A가 있다고 하자. 이 행렬 A가 하는 역할은 무엇일까? A는 임의의 벡터 x에 함수(function)처럼 작용한다. 즉 어떤 벡터 x에 곱해져서 Ax라는 결과를 도출시킨다. 미적분학(calculus)을 통해 설명하자면 x는 입력 파라미터 값 x에 해당하고, Ax는 입력 파라미터를 적용한 어떤 함수의 결과값 f(x)에 해당한다. 선형 대수(Linear Algebra)에서는 x, f(x)보다 높은 차원의 식 x와 Ax를 다룬다. 

 

대부분의 경우 행렬 A에 의해 변환되는 벡터 x, 즉 Ax는 원래의 x와는 다른 방향으로 변환된다. 그러나 수많은 벡터 중에 어떤 벡터는 A에 의해 변환된 결과 벡터, 즉 Ax가 변환되기 이전의 벡터인 x평행(parallel)한 벡터들이 존재한다. 이렇게 A에 의해 변환 전과 변환 후가 평행한 벡터들이 우리가 관심을 가져야 하는 벡터들이고, 이것이 곧 고유벡터(eigenvector)이다. 고유벡터는 아래와 같이 정의할 수 있다.

 

 

그렇다면 식 (1)의 평행(parallel)하다 라는 것은 정확히 어떤 의미일까? 이는 아래의 방정식으로 정의할 수 있다. 

 




 

식 (2)는 수업시간에 고유값과 고유 벡터를 배울 때 많이 봤던 식일 것이다. 고유값, 고유벡터를 정의하는 가장 중요하고도 시작이 되는 식이며, 이를 이해하는 것은 매우 중요하다. 너무 중요하기 때문에 노란색 상자 안에 표시하였다. 식 (2)를 말로 풀어서 설명해보면 어떤 정방행렬 A는 임의의 벡터 x에 곱해져서 x의 위치나 방향을 변환시키는 역할을 한다. 그런데 수많은 벡터들 중 어떤 특정 벡터들은 A에 곱해져서 그 위치나 방향이 바뀌어도 원래 자기 자신과 동일한, 혹은 평행한 방향을 갖는다. 이러한 벡터들을 고유벡터(eigenvectors)라 한다. 이때 변환 전의 x와 A에 곱해져서 변환된 x의 크기는 다를 수 있으며, 그 크기는 특정 상수를 곱한 만큼의 차이가 존재할 뿐이다. 여기서 크기를 나타내는 특정 상수는 람다(λlambda)로 표현되었으며, 람다가 바로 고유값(eigenvalue)이다

 

정리하자면 고유벡터(eigenvector)라는 것은 어떤 선형시스템 방정식(Linear system equation) A에 의해 변환되는 수 많은 벡터들 중에 곱하기 전과 곱한 후의 벡터 방향이 똑같은 벡터이다. 즉 A가 어떤 짓을 하던간에 방향에 영향을 받지 않는 벡터를 의미한다. 고유벡터는 방향은 변하지 않지만, 원래의 벡터와 A에 의해 변환된 벡터의 크기가 어떤 상수배 만큼 다르다. 여기서 상수는 식 (2)에서 람다(lambda)를 의미한다. A는 고정된 것이고, 두 개의 미지수가 x람다(lambda)이다. 결국 식 (2)를 만족시키는 벡터 x들이 고유벡터(eigenvector)가 된다. 곱해지는 모든 벡터 x들을 변화시키지만, 변하는 와중에 변하지 않는 성분이 존재하기 마련이고, 선형시스템 A의 그 변하지 않는 성분, 혹은 속성이 고유값(eigenvalues)과 고유벡터(eigenvectors)라는 형태로 표현된 것이다

 

일단 말로 설명을 했지만 잘 이해가 가지 않을 수 있다. 그림을 통해 이해를 해보자. 우선 아래의 2x2크기의 선형시스템 방정식(Linear system equation) A를 보자. 

 

 

앞서 설명했던 것처럼 행렬 A를 어떤 함수 f(x)라고 생각해보자. 이 함수 f(x)의 기능은 x를 입력 받아 이를 변형시키는 역할을 한다. 즉 함수 역할을 하는 행렬 A에 어떤 파라미터값 x를 곱하면 이 x를 A의 특성에 맞춰 변형시켜 x'(x prime)이라는 새로운 벡터를 만들어내는 것이다. 나중에 따로 다루겠지만, 이를 선형변환(Linear Transformation)이라 한다. 실제로 x가 어떻게 변하는지 직접 살펴보자. 아래 그림은 A에 x=[1 1]T를 곱한 것이다. 

 

 

Fig. 1 행렬 A를 이용한 x의 변환

 

 

Fig. 1에서 원래의 벡터 x는 파란색 화살표로 표현되었으며, A에 곱해져서 변환된 벡터는 하늘색 점선 벡터로 표현되었다. 원래의 벡터 좌표 x=[1 1]이 A에 곱해져서 Ax=[3 0]이 되었다. 임의의 숫자를 무작위로 사용하다보니 식 (3)의 A의 벡터는 일반적이지 않은 복잡한 변환이 되었다. A의 변환을 간단히 설명하자면 공간을 양손으로 잡고 좌우로 잡아당기면서 아래/위로 뒤집은 방향으로 변환을 시킨다. 그러나 이것은 지금 당장 중요한 것이 아니기 때문에 일단 변환 자체에 관한 내용은 넘어가도록 하자. 

 

 

x=[1 1] 이외에도 다른 수많은 벡터들을 A에 곱해도 Fig. 1에 나타난 것과 같이 원래의 벡터방향과는 다른 쪽으로 변환이 이루어질 것이다. 그러나 그 수많은 벡터들 가운데 어떤 벡터들은 A에 곱해도 그 방향이 변하지 않거나 원래 자기 자신과 평행한 벡터들이 있다. 이러한 벡터들이 바로 그 행렬 A의 고유벡터(eigenvector)이다. 아래 그림은 식 (3)의 행렬 A에 대한 고유벡터를 나타낸다. 

 

 

Fig. 2 행렬 A의 고유벡터

 

 

Fig. 2는 식 (3)의 행렬 A의 고유벡터(eigenvector)를 그래프로 표현한 것이다. 일반적으로 nxn크기의 행렬은 n개의 고유벡터를 갖는다. A는 2x2크기이기 때문에 2개의 고유벡터를 가지며, 첫 번째 고유벡터 x1이 빨간색 벡터로, 두 번재 고유벡터 x2가 녹색 벡터로 각각 표현되었다. 실제 계산 방법은 이후에 알아보기로 하고, 일단 고유벡터 x1과 x2의 실제 값은 아래와 같다. 

 

 

미리 말하자면 식(4)는 손으로 계산한 결과이며, 정규화(normalized)되지 않은 상태이다. 고유벡터를 응용함에 있어 방향성분만을 적용하기 위해선 반드시 정규화를 해줘야 한다. MATLAB 등의 소프트웨어의 내장함수를 이용하여 고유벡터를 계산하면 알고리즘에 따라 값이 약간은 바뀔 수 있음을 유의하자. 어쨋든 x1과 x2가 정말로 행렬 A의 고유벡터라면, A에 곱했을 때도 그 방향이 변하지 않아야 한다. 정말로 방향이 변하는지, 변하지 않는지 한 번 곱해보자. 

 

 

식 (5)는 행렬 A와 아까 구한 고유벡터(eigenvector)를 각각 곱하여 분수식을 계산하고 분모의 유리화(rationalization)를 통해 계산한 결과 값을 나타낸다. 벡터의 값만 가지고는 원래의 x들과 방향이 같은지 알기 힘들다. 그래프를 통해 알아보도록 하자. 

 

Fig. 3 고유벡터와 A에 의한 변환 결과

 

 

Fig. 3은 A의 고유벡터 x1과 x2가 실제로 A에 의해 변환된 이후에도 원래 자기 자신과 비교해 봤을 때 방향이 바뀌지 않는지를 시험해보기 위해 그래프를 통해 변환된 고유벡터들을 표현한 것이다. 고유벡터 x1과 A에 의해 변환된 Ax1을 비교해보면 비록 크기가 약간 다르고 반대 방향이긴 하지만, 그 방향의 축은 변하지 않았다. x2와 Ax2는 벡터의 크기는 다르지만 방향은 같은 것을 볼 수 있다. 

 

 

x2는 변환 이후에도 방향이 같기 때문에 그럭저럭 이해할 수 있을 것 같긴 한데, x1의 경우는 방향의 축은 같지만 반대방향이기 때문에 고유벡터가 맞나? 하는 생각이 들 수 있다. 하지만 식 (2)의 정의에 의하면 x1은 분명 고유벡터가 맞다. 다만 우리가 아직 고려하지 않은 한 가지가 있을 뿐이다. 바로 고유값(eigenvalue)이다. 식 (2)를 다시 곱씹어보면 "행렬 A에 의해 변환된 고유벡터 x는 원래의 벡터에 어떤 상수 람다(lambda)를 곱한 것과 같다"이다. 여기서 람다(lambda)가 고유값을 의미하며, Fig. 3의 고유벡터 x1과 x2가 변환된 결과와 완전히 같아지기 위해선 여기에 고유값 람다를 곱해야 한다. x1과 x2에 대한 고유값은 아래와 같다. 

 

 

λ1은 x1에 대한 고유값을, λ2는 x2에 대한 고유값을 각각 의미한다. 여기서 λ1을 가만히 보면 부호가 음수(-)인 것을 볼 수 있으며, 값은 약 1.3정도 된다. 즉 Fig. 3에서 x1에 λ1을 곱하면 원래의 방향에서 반대방향으로 벡터가 바뀌며, 그 크기는 약 1.3배 정도 커진다는 의미다. Fig. 3을 봤을 때 빨간색 고유벡터 x1에 해당 고유값 λ1=-1.3028을 곱해주면 왠지 검은색 벡터 Ax1과 같아질 것만 같다. 마찬가지로 녹색 고유벡터 x2에도 λ2인 2.3028을 곱해주면 자홍색(magenta) Ax2와 같아질 것 같다. 정말로 그런지 그래프를 통해 확인해보자. 

 

Fig. 4 고유값과 고유벡터와 A를 통한 선형변환의 비교

 

 

Fig. 4는 Fig. 3의 고유벡터에 각각의 고유값을 곱하여 A의 선형변환과 비교한 그래프이다. Ax1과 x1는 원래 방향이 반대이고 길이가 달랐지만, λ1을 곱하고나니 같아졌다. λ1x1은 노란색 벡터로 검은색 벡터 위에 표시되었으며, Ax1벡터와 일치하는 것을 볼 수 있다. 마찬가지로 Ax2와 x2의 경우 x2의 길이가 짧았으나, λ2를 곱하고난 뒤 길이가 같아진 것을 볼 수 있다. λ2x2는 청록색(cyan)벡터로 표시되었으며, Ax2의 벡터와 겹쳐서 그려졌다. 따라서 우리는 Fig. 4를 통해 식 (2)로 정의된 고유값과 고유벡터에 대한 정의를 눈으로 확인하고 증명하였다. 아래 그림은 MATLAB 구현 코드이다. 참고로 MATLAB의 고유값/고유벡터 계산 내장 함수 명령어는 아래와 같다. 

 

[V D] = eig(A);

 

eig()함수는 행렬 A를 파라미터로 받아 고유값/고유벡터를 계산한다. V에는 고유벡터가 column vector 형식으로 저장되고, D에는 고유값들이 차례로 대각 원소로 저장된다. 

 

 

 

 

 

- eigenspace

 

Fig. 4에서 고유벡터(eigenvector)들은 고유값(eigenvalue)과 곱해져서 A에 의해 변환된 이후에도 원래 자기 자신과 같음을 보였다. 그렇다면 A의 고유벡터와 고유값은 유일할까? A의 고유벡터는 오직 Fig. 4에서 표시된 x1과 x2만 존재하고, A의 고유값은 오직 λ1과 λ2만 존재하는 걸까? 결론부터 말하자면 고유값은 유일하며, 고유벡터는 무수히 많다. 아래 식을 보자. 

 

 

식 (7.1)은 고유값(eigenvalue)에 임의의 상수를 곱한 식이다. 고유값이 유일하지 않음을 가정하고 만든 식이다. 이 경우 식은 성립할까? 당연히 성립하지 않을 것이다. 한쪽 변에만 임의의 상수를 곱해주면 당연히 식은 성립하지 않는다. 따라서 어떤 행렬 A의 고유값은 유일하다

 

식 (7.2)는 고유벡터(eigenvector)가 무수히 많을 것이라는 가정하에 만든 식이다. 식의 양변의 벡터 x에 각각 임의의 동일한 상수 c를 곱했다. 이 상수값은 양수(+), 혹은 음수(-), 심지어 0이 될 수도 있다. 어떤 상수를 곱해주던간에 양변에 동일한 상수를 곱해줬기 때문에 식은 성립할 것이다. 따라서 행렬 A의 고유벡터는 무수히 많으며, 어떤 하나의 부분 공간(subspace)를 형성한다. 이 고유벡터들이 형성하는 부분공간이 바로 고유공간(eigenspace)이다. 일반적으로 고유공간은 어떤 nxn크기의 행렬에서 동일한 고유값에 대응되는 고유벡터들의 집합 혹은 부분공간으로 정의할 수 있다. Fig. 4를 기준으로 보면 고유값 λ1에 대응되는 고유벡터 x1과, 고유값 λ2에 대응되는 x2를 기준으로 형성되는 Line이 A의 두 개의 부분 공간이 된다. 아래 그림은 고유공간을 나타낸다.

 

Fig. 5 행렬 A의 eigenspace

 

 

따라서 행렬 A의 고유벡터들은 고유공간(eigenspace)상에 존재하는 무수히 많은 벡터들이다. 이 eigenspace들은 λ1, λ2에 각각 대응되는 부분 공간(subspace)이며, 각 eigenspace에 존재하는 고유벡터(eigenvector)들의 선형결합(Linear combination)으로 정의할 수 있다. 결국 nxn 행렬에서 고유공간(eigenspace)의 수는 동일한 고유값에 대응되는 고유벡터들의 집합의 수 만큼 정의될 수 있다.

 

 

- eigenvalues and eigenvectors in null space

 

이미 언급했듯이 선형시스템 A에 곱해지는 대부분의 벡터 x는 고유벡터가 될 수 없으며, 우리는 그 안에서 고유벡터들을 찾아야 한다. 고유벡터는 A에 의해 변환되어도 원래와 동일한 방향성을 가지는 것이라 했는데, 이때 앞서 확인했듯이 그 방향은 반대방향이 될 수도, 혹은 아예 방향이 없을 수도 있다. 따라서 고유값인 람다는 양수(positive), 음수(negative), 0(zero), 심지어 복소수(imaginary number)도 될 수 있다. 

 

여기서 한 가지 짚고 넘어가자면, 고유값(eigenvalues)인 람다가 0인 경우의 고유벡터는 어떤 경우일까? 람다가 0이면 식은 Ax=0가 된다. 즉 이때의 고유벡터(eigenvector)는 영공간(null space)에 존재하는 것이다. 다시 말하면 행렬 A가 특이 행렬(singular matrix)이라는 것이다 (정방행렬에서 null space가 존재하기 위해선 free variable이 존재하는 행렬, 즉 full rank가 아니어야한다. 자세한 것은 Lecture 6, Lecture 7참조). A가 특이 행렬인 경우null space가 존재할 수 있고, A는 일부 영벡터(zero vector)가 아닌 벡터들을 영벡터(zero vector)로 보낼 수 있다. 여기서 그 "일부"에 해당하는 벡터들이 바로 고유벡터가 된다. 이를 식으로 나타내면 아래와 같다. 

 

 

A가 특이 행렬인 경우 null space가 존재하고, 이때의 고유값인 람다는 0이 된다. 이것이 식 (8)이고, 이를 만족하는 x가 바로 고유벡터이다. A가 정방행렬이며 특이행렬이고, 람다가 0일 때의 eigenvector는 null space그 자체가 된다. 

 

null space가 존재하는 행렬의 고유값(eigenvalue)과 고유벡터(eigenvalue)의 예를 한 번 들어보자. 지난 강의 Lecture 15-(2)에서 우리는 투영행렬(projection matrix)을 공부했었는데, 그때 공부했었던 투영행렬에 관한 내용을 다시 가져와보자. 

 

 

위의 문제를 간단히 설명하자면 식 (9.1)은 3차원 공간에서 2차원 평면에 관한 부분 공간(subspace)을 나타내는 선형방정식을 나타내며, 미지수보다 방정식이 더 많은 overdetermined case인 문제이다. 우변의 벡터 b는 A의 column space에 존재하지 않기 때문에 사실상 해(solution)가 존재하지 않는다. 그러나 근사하게나마 해를 구하기 위해 우변의 벡터 b를 column space에 존재하는 수많은 벡터들 중 가장 유사한 벡터로 대체하기 위해서 식 (9.2)와 같이 투영행렬(projection matrix)을 만든 것이다. 이 투영행렬을 통해 식 (9.3)과 같이 벡터 b를 A의 column space로 투영(projection)시킬 수 있다. 아래 그림은 이 문제에 대한 그림을 나타낸다. 

 

Fig. 6 A의 column space와 투영행렬

 

 

Fig. 6에서 파란색 벡터 b는 투영행렬 P에 의해 베이지색으로 표시된 A의 column space로 투영되어 녹색 벡터 p가 된다. a1과 a2벡터는 각각 A의 column1, column2를 의미하며, column space의 기저(basis)역할을 하기 때문에 a1과 a2의 선형결합(Linear combination)을 통해 column space를 형성할 수 있다. 

 

 

우리가 여기서 찾고자 하는 것은 투영행렬 P의 고유값(eigenvalue)과 고유벡터(eigenvector)이다. 이미 알고있겠지만, 식 (9.3)의 투영행렬은 3차원 벡터를 2차원 공간으로 투영시키는 역할을 하기 때문에 3x3크기에 rank는 2이고, 특이 행렬(singular matrix)이다. 따라서 null space가 존재하고 고유값이 0일 것이라는 추측은 해볼 수 있다. 

 

그렇다면 투영행렬 P의 고유값과 고유벡터는 어떤 것들일까? Fig. 6에서 파란색 벡터 b는 투영행렬 P의 고유벡터일까? 고유벡터의 정의는 원래 자신의 방향성과 행렬에 의해 변환된 결과가 변하지 않아야 한다. 그러나 b는 P에 의해 녹색벡터 p로 변환되고, 원래 자신과 완전히 다른 방향이 되기 때문에 P의 고유벡터가 아니다. 

 

이번엔 a1을 P에 곱해보자. 결과는 a1=Pa1과 같이 그대로 자기 자신이 나온다. a2도 곱해보면 a2=Pa2와 같이 그대로 자기 자신이 나온다. 애초에 투영행렬은 투영시키고자 하는 평면에 이미 존재하는 벡터들을 곱했을 때, 아무런 변화도 일으키지 않는다. 이 말은 column space인 평면에 존재하는 모든 벡터들은 전부 투영행렬 P의 고유벡터(eigenvector)가 된다는 의미이다. 즉 평면 자체가 하나의 고유공간(eigenspace)가 되고, 이때의 고유값은 1이 될 것이며, 아래와 같이 정의할 수 있다. 

 

 

 

 

아래 그림은 식 (10)의 투영행렬의 고유벡터들을 실제로 MATLAB을 이용하여 그래프로 표현한 결과이다. 

 

 

 

Fig. 7 투영행렬(projection matrix)의 고유벡터들(eigenvectors)

 

 

이미 언급했듯이 투영행렬 P의 고유벡터(eigenvector)들은 Fig. 7에서 노란색으로 표시된 평면(원래는 무한대로 봐야함)에 존재하는 모든 벡터들이다. 이는 다시말하면 람다(λ)=1에 해당하는 고유공간(eigenspace)라고 할 수 있다. 이들이 정말 고유벡터들이 맞는지 확인하기 위해 그래프를 통해 검증하였다. Fig. 7에서 Pa1=a1, Pa2=a2와 같이 원래 벡터와 변환 결과가 같음을 확인할 수 있다. a1과 a2외에도 평면에 존재하는 다른 벡터도 고유벡터가 될 수 있는지 확인하기 위해 a1과 a2의 선형결합(Linear combination)을 이용하여 변환 결과가 같음을 확인하였다. P(0.5a1+0.4a2)=0.5a1+0.4a2 임을 그래프를 통해 확인하였고, 결과적으로 평면에 존재하는 모든 벡터들이 투영행렬(projection matrix)의 고유벡터(eigenvector)가 됨을 검증하였다. 

 

Fig. 7의 노란색 평면은 식 (9.1)의 A의 column space라고 했지만, 투영행렬이 A를 기반으로 만들어졌고, 또 임의의 3차원 벡터를 노란 평면의 공간으로 보내는 역할을 하기 때문에 이 평면 자체가 투영행렬의 column space라고 할 수 있다. 투영행렬의 크기가 비록 3x3이지만 rank=2이기 때문에 선형 독립(Linearly independent)인 기저벡터(basis vector)가 두 개인 셈이다. 따라서 3차원 공간에서 2차원 평면 부분공간(subspace)을 정의하기 때문에 Fig. 7의 노란평면이 투영행렬 P의 column space가 된다. 

 

 

평면을 정의하기 위해선 독립(independent)인 벡터 2개가 필요한데, 우리는 이미 Fig. 7을 통해 투영행렬의 평면을 정의하였다. 3x3크기의 행렬은 3개의 고유값(eigenvalue)과 고유벡터(eigenvector)를 가지는데, 이미 평면을 정의했기 때문에 결과적으로 3개의 고유벡터중, 2개의 고유벡터를 찾은 셈이다. 그럼 나머지 한 개의 고유벡터는 어디에 있을까? 투영행렬 P는 3x3이지만 rank=2이고 따라서 free variable을 갖는다. 즉 투영행렬이 특이 행렬(singular matrix)이자 null space를 갖는다는 말이다. 투영행렬의 null space는 Px=0과 같이 정의할 수 있고, 식 (8)에 의해서 람다(λ)는 0이 된다. 이 말은 투영행렬의 나머지 고유벡터가 null space에 존재하며, 사실은 null space 그 자체가 된다는 의미이다. 이를 (10.1)에 이어 식으로 정리하면 아래와 같다. 

 

 

그런데 식 (10.2)를 보면 null space에 존재하는 고유벡터들을 평면에 수직(perpendicular)한 벡터들로 정의하였다. 한 가지 의문이 들만한 것은 Fig. 7에선 분명 평면을 column space라고 했는데, column space에 수직한 공간은 Left null space라고 Lecture 10에서 공부하였다. 그렇다면 정의가 틀린 것일까? 그렇지 않다. Lecture 15-(2)에서 투영행렬 P는 전치(transpose)를 시켜도 변하지 않음을 보였다. 따라서 Fig. 7의 노란 평면은 투영행렬의 column space이자 동시에 row space이고, 여기에 수직인 null space가 정의될 수 있는 것이다. 아래 그림은 null space와 나머지 eigenvector를 그래프로 표현한 것이다.

 

 

Fig. 8 Null space에 존재하는 고유벡터와 고유값

 

 

Fig. 8의 노란 평면을 수직으로 관통하는 검은색 Line이 null space이다. 자홍색(magenta) 벡터는 이 null space상에 존재하는 고유벡터(eigenvector)를 나타내며, MATLAB의 내장 함수로 계산한 결과이다. 이 고유벡터에 해당하는 고유값은 0이며, 식 (2)에 따라 고유값인 0을 해당 고유벡터에 곱해주면 우변이 0이 되어 null space를 정의하게 된다. 따라서 Fig. 8에 검은색 Line으로 표현된 null space는 투영행렬 P의 λ=0에 해당하는 eigenspace라고 할 수 있다. 사실 꼭 λ=0를 고려하지 않더라도, 검은색 Line상에 존재하는 어떠한 벡터를 P에 곱해도 결과값은 0이 나오기 때문이다. 실제로도 Fig. 8의 투영행렬 P와 MATLAB의 내장함수로 구한 λ=0에 해당하는 고유벡터 x를 곱해주면 Px=0으로 0이 나온다. 스케일을 고려한 P(cx)=0도 마찬가지이다. 

 

정리하자면 투영행렬(projection matrix)은 해가 존재하지 않는 overdetermined case인 Ax=b의 근사해를 구하기 위해 만들어졌으며, 우변의 벡터 b를 A의 column space로 투영하여 근사해를 구할 수 있도록 해준다. 이때 투영행렬 P는 full rank가 아닌 특이행렬(singular matrix)이고, free variable을 가지기 때문에 null space를 가진다. 투영행렬이 3x3인 경우 3개의 고유값(eigenvalue)과 3개의 고유벡터(eigenvector)를 가지는데, rank의 수 r만큼 column space 혹은 row space에서의 0이 아닌 고유값과 그에 대한 고유벡터를 가지며, n-r만큼 null space상에서 0인 고유값과 그에 대한 고유벡터를 가진다. 아래는 MATLAB구현 코드이다. 

 

 

 

 

 

2. 마치며 (continue)

 

이번 포스팅에선 고유값과 고유벡터에 대한 개념을 위주로 다루었다. 기본적인 식과 예를 통해 고유값과 고유벡터가 공간상에서 어떻게 표현되는지, 어떤 의미를 갖는지를 공부하였다. 고유벡터(eigenvector)와 고유값(eigenvalue)에서 가장 중요한 것은 식 (2)를 이해하는 것이다. 어떤 행렬의 고유값과 고유벡터는 그 행렬의 굉장히 중요한 정보를 담고 있다. 임의의 벡터를 어느 방향으로 얼마만큼 변화시키는지, 변환과정에서 변화 없이 유지되는 부분은 어느 부분인지 등이다. 사실 이 포스팅에선 변환 자체를 단일 벡터들을 기준으로 설명했지만, 실제 응용단계에서는 어떤 물체나 영상 등을 변환시키는데, 이러한 영상이나 물체등은 무수히 많은 벡터들의 뭉치라고 할 수 있다. 따라서 영상이나 물체가 어떤 식으로 변환되고 중심축은 어디인지 등에 관한 중요한 정보들을 파악할 수 있다. 

이 외에도 PCA(Principal Component Analysis), 영상에서 EigenFace, 진동 분석(Vibration Analysis)등 다양한 분야에 응용된다. 

 

다음 포스팅은 고유값과 고유벡터의 실제 계산 방법과 다양한 행렬들의 고유값/고유벡터, 그리고 여러 가지 관련 특성들에 대해서 포스팅 하도록 하겠습니다. 

 

+ Recent posts