행렬식은 이미 여러 번 나왔습니다.
69강 문제 1에서 역행렬 공식의 분모가 였고, 그 값이 이면 역행렬이 없었습니다. 69강 문제 3의 가역 동치 조건 목록 마지막 줄이 이었습니다. 70강 심화 2에서 LU 분해로 계산했고, 77강에서 닮음 불변량으로 계속 언급했습니다.
그런데 정의를 하지 않았습니다. 매번 "78강에서"라고 미뤘습니다.
이 강의에서 정의를 세웁니다. 그런데 정의 방식이 여럿이라 어느 것을 고를지가 문제입니다.
| 방식 | 형태 |
|---|---|
| 명시적 공식 | \sum_{\sigma}\operatorname{sgn}(\sigma)\prod a_ |
| 여인수 전개 | 재귀적으로 정의 |
| 공리 | 세 성질을 만족하는 유일한 함수 |
이 강의는 세 번째를 씁니다. 성질을 먼저 요구하면 계산법이 따라 나오고, 79강의 기하적 의미와도 자연스럽게 이어지기 때문입니다.
그리고 계산은 소거로 합니다. 정의대로 계산하면 개의 항이 나오는데, 소거를 쓰면 입니다. 에서 그 차이가 대 입니다.
문제. 다음을 계산하세요.
(1) 공식을 쓰세요.
(2) 을 첫 행으로 전개하세요.
(3) 전개의 부호 규칙을 정리하세요.
생각의 실마리. (2)에서 각 성분에 그 행과 열을 지운 행렬식을 곱하고 부호를 붙여 더합니다. 부호가 왜 번갈아 나오는지는 문제 2의 성질에서 설명됩니다.
풀이. (1) 입니다. 검산에서 확인됩니다.
(2) 첫 행으로 전개합니다.
검산에서 입니다.
(3) 부호는 자리에 따라 정해집니다.
자리의 부호가 입니다.
이 문제에서 배우는 것: 여인수 전개.
여인수 전개. 를 행과 열을 지운 소행렬식이라 하고 를 여인수라 하면
이고 열로 전개해도 같습니다.
어느 행이나 열로 해도 같다는 점이 유용합니다. 이 많은 줄을 고르면 계산이 줄어듭니다.
의 셋째 행에 이 있으므로 그것으로 전개하면 항이 두 개입니다.
같은 값입니다.
에는 사뤼스 방법이라는 요령도 있습니다. 대각선 방향으로 곱해 더하고 반대 방향으로 곱해 뺍니다.
에서만 통합니다. 이상에는 이런 대각선 규칙이 없습니다.
여인수 전개를 실제 계산에 쓰면 안 됩니다. 에 대해 이므로 규모입니다. 심화 1에서 비용을 재고 문제 3에서 실용적인 방법을 세웁니다.
바로 확인 1.
확인 1-1. 행렬식 공식을 쓰세요.
답. 입니다.
확인 1-2. 여인수의 부호 규칙을 쓰세요.
답. 자리가 입니다.
확인 1-3. 전개할 줄을 고르는 요령을 쓰세요.
답. 이 많은 행이나 열을 고릅니다.
문제. 을 봅니다. 입니다.
(1) 두 행을 바꾸면 어떻게 됩니까?
(2) 한 행을 배 하면 어떻게 됩니까?
(3) 한 행에 다른 행의 배수를 더하면 어떻게 됩니까?
생각의 실마리. 67강의 세 가지 행 연산에 대해 행렬식이 어떻게 반응하는지 보는 문제입니다. 소거로 계산하려면 이 반응을 알아야 합니다.
풀이. 검산에서 계산합니다.
(1) 첫 두 행을 바꾸면 입니다. 부호가 바뀝니다.
(2) 첫 행을 배 하면 입니다. 배가 됩니다.
(3) 셋째 행에서 첫 행의 배를 빼면 입니다. 변하지 않습니다.
또 하나 확인합니다. 둘째 행을 첫 행과 같게 만들면 입니다.
이 문제에서 배우는 것: 행렬식을 결정하는 세 성질.
정의(공리적). 은 다음 셋을 만족하는 유일한 함수입니다.
성질 내용 교대성 두 행을 바꾸면 부호가 바뀝니다 다중선형성 각 행에 대해 선형입니다 정규화
**"각 행에 대해 선형"**의 뜻은 다른 행을 고정하고 한 행만 볼 때 선형이라는 것입니다.
전체에 대해 선형이 아니라는 점을 조심해야 합니다. 이지 가 아닙니다. 행이 개이고 각각에서 가 나오기 때문입니다.
세 성질에서 나머지가 모두 따라옵니다.
두 행이 같으면 입니다. 그 두 행을 바꾸면 같은 행렬인데 부호가 바뀌므로 이고 따라서 입니다.
한 행에 다른 행의 배수를 더해도 변하지 않습니다. 다중선형성으로 쪼개면
인데 둘째 항은 가 두 번 나오므로 입니다.
영행이 있으면 입니다. 그 행에 을 곱한 것으로 보면 입니다.
행 연산에 대한 반응을 정리합니다.
| 연산 | 행렬식 |
|---|---|
| R_{i}\leftrightarrow R_ | |
| R_{i}\to cR_ | |
| R_{i}\to R_{i}+cR_ | 변화 없음 |
셋째 줄이 결정적입니다. 소거에서 가장 많이 쓰는 연산인데 행렬식을 바꾸지 않으므로, 소거로 계산할 수 있습니다. 문제 3의 근거입니다.
바로 확인 2.
확인 2-1. 행렬식을 결정하는 세 성질을 쓰세요.
답. 교대성, 각 행에 대한 선형성, 입니다.
확인 2-2. 두 행이 같으면 행렬식이 무엇입니까?
답. 입니다.
확인 2-3. 를 로 쓰세요.
답. 입니다.
문제. 소거로 행렬식을 계산합니다.
(1) 절차를 세우세요.
(2) 에 적용하세요.
(3) 특이행렬에서는 어떻게 됩니까?
생각의 실마리. 문제 2에서 덧셈 연산은 행렬식을 바꾸지 않고 교환은 부호만 바꿉니다. 그러면 소거해서 삼각으로 만든 뒤 대각을 곱하면 됩니다.
풀이. (1) 절차입니다.
왜 삼각에서 대각의 곱인가. 위삼각행렬을 첫 열로 전개하면 첫 성분만 남고, 그것이 재귀적으로 반복됩니다. 또는 소거를 더 진행해 대각행렬로 만든 뒤 각 행을 로 나누면 가 되므로, 정규화 성질에서 곱이 됩니다.
(2) 검산에서 으로 문제 1과 같습니다.
무작위 행렬 세 개에서도 np.linalg.det와 소수 열째 자리까지 일치합니다.
| 소거 | 라이브러리 | |
|---|---|---|
(3) 소거 도중 어느 열이 통째로 이 되면 피벗을 세울 수 없고, 그때 입니다.
검산에서 계수가 인 행렬의 행렬식이 입니다.
이 문제에서 배우는 것: 소거가 표준 계산법입니다.
계산법. 이면
이며 는 행 교환 횟수입니다.
70강 심화 2에서 이미 얻은 결과인데, 이제 근거가 생겼습니다. 거기서는 곱셈 성질을 미리 썼고 여기서는 세 성질에서 직접 따라옵니다.
계산량을 비교합니다.
| 방법 | 계산량 | |
|---|---|---|
| 정의 (순열) | 4.623\times10^ | |
| 여인수 전개 | 같은 수준 | |
| 소거 | 2.667\times10^ |
검산에서 세 크기에 대해 확인합니다. 에서 배 차이입니다.
67강 심화 3의 크라메르 공식, 69강 문제 5의 역행렬에 이어 세 번째로 같은 교훈입니다.
행렬식이 인지 판정할 때의 주의도 짚어 둡니다. 부동소수점에서 정확히 이 나오는 일은 드물고, 아주 작은 값이 나옵니다. 그것을 으로 볼지는 문턱 문제이며, 72강 심화 4에서 본 대로 계수 판정에는 특이값을 쓰는 편이 안전합니다.
이어도 가 잘 조건된 행렬일 수 있습니다. 예를 들어 이면 인데 조건수는 입니다. 행렬식의 크기는 가역성의 척도가 아닙니다.
바로 확인 3.
확인 3-1. 소거로 행렬식을 구하는 식을 쓰세요.
답. 에 피벗들의 곱을 곱합니다.
확인 3-2. 소거와 여인수 전개의 계산량을 비교하세요.
답. 과 입니다.
확인 3-3. 가역 판정에 행렬식을 쓰지 말아야 하는 이유를 쓰세요.
답. 크기가 조건수와 무관하므로 문턱 판정이 위험합니다.
문제. 무작위 행렬 에 대해 다음을 확인하세요.
(1) 와
(2) 와
(3) 과
생각의 실마리. (1)이 가장 중요한 성질이며, 79강에서 기하로 설명됩니다. 부피 배율을 두 번 적용하면 배율이 곱해진다는 것입니다.
풀이. 검산에서 확인합니다.
(1) 이고 도 같습니다.
(2) 입니다.
(3) 이고, 입니다.
이 문제에서 배우는 것: 행렬식의 성질.
성질 식 곱 전치 역 스칼라 거듭제곱 \det(A^{k})=(\det A)^ 닮음
곱셈 성질의 증명을 봅니다. 가 특이하면 도 특이하므로 양변이 입니다. 가 가역이면 69강 문제 2에서 기본행렬의 곱이므로, 기본행렬 하나에 대해 확인하고 곱으로 확장하면 됩니다.
| 기본행렬 | ||
|---|---|---|
| 교환 | ||
| 배 | ||
| 덧셈 |
세 줄 모두 와 일치하며, 이것이 문제 2의 성질 그대로입니다.
전치 성질은 여인수 전개를 행으로 하나 열로 하나 같다는 사실에서 나옵니다. 그러면 열에 대해서도 문제 2의 세 성질이 성립하므로, 열 연산으로 계산해도 됩니다.
역의 성질은 에 곱셈 성질을 적용하면 즉시 나옵니다.
여기서 가역 판정이 나옵니다. 가 가역이면 이어야 합니다. 역도 성립하므로
69강 문제 3의 목록 마지막 줄이 이제 증명되었습니다.
닮음 불변성도 곱셈 성질에서 나옵니다.
77강에서 불변량으로 쓴 근거입니다.
주의할 것이 하나 있습니다. 덧셈에는 좋은 공식이 없습니다.
에서 왼쪽이 이고 오른쪽이 입니다. 69강 문제 4에서 역행렬도 덧셈과 안 어울렸는데 같은 상황입니다.
바로 확인 4.
확인 4-1. 를 쓰세요.
답. 입니다.
확인 4-2. 을 쓰세요.
답. 입니다.
확인 4-3. 입니까?
답. 아닙니다. 에서 입니다.
문제. 다음을 계산하세요.
(1) 의 행렬식을 구하세요.
(2) 블록 삼각행렬의 행렬식을 추측하세요.
(3) 확인하세요.
생각의 실마리. (1)에서 첫 열로 전개하면 한 항만 남고, 그것이 반복됩니다.
풀이. (1) 대각의 곱입니다.
검산에서 확인됩니다.
(2) 블록으로도 같은 규칙이 성립하리라 추측합니다.
(3) 검산에서 , 일 때 양변이 모두 입니다.
이고 이므로 곱이 입니다.
이 문제에서 배우는 것: 구조를 이용합니다.
특별한 행렬식.
형태 행렬식 삼각 (위·아래) 대각의 곱 대각 대각의 곱 블록 삼각 직교행렬 순열행렬 (-1)^
넷째 줄을 확인해 봅니다. 에 곱셈과 전치 성질을 쓰면
이므로 입니다. **회전이면 이고 반사가 섞이면 **이며, 79강에서 방향의 뜻으로 설명됩니다.
블록 삼각의 증명은 70강 심화 5의 블록 LU를 쓰면 됩니다.
이고 각각의 행렬식이 와 입니다.
왼쪽 아래가 이 아니면 성립하지 않습니다.
이런 공식은 없습니다. 대신 69강 심화 3의 슈어 보수로
입니다. 블록을 성분처럼 다루되 순서를 지켜야 하며, 가 가역이어야 합니다.
실무적 의미도 짚습니다. 큰 행렬이 블록 구조를 가지면 행렬식 계산이 작은 조각으로 분해됩니다. 특히 블록 대각이면 완전히 분리됩니다.
확률 모형에서 변수들이 독립이면 공분산이 블록 대각이 되고, 우도 계산의 로그행렬식이 각 블록의 합으로 갈립니다.
바로 확인 5.
확인 5-1. 삼각행렬의 행렬식을 쓰세요.
답. 대각 성분의 곱입니다.
확인 5-2. 직교행렬의 행렬식을 쓰세요.
답. 입니다.
확인 5-3. 블록 삼각에서 왼쪽 아래가 이 아니면 어떻게 합니까?
답. 슈어 보수를 써서 로 계산합니다.
| 계산 | 방법 |
|---|---|
| 여인수 전개 또는 사뤼스 | |
| 일반 | 소거해서 (-1)^{s}\prod u_ |
| 삼각 | 대각의 곱 |
| 블록 삼각 |
| 세 성질 | 내용 |
|---|---|
| 교대성 | 행 교환에 부호가 바뀝니다 |
| 다중선형성 | 각 행에 대해 선형입니다 |
| 정규화 |
| 행 연산 | 반응 |
|---|---|
| 교환 | |
| 배 | |
| 배수 더하기 | 변화 없음 |
| 성질 | 식 |
|---|---|
| 곱 | |
| 전치 | |
| 역 | |
| 스칼라 | |
| 닮음 | |
| 가역 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 입니다 | |
| 성립하지 않습니다 | |
| 여인수 전개로 큰 행렬을 계산합니다 | 소거를 씁니다 |
| 의 크기로 가역성을 판단합니다 | 조건수를 봅니다 |
문제 6. 의 행렬식을 구하세요.
답. 입니다.
문제 7. 여인수의 부호 규칙을 쓰세요.
답. 자리가 입니다.
문제 8. 행렬식을 결정하는 세 성질을 쓰세요.
답. 교대성, 각 행에 대한 선형성, 입니다.
문제 9. 두 행이 같으면 행렬식이 얼마입니까?
답. 입니다.
문제 10. 소거에서 어느 연산이 행렬식을 바꾸지 않습니까?
답. 한 행에 다른 행의 배수를 더하는 연산입니다.
문제 11. 소거로 행렬식을 구하는 식을 쓰세요.
답. 입니다.
문제 12. 를 쓰세요.
답. 입니다.
문제 13. 가 일 때 를 로 쓰세요.
답. 입니다.
문제 14. 을 쓰세요.
답. 입니다.
문제 15. 가역 조건을 행렬식으로 쓰세요.
답. 입니다.
문제 16. 직교행렬의 행렬식을 쓰고 근거를 쓰세요.
답. 입니다. 입니다.
문제 17. 의 행렬식을 쓰세요.
답. 입니다.
문제 18. 여인수 전개의 계산량이 왜 문제입니까?
답. 이라 이 조금만 커져도 불가능합니다.
심화 1. 행렬식의 명시적 공식을 세우고 세 성질에서 유일함을 논하세요.
풀이. 다중선형성을 반복 적용하면 명시적 공식이 나옵니다.
각 행을 표준기저로 전개합니다.
다중선형성으로 모두 펼치면 개의 항이 나오는데, **두 행이 같은 기저벡터를 고른 항은 **입니다(문제 2). 살아남는 것은 각 행이 서로 다른 열을 고른 경우이며, 그것이 순열입니다.
여기서 는 그 순열을 만드는 데 필요한 교환 횟수의 부호이며, 교대성에서 나옵니다.
항의 개수가 입니다. 이면 개입니다.
에서 확인합니다. 순열이 두 개(와 교환)이므로
이면 여섯 개이고, 문제 1의 사뤼스 공식이 정확히 그 여섯 항입니다.
유일성도 이 유도에서 나옵니다. 세 성질을 만족하는 함수라면 위 전개를 거쳐 같은 식에 도달하므로, 그런 함수가 하나뿐입니다.
이 공식은 계산이 아니라 이론에 쓰입니다.
| 용도 | 내용 |
|---|---|
| 다항식임을 보임 | 성분의 다항식이므로 연속·미분 가능 |
| 정수 보존 | 성분이 정수면 행렬식도 정수 |
| 미분 계산 | 야코비 공식 |
| 조합론적 해석 | 순열과 부호의 구조 |
둘째 줄이 유용합니다. 정수 행렬의 행렬식이 이면 역행렬도 정수 행렬입니다. 격자와 암호에서 쓰입니다.
셋째 줄은 최적화에서 로그행렬식을 미분할 때 필요하며, 확률 모형의 학습에 나옵니다.
심화 2. 크라메르 공식과 여인수 행렬을 유도하고 그 용도를 정하세요.
풀이. 67강 심화 3에서 크라메르 공식을 언급하고 계산에 쓰지 않는다고 했습니다. 여기서 유도합니다.
여인수 행렬. 를 성분이 인 행렬(여인수의 전치)이라 하면
증명의 착상은 이렇습니다. 성분은 로 여인수 전개입니다. 성분()은 인데, 이것은 번째 행을 번째 행으로 바꾼 행렬의 전개입니다. 그 행렬은 두 행이 같으므로 입니다.
따라서 이면
에서 확인합니다.
69강 문제 1의 공식 그대로입니다.
크라메르 공식. 에서 이므로
이고 는 번째 열을 로 바꾼 행렬입니다.
용도를 정합니다.
| 목적 | 크라메르를 쓰는가 |
|---|---|
| 큰 계 풀기 | 아닙니다 (소거) |
| 손계산 | 쓸 만합니다 |
| 해의 계수 의존성 미분 | 예 |
| 정수 해 판정 | 예 |
| 이론 증명 | 예 |
셋째 줄이 중요합니다. 해가 계수의 유리함수로 명시되므로 미분할 수 있고, 민감도 분석에 쓰입니다. 계산이 아니라 구조를 아는 데 값이 있습니다.
넷째 줄도 실용적입니다. 이고 성분이 정수면 해도 정수입니다.
심화 3. 행렬식이 에 가까울 때의 위험을 논하고 대안을 제시하세요.
풀이. 문제 3에서 가역 판정에 행렬식을 쓰지 말라고 했습니다. 이유를 정리합니다.
첫째, 크기 조절에 민감합니다.
이고 이면 입니다. **거의 처럼 보이지만 조건수는 **이며, 이 행렬은 완벽하게 잘 조건되어 있습니다.
반대도 있습니다.
이면 행렬식이 작지 않아 보이는데, 조건수는 약 으로 나쁩니다.
행렬식은 크기에 제곱으로 반응하고 조건수는 그렇지 않습니다.
둘째, 넘침과 밑넘침이 납니다. 검산에서 행렬의 행렬식이 inf로 나옵니다. 대각이 정도이면 곱이 규모라 배정밀도의 한계 을 넘습니다.
대안이 있습니다.
같은 행렬에서 부호가 이고 로그가 입니다. 곱 대신 로그의 합을 계산하므로 넘치지 않습니다.
69강 심화 6과 70강 심화 2에서 예고한 방법입니다. 확률 모형의 로그우도에 행렬식이 나오는데, 실무에서는 언제나 이 형태로 계산합니다.
셋째, 가역 판정에는 특이값을 씁니다.
| 판정 도구 | 쓰는 곳 |
|---|---|
| 이론, 작은 손계산 | |
| \sigma_ | 얼마나 특이에 가까운가 |
| \kappa=\sigma_{\max}/\sigma_ | 계산이 얼마나 위험한가 |
matrix_rank |
수치적 계수 |
91강에서 조건수를 정식으로 다룹니다. 지금 알아 둘 것은 "이 작다"와 "특이에 가깝다"가 다른 말이라는 점입니다.
심화 4. 행렬식이 다른 분야에서 어떻게 나타나는지 정리하세요.
풀이. 행렬식이 등장하는 자리를 모아 봅니다.
미적분: 야코비안입니다. 다변수 치환적분에서
가 부피의 국소 배율이며, 79강의 내용이 미분 수준에서 쓰인 것입니다. 50강의 일변수 치환적분에서 가 곱해진 것과 같은 구조입니다. 98강 이후 다변수 적분에서 다룹니다.
확률: 정규분포의 밀도입니다.
가 분포의 퍼진 정도를 잽니다. 로그우도를 계산할 때 가 나오며, 심화 3의 방법으로 계산합니다.
미분방정식: 론스키안입니다. 72강 심화 2에서 언급했습니다. 해들이 독립인지 판정합니다.
기하: 부피입니다. 65강의 스칼라 삼중곱이 행렬식이었고, 79강에서 일반화합니다.
그래프: 스패닝 트리 개수입니다. 키르히호프의 행렬-트리 정리에서 라플라시안의 여인수가 신장 트리의 개수를 줍니다. 정수 행렬의 행렬식이 조합적 개수를 세는 예입니다.
암호와 격자. 격자의 기본 영역 부피가 기저 행렬의 행렬식이며, 격자 기반 암호의 안전성 분석에 쓰입니다.
생성 모형. 정규화 흐름에서 변환의 야코비안 행렬식이 밀도 변환을 담당합니다. 계산을 싸게 하려고 삼각 구조를 강제하는데, 문제 5의 삼각 행렬식이 대각의 곱이기 때문입니다.
정리합니다.
| 분야 | 행렬식이 재는 것 |
|---|---|
| 미적분 | 부피의 국소 배율 |
| 확률 | 분포의 퍼짐 |
| 미분방정식 | 해의 독립성 |
| 기하 | 부피 |
| 조합론 | 개수 |
| 생성 모형 | 밀도 변환 인자 |
**공통점은 "배율"이나 "크기"**이며, 79강에서 그 기하적 정체를 밝힙니다.
심화 5. 행렬식이 성분에 대해 어떻게 변하는지 다루세요.
풀이. 심화 1에서 행렬식이 성분의 다항식임을 보았습니다. 그러면 미분할 수 있습니다.
한 성분에 대한 편미분. 여인수 전개 에서 는 행을 쓰지 않으므로 에 무관합니다. 따라서
여인수가 곧 편미분입니다. 이것을 행렬로 모으면
이고, 마지막 등호는 심화 2의 에서 나옵니다.
로그행렬식의 미분이 더 간단합니다.
이 공식이 실무에서 널리 쓰입니다. 가우스 모형의 로그우도에 가 있고, 그것을 에 대해 미분하면 이 나옵니다.
시간에 대한 미분도 있습니다. 가 가역이면
야코비 공식이라 합니다. 미분방정식 의 해가 부피를 어떻게 바꾸는지 알려 주며,
이므로 대각합이 부피의 변화율입니다. 유체역학의 발산 정리, 해밀턴 역학의 리우빌 정리가 이 결과입니다.
대각합과 행렬식의 관계가 여기서 드러납니다. 77강에서 둘 다 닮음 불변량이라 했는데, 행렬식이 부피이고 대각합이 그 변화율입니다. 79강과 84강에서 다시 봅니다.
심화 6. 행렬식이 필요 없어지는 자리들을 정리하세요.
풀이. 행렬식은 이론적으로 중요하지만 실제 계산에서 쓰이는 곳이 좁습니다. 무엇으로 대체되는지 봅니다.
가역 판정. 대신 조건수나 수치적 계수를 봅니다. 심화 3의 내용입니다.
연립방정식. 크라메르 대신 소거나 LU를 씁니다. 67강 심화 3입니다.
역행렬. 여인수 공식 대신 가우스-조던이나 분해를 씁니다. 69강 문제 5입니다.
고유값. 특성다항식 을 푸는 것이 정의인데, 실제로는 그렇게 계산하지 않습니다. 다항식의 근을 구하는 것이 수치적으로 불안정하기 때문입니다. QR 알고리즘 같은 반복법을 쓰며, 84강에서 다룹니다.
부피와 넓이. 기하 계산에서는 여전히 행렬식을 쓰지만, 차원이 크면 로그로 다룹니다.
그러면 행렬식은 어디에 남습니까.
| 자리 | 이유 |
|---|---|
| 이론 증명 | 가역과 독립을 잇는 다리 |
| 작은 손계산 | , |
| 기하적 해석 | 부피 배율 (79강) |
| 확률 밀도 | 정규화 상수 |
| 미분 공식 | 야코비안, 로그행렬식의 그래디언트 |
**"계산하지 않지만 알아야 하는 개념"**의 대표입니다. 크라메르 공식이나 여인수 공식을 외우는 것보다, 행렬식이 무엇을 재는지 아는 것이 훨씬 유용합니다.
79강에서 그 답을 봅니다. 행렬식은 변환이 부피를 몇 배로 만드는가이며, 그것을 알면 위의 성질들이 왜 그런지 기하적으로 설명됩니다.
| 성질 | 기하적 이유 |
|---|---|
| 배율을 두 번 적용하면 곱해집니다 | |
| 이면 특이 | 부피가 뭉개집니다 |
| 아무것도 안 하면 배율이 | |
| 부호 | 방향이 뒤집히는지 |
이 강의에서는 numpy만 씁니다. 소거로 행렬식을 직접 구현해 라이브러리와 맞추고, 세 성질과 연산 규칙을 확인하며, 넘침 문제와 그 대안을 봅니다. 행렬식은 정의가 여럿이므로 서로 다른 방법이 같은 값을 주는지 확인하는 것이 유효합니다.
import numpy as np, math
def det_lu(A):
"""부분 피벗팅 소거로 행렬식을 계산합니다 (부호 포함)."""
U = A.astype(float).copy(); n = U.shape[0]; sign = 1.0
for k in range(n):
j = k + int(np.argmax(np.abs(U[k:,k])))
if abs(U[j,k]) < 1e-14: return 0.0
if j != k: U[[k,j]] = U[[j,k]]; sign = -sign
for i in range(k+1, n):
U[i] -= (U[i,k]/U[k,k]) * U[k]
return float(sign * np.prod(np.diag(U)))
# --- 문제 1: 손계산과 맞춥니다 -------------------------------------------
A2 = np.array([[3.,1.],[5.,2.]])
print(float(A2[0,0]*A2[1,1] - A2[0,1]*A2[1,0]), "%.10f" % float(np.linalg.det(A2)))
# 1.0 1.0000000000
A3 = np.array([[2.,-1.,3.],[1.,4.,-2.],[0.,3.,1.]])
sar = 2*(4*1-(-2)*3) - (-1)*(1*1-(-2)*0) + 3*(1*3-4*0) # 여인수 전개
print(float(sar), "%.10f" % float(np.linalg.det(A3))) # 30.0 30.0000000000
# --- 문제 2: 행 연산에 대한 반응 -----------------------------------------
M = np.array([[1.,2.,0.],[0.,3.,1.],[2.,1.,4.]])
print("%.10f" % float(np.linalg.det(M))) # 15.0000000000
M2 = M.copy(); M2[[0,1]] = M2[[1,0]]
print("%.10f" % float(np.linalg.det(M2))) # -15.0000000000 (교환)
M3 = M.copy(); M3[0] = 5*M3[0]
print("%.10f" % float(np.linalg.det(M3))) # 75.0000000000 (5배)
M4 = M.copy(); M4[2] = M4[2] - 2*M4[0]
print("%.10f" % float(np.linalg.det(M4))) # 15.0000000000 (불변)
M5 = M.copy(); M5[1] = M5[0]
print("%.10f" % float(np.linalg.det(M5))) # 0.0000000000 (두 행이 같음)
# --- 문제 3: 소거로 계산합니다 -------------------------------------------
print("%.10f %.10f" % (det_lu(A3), np.linalg.det(A3))) # 30.0000000000 30.0000000000
rng = np.random.default_rng(21)
for n in [4, 6, 8]:
X = rng.standard_normal((n,n))
print(n, "%.10f %.10f" % (det_lu(X), np.linalg.det(X)))
# 4 3.7847517123 3.7847517123
# 6 0.5799071506 0.5799071506
# 8 0.4366674172 0.4366674172
Sg = np.array([[1.,2.,3.],[2.,4.,6.],[1.,1.,1.]]) # 둘째 행 = 첫째의 2배
print("%.10f" % det_lu(Sg), int(np.linalg.matrix_rank(Sg))) # 0.0000000000 2
# --- 문제 4: 연산 규칙 ---------------------------------------------------
P = rng.standard_normal((4,4)); Q = rng.standard_normal((4,4))
print("%.8f %.8f" % (np.linalg.det(P@Q), np.linalg.det(P)*np.linalg.det(Q)))
# -6.63886336 -6.63886336
print("%.8f %.8f" % (np.linalg.det(P.T), np.linalg.det(P)))
# 1.80899420 1.80899420
print("%.8f %.8f" % (np.linalg.det(np.linalg.inv(P)), 1/np.linalg.det(P)))
# 0.55279337 0.55279337
print("%.8f %.8f" % (np.linalg.det(3*P), 3**4*np.linalg.det(P)))
# 146.52853058 146.52853058 <- 3배가 아니라 3^4 배입니다
# --- 문제 5: 삼각과 블록 -------------------------------------------------
T = np.array([[2.,7.,-1.,5.],[0.,3.,4.,0.],[0.,0.,-1.,2.],[0.,0.,0.,6.]])
print("%.8f %.8f" % (np.linalg.det(T), np.prod(np.diag(T)))) # -36.00000000 -36.00000000
Ab = np.array([[1.,2.],[3.,4.]]); Db = np.array([[5.,6.],[7.,8.]])
Bl = np.block([[Ab, np.array([[1.],[2.]])@np.array([[1.,1.]])],
[np.zeros((2,2)), Db]])
print("%.8f %.8f" % (np.linalg.det(Bl), np.linalg.det(Ab)*np.linalg.det(Db)))
# 4.00000000 4.00000000
# --- 심화 1: 정의대로 세면 n! 개입니다 -----------------------------------
for n in [10, 15, 20]:
print(n, "%.3e %.3e" % (math.factorial(n)*(n-1), n**3/3))
# 10 3.266e+07 3.333e+02
# 15 1.831e+13 1.125e+03
# 20 4.623e+19 2.667e+03
# --- 심화 3: 큰 행렬식은 넘칩니다 ----------------------------------------
H = np.eye(200)*100.0 + np.full((200,200), 0.1) - np.eye(200)*0.1
sign, logdet = np.linalg.slogdet(H)
print(float(sign), "%.6f" % logdet, float(np.linalg.det(H)))
# 1.0 921.016426 inf <- det 은 넘치고 slogdet 은 멀쩡합니다
실행하면 주석과 같은 값이 나옵니다. 다섯 곳을 짚어 둡니다.
첫째, 손으로 한 여인수 전개가 라이브러리와 정확히 맞습니다. 에서 입니다.
둘째, 행 연산의 반응이 문제 2의 표 그대로입니다. 교환은 부호를 뒤집고, 배는 배로 만들고, 배수 더하기는 아무것도 바꾸지 않습니다. 두 행이 같아지면 입니다.
셋째, 직접 구현한 소거가 무작위 행렬 세 개에서 소수 열째 자리까지 라이브러리와 일치합니다. 특이행렬에서는 이 나오고 계수가 입니다.
넷째, 네 규칙이 모두 확인되는데 마지막이 눈에 띕니다. 가 가 아니라 입니다. 과 의 차이로 실수하기 쉬운 지점입니다.
다섯째가 이 강의의 실무적 결론입니다. 행렬에서 det가 inf를 반환합니다. 행렬식 자체가 배정밀도로 표현되지 않기 때문입니다. slogdet은 부호 과 로그 을 정확히 줍니다. 곱 대신 로그의 합을 계산하기 때문입니다.
코드로 할 수 없는 일도 분명히 해 둡니다. 행렬식이 세 성질로 유일하게 결정된다는 것은 예로 확인되지 않습니다. 심화 1의 유도가 그 자리를 맡습니다. 또 det_lu와 np.linalg.det가 일치하는 것은 둘 다 LU를 쓰기 때문이지 서로 독립적인 검증이 아닙니다. 문제 1에서 여인수 전개와 맞춰 본 것이 그나마 독립적인 확인입니다.
정답.
slogdet처럼 로그행렬식을 씁니다.| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 행렬식 | 세 성질로 정해집니다 | |
| M_ | 소행렬식 | 행 열을 지운 행렬식입니다 |
| C_ | 여인수 | 입니다 |
| 여인수 행렬 | 여인수의 전치입니다 | |
| 순열의 부호 | 교환 횟수의 홀짝입니다 | |
| 사뤼스 | Sarrus | 전용 요령입니다 |
| 크라메르 | Cramer | 해를 행렬식 비로 씁니다 |
| slogdet | 로그행렬식 | 넘침을 피합니다 |
| 야코비 공식 | Jacobi | 행렬식의 시간 미분입니다 |
다음 79강에서는 행렬식이 무엇을 재는지 밝힙니다. 답은 부피의 배율이며, 그러면 이 강의의 성질들이 모두 기하적으로 설명됩니다. 곱셈 성질은 배율의 합성이고, 은 차원이 뭉개지는 것이며, 부호는 방향이 뒤집히는지를 말합니다. 65강의 삼중곱이 그 특별한 경우였음도 드러납니다.