?!?!😵

구름이 잔뜩 낀 사월의 어느 오후, 조용한 강의실에 정신없이 울려 퍼지는 연필과 종이의 마찰음, 마스크 밖으로 튀어나오지 못해 절제된 한숨, 책상에 한없이 날리는 지우개 가루, 종이 속에 펼쳐진 수 많은 숫자들….

그렇다. 바로 중간고사다.

과목은 선형대수. 2학년 학과 수업 중 가장 중요하고도 어려운 과목 중 하나이기도 하다.

아무튼 나 역시 다른 사람들처럼 문제를 한 문제씩 천천히 풀어나갔다.

앗 그런데, 아뿔싸! 큰일이다. 내가 수반행렬을 이용해서 구한 역행렬이 원래 행렬과 행렬 곱 계산을 했을 때 단위행렬이 안되는 것 같았다.

충격적이다. 수많은 연산으로 시간이 오랫동안 흘렀지만 무엇이 문제인지 눈에 잘 보이지 않았다. 나는 더 이상 시간을 지체할 수 없었고, 다른 문제를 풀었어야 했다.

역행렬이 어쩌구가 도대체 뭔데?🤔

간단한 설명

음 일단 내가 중간고사까지 개인적으로 느꼈던 선형대수에서 가장 중요한 질문(물론 더 많이 배울수록 더 중요한 질문들이 많이 생겨났었다)은

선형연립방정식이 무엇이고 이것을 어떻게 풀 것인가? 인 것 같다.

먼저 선형연립방정식은 선형: 일차항으로 이루어진, 연립 : 여러 개의, 방정식 : 미지수에 대한 등식 즉 일차항으로 이루어졌고, 여러 미지수에 대한 서로 관계있는 등식들의 모음이 선형연립방정식이라고 할 수 있다.

맞다. 여러분이 초중고 생활 동안 아주 많이 봐온 일차연립방정식이다.

\[\begin{gather*} 일차연립방정식의\space예\\ \begin{cases} 2x+y = 1 \\ 3x+2y = 4 \end{cases} \end{gather*}\]

아무튼 선형연립방정식은 흔히들 말하는 가감법과 대입법을 이용해서 대학생 이전에는 풀어왔었다. 그런데 미지수의 개수가 많아지고, 식의 개수가 많아지면 이 방법들은 시간도 오래 걸리고 힘들다. 그러므로 선형연립방정식을 행렬을 이용해서 방정식의 계수와 관련된 새로운 방정식을 만들어서 푸는 방법을 생각해 볼 수 있다. 그것이 바로 행렬방정식이다.

\[\begin{gather*} 행렬방정식의\space예 \\ \begin{bmatrix} 2 & 1 \\ 3 & 2 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} 1 \\ 4 \end{bmatrix} \end{gather*}\]

기호를 통해서 간단하게 나타낼 수도 있다!

\[\begin{gather*} A= \begin{bmatrix} 2 & 1 \\ 3 & 2 \end{bmatrix}, \space X = \begin{bmatrix} x \\ y \end{bmatrix}, \space B = \begin{bmatrix} 1 \\ 4 \end{bmatrix} \end{gather*}\]

라 할 때,

\[\begin{gather*} AX = B \end{gather*}\]

이런 식으로 말이다.

그런데, 이 식을 보면 본능적으로 양변에 A의 역수1/A를 곱해서 풀고 싶겠지만, 그러면 안 된다!

왜냐하면 행렬은 일반적인 가 아니기 때문이다!

그래도 좋은 접근이다.

행렬방정식에서도 역수는 아니지만 행렬곱에 대한 역원인 역행렬을 양변에 곱해서 방정식을 풀 수 있다.

\[\begin{gather*} 행렬방정식과\space 일차방정식의 \space소거\\ 1) \space 일차방정식 \\ ax = b\\ \frac{1}{a} \cdot ax = b \cdot \frac{1}{a}\\ 1x = \frac{b}{a} \\ x = \frac{b}{a} \\ 2) \space 행렬방정식 \\ AX = B\\ A^{-1}AX = A^{-1}B\\ IX = A^{-1}B\\ X = A^{-1}B\\ A^{-1}은\space A의\space 역행렬이고,\space I는 \space단위행렬이다.\\ (3\times 3\space크기의\space단위행렬)\\ I = \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{bmatrix} \end{gather*}\]

아마 이쯤에서 감을 잡았겠지만, 실수 집합의 어떤 수에 역수를 곱하면 1이 나온다. 어떤 수와 1을 곱하면 그 결과는 어떤 수가 된다. 이처럼 행렬 집합에서 어떤 행렬이 역행렬이 존재한다고 할 때(원래 행렬이 정방행렬이 아니거나 기타 이유로 역행렬이 존재하지 않을 수 있다), 역행렬을 곱하면 단위행렬 I가 되고, 어떤 행렬과 단위행렬을 곱하면 그 결과는 어떤 행렬이 된다.

\[\begin{gather*} 1)\space실수\space집합에서의\space곱\space 연산의 \space 경우\\ a \in R\\ a \cdot \frac{1}{a} =\frac{1}{a}\cdot a =1\\ a \cdot 1 = 1 \cdot a = a\\ 2)\space행렬\space집합에서의\space곱\space 연산의 \space 경우\\ A \in M\\ A^{-1}A =AA^{-1}= I\\ AI = IA = A\\ 단,\space A^{-1}\space 존재 \end{gather*}\]

그렇다. 내가 구했던 역행렬은 올바르게 구해지지 않았기 때문에 2)의 성질을 만족하지 않았던 것이다! (아마 계산 실수….)

아무튼 간에 이제 역행렬을 구해보자!

본격적으로 역행렬 구하기!🔢

역행렬을 구하는 방법에는 여러 방법이 있지만, 이 글에서는 행렬식과 수반행렬을 이용해서 역행렬을 구해볼 것이다!

“자세한 공식유도나 증명” 등은 검색을 통해서 알아본다면 더 도움이 될 것이다.

2X2 행렬의 역행렬

먼저 2X2 행렬의 역행렬을 알아보자. 아주 계산하기 쉽고 간단하다!

\[\begin{gather*} A = \begin{bmatrix} a & b\\ c & d \end{bmatrix}\\ A^{-1} = \frac{1}{ad-cb} \begin{bmatrix} d & -b\\ -c & a \end{bmatrix}\\ \end{gather*}\]

흠 근데 뭔가 위험한 부분이 있는 것 같다.

만약에 ad-cb가 0이 되면 어떻게 될까?

\[\\ \begin{gather*} ab-cb = 0\\ \frac{1}{ad-cb} = \frac{1}{0}???? \end{gather*} \\\]

초중고 생활을 하면서 어떤 수를 0으로 나눠 본 적은 없을 것이다. 왜냐하면 그런 수는 존재하지 않기 때문이다.

그런데 만약에 위처럼 역행렬 계산식의 분수 분모 부분이 0이 되면 역행렬이 존재하지 않게 된다!

그래서 이 분모 부분은 역행렬에서 역행렬의 존재 여부등 꽤 중요한 의미를 갖기 때문에 행렬식이라는 이름이 따로 있다.

자세한 내용은 2X2 행렬보다 크기가 큰 행렬에서 더 살펴보도록 하자.

NXN 행렬( N > 2 )의 역행렬

nxn의 역행렬도 형태는 비슷하다.

\[\begin{gather*} A_{n \times n} = \begin{bmatrix} a_{11} & \cdots & a_{1n}\\ \vdots & \ddots & \vdots\\ a_{n1} & \cdots & a_{nn} \end{bmatrix}\\ A^{-1} = \frac{1}{det(A)}\begin{bmatrix} C_{11} & \cdots & C_{1n}\\ \vdots & \ddots & \vdots\\ C_{n1} & \cdots & C_{nn} \end{bmatrix}^T \end{gather*}\]

처음 보는 게 많다…괜찮다! 나도 그랬었다 ㅎㅎ

먼저 det(A)는 A의 행렬식이다. 위에서 본 2x2행렬 처럼 그냥 원소의 곱으로 적으면 되는데 왜 이상한 기호를 써서 표현할까?

그 이유는 n이 커질수록 즉 (정방)행렬의 크기가 커질수록 원소의 곱이 복잡해져서 그럴 것이다. 행렬식을 어떻게 구하는데 원소의 곱으로 표현하는 것이 복잡해질까? N이 2보다 큰, NXN 행렬 중에서 가장 작은 3x3 행렬의 예시로 한번 알아보도록 하자.

determinant

위 그림을 보면 알 수 있듯이 행렬식은 다소 재밌는? 과정을 통해서 계산할 수 있다.

  1. 먼저 행을 선택한다. (위의 경우는 1행을 선택한 경우이다)
  2. 행의 원소마다 해당하는 소행렬식을 계산할 수 있는 2x2 행렬까지 구한다.
    1. 원소의 있는 행,열을 제외한 나머지 행과 열로 소행렬?을 만든다.
    2. 만든 행렬이 2x2 행렬이면 계산하고 원소의 행과 열에 맞는 부호를 곱한다. (n>2면 똑같은 방식으로 계속해서 소행렬식으로 쪼개서 계산한다.)
  3. 2에서 구한 소행렬식의 값과 원소의 곱을 모두 더 한다.

2 부분을 보면 알겠지만 마치 마트료시카 인형처럼 행렬식을 계산할 수 있는 행렬인 2x2 행렬이 나올 때까지 재귀적으로 계산을 수행하는 것을 볼 수 있다.

이 과정을 수식으로 적으면 다음과 같다.

\[\begin{gather*} \\ \sum_{k=1}^{n}{(-1)^{1+k}a_{ik}M_{ik}} = \sum_{k=1}^{n}{a_{ik}C_{ik}} \\ \end{gather*}\]

여기서 또 하나의 수수께끼가 풀린다. Cnm 은 n행 m열 원소를 선택했을 때 소행렬식과 부호값의 곱이다! 이를 여인자라 한다. 영어로는 Cofactor 그래서 C라는 약자를 사용하는 것이다.

아 참고로 위에 붙어 있는 T는 전치행렬이라는 뜻이다. 쉽게 말해서 전치행렬은 열과 행을 서로 바꾸는 거다. 다음을 보면 이해가 단번에 될 것이다.

\[\begin{gather*} \\ \begin{bmatrix} a & b & c\\ d & e & f\\ g & h & i \end{bmatrix}^T= \begin{bmatrix} a & d & g\\ b & e & h\\ c & f & i \end{bmatrix} \\ \end{gather*}\]

이와 같이 성분들이 여인자인 행렬의 전치행렬을 수반행렬이라고 한다. 즉, 우리는 지금까지 역행렬을 구하는 여러가지 방법 중에서 행렬식과 수반행렬을 이용하는 방법을 알아보았다고 말할 수 있겠다.

이로서 드디어 우리는 선형연립방정식을 행렬방정식으로 만들고 역행렬을 구하고 행렬곱 연산, 스칼라 배 연산을 통해서 풀 수 있게 되었다.

혹시 시간이 약간 있다면 글을 읽는 것을 잠시 멈추고, 연습장을 하나 꺼내펼치고, 연필이나 볼펜으로 아무 선형연립방정식을 만들어 적은 다음, 행렬식과 수반행렬을 이용해서 역행렬을 구하고 선형연립방정식을 풀어보는 것이 어떨까?

준비과정을 마치면서

음 설명이 부족하고 지루한 글을 여기까지 읽어줘서 미안하고, 고맙다.

사실 이 글은 Python으로 역행렬을 구하기 위해서 지난 학기에 배웠던 역행렬 개념을 정리하는 글이었다.

(코드는 다 짜놓은 상태이고, 글과 테스트코드를 작성해야함)

아마 곧 있으면, 이에 대한 Python 코드와 약간의 테스트를 곁들인 글도 블로그에 올릴 것 같다.

거의 처음으로 수학과 관련된 글을 써보았는데 역시 수학은 어렵고, 수학을 설명하는 글을 쓰는 것은 더 어렵다.

그렇기 때문에 항상 겸손한 마음으로 더 열심히 공부를 해야겠다는 생각이 든다. (화이팅…!)

다음에는 더 좋은 글로 찾아오겠다. 그럼 안녕🙋‍♂️