변환이 부피를 얼마나 바꾸나
정방행렬의 행렬식은 그 변환이 길이·넓이·부피를 몇 배로 바꾸는지 압축한 숫자야.
- : 부피의 배율이야. 2면 두 배, 0.5면 절반이 돼.
- 부호: 양수면 방향성을 보존하고 음수면 거울처럼 방향성을 뒤집어.
- : 부피가 0으로 눌렸다는 뜻이야. 한 차원 이상을 잃었으므로 행렬은 특이하고 역행렬이 없어.
2×2 행렬 의 행렬식은 야. 공식은 작지만, 큰 행렬에서는 전개식으로 손계산하지 말고 검증된 선형대수 함수를 써.
이론 판정과 수치 계산은 다르다
정확한 수학에서는 와 가역성이 같은 조건이야. 하지만 부동소수점 코드에서 det(A) != 0로 가역성을 검사하는 건 좋지 않아. 반올림 때문에 0이어야 할 값이 아주 작게 나오거나, 차원과 스케일 때문에 행렬식이 넘치고 밑돌 수 있거든.
선형시스템은 먼저 solve로 풀고 오류를 처리해. 상태를 진단하려면 특이값이나 조건수 np.linalg.cond(A)를 보는 편이 낫고, 로그 행렬식이 필요하면 slogdet를 써. 행렬식의 절댓값이 작다는 사실만으로 수치 불안정을 단정할 수도 없어. 행렬 전체의 스케일에 따라 함께 작아질 수 있으니까.
어디에 쓰일까
- 두 벡터가 만드는 평행사변형의 넓이와 세 벡터가 만드는 평행육면체의 부피
- 좌표를 바꿀 때 밀도와 적분을 보정하는 야코비안 행렬식
- 확률모형에서 공분산행렬의 부피와 로그밀도를 계산하는 항
행렬식은 부피 배율을 말해 주는 기하학적 지문이야. 이론을 이해하는 데는 강력하지만, 수치 코드의 가역성 검사 버튼으로 쓰진 마.
한행이 다른행의 배수이면 singular 기 때문에 역행렬이 존재하지 않는다
import numpy as np
rng = np.random.default_rng(7) A = rng.standard_normal((3, 3)) print('A =') print(A) print('det(A) =', np.linalg.det(A))
B = np.array([[1., 2., 3.], [2., 4., 6.], [0., 1., 5.]]) print('B =') print(B) print('det(B) =', np.linalg.det(B))