while(1) work();
반응형

지난 포스팅에서 단위행렬, 소거행렬, 역행렬, 치환행렬, 증강행렬에 대해서 배웠습니다. 이 용어들은 앞으로도 꾸준히 사용하게 될 용어입니다. 반드시 각 행렬들이 무엇을 의미하는지 알고 계시는 것을 권장드립니다.


이번 포스팅에서는 지난번에 소개해드린 행렬 중에 역행렬에 대해서 자세히 다루어볼까 합니다.





이차 정방행렬(2 by 2 Matrix)의 역행렬



지금은 사라졌다고 하지만 불과 몇 년 전까지만 해도 고등학교 교육과정상에는 행렬 단원이 존재했었습니다. 그리고 2차 정방행렬의 역행렬은 아래와 같다고 외웠었지요.



그러나 왜 2차 정방행렬의 역행렬이 저렇게 나오는지에 대해서는 배우지 않았을껍니다. (물론 A와 A의 역행렬의 곱이 Identity Matrix가 된다는 것은 쉽게 증명할 수 있지만요. 계산해보면 되지요.)


사실 역행렬을 구하는 과정은 쉬운 과정이 아닙니다. 삼차 정방행렬 이상의 고차 정방행렬이라면 계산 과정은 더 복잡해지고, 정방행렬이 아니라면 더더욱 그렇습니다.


행렬이 정방행렬일 경우 아래에 서술할 Gauss-Jordan Elimination을 사용하면 되지만, 행렬의 차수가 커질수록 계산해야할 항목들이 많아집니다. 그래서 앞으로의 포스팅에서 나올 예제들에서는 대부분 역행렬을 구해야 할 때, 2차 정방행렬을 사용하겠습니다. 2차 정방행렬의 역행렬 공식은 외우고 계시는 것을 권장드립니다.





Gauss-Jordan Elimination의 알고리즘



Gauss Jordan Elimination은 정방행렬의 역행렬을 구하기 위한 알고리즘입니다. 이 알고리즘은 간단한 원리에서부터 시작됩니다.


역행렬을 구하고자 하는 행렬을 라고 하고 와 크기가 같은 Identity Matrix를 첨가(Augment)한 행렬을 로 표현한다고 해볼까요? (책에 나온 표현을 따라 Augment Matrix의 구분선(|)은 생략하겠습니다.)


그 다음 의 왼쪽에 Elimination Matrix인 를 곱해줍니다.

이 때 Elimination을 가 되도록 적절히 조절해준다면, 역행렬의 정의에 의해서 이 되겠지요?

그럼 결국 아래와 같은 식이 탄생합니다.


이해가 가지 않으셔도 좋습니다. 이해가 가지 않으신다면 아래의 실제 적용예를 보고 다시한번 읽어보세요.




Gauss-Jordan Elimination의 적용



행렬을 하나 만들어볼까요?

책의 2.5단원에 있는 27번 연습문제에 있는 행렬입니다.

이 행렬을 가지고 실제 을 구하는 과정을 설명드려볼까 합니다.


먼저 Augment Matrix를 만들어주어야겠지요?

그 다음 왼쪽에 있는 3개의 Column이 각각 (1,0,0), (0,1,0), (0,0,1)이 되도록(Identity Matrix가 되도록) 적절히 Elimination 을 해주어야 합니다.


먼저 세번째 Row에서 두번째 Row를 빼줄까요?

이 때, 오른쪽 Matrix에서도 똑같이 Elimination을 해주어야함을 잊으시면 안됩니다.

Augment Matrix에서 따옴표로 표시한 부분은 이미 Identity Matirx화(化)가 되었네요.


첫 번째 Row와 두 번째 Row만 Elimination 시켜주면 될 것 같습니다.


두 번째 Row에서 첫 번째 Row를 빼줄까요?


두 번째 Row를 마져 Identity Matrix화 시켜주기 위해 두 번째 Row에서 세 번째 Row를 빼줍시다.


마찬가지로 두 번째 Row도 Identity Matrix가 되었네요.


이제 첫 번째 Row에서 두 번째와 세 번째 Row를 각각 빼주어서 Elimination을 마무리해볼까요?



좌측 Matrix가 Identity Matrix가 되었습니다.

그럼 자동으로 우측 Matrix가 A의 역행렬임을 알 수 있겠네요.


실제로 A와 A역행렬을 곱해서 Identity Matrix가 나오는지 확인해보셔도 좋습니다.





마무리



이번 시간에는 역행렬을 구하기 위한 Gauss-Jordan Elimination 알고리즘을 살펴보았습니다. 다음 포스팅에는  A=LU 분해를 설명드리겠습니다.

반응형
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그