칸 아카데미
1. 미적분학 기초
2. 확룰/통계학 기초
3. 선형대수학 기초
선형연립방정식 system of linear equations
동차 선형연립방정식/동차 선형방정식 시스템 homogeneous system of linear equations
계수행렬 : n개 방정식 계수값만 행렬로 따온 것
첨가행렬 augment() : 계수행렬 + n개 방정식 상수항을 행렬로 만든 것 (붙이기)
소거법 : 기본행연산(ERO)(add_multiple_of_row())을 n번 수행하여 변수를 소거하는 것
add_multiple_of_row() 1회 == 기본행렬
add_multiple_of_row() 2회 이상 == 그 외
치환행렬 : 곱하여 행렬의 행 교환의 역할을 수행하며, 단위행렬의 행들을 교환한 형태이다.
행 사다리꼴 row echelon form, REF
기약 행 사다리꼴 reduced row echelon form, RREF .rref()
가우스 Gauss 소거법 : 선형연립방정식의 첨가행렬을 REF로 변형하여 푸는 방법.
가우스-조던 Gauss-Jordan 소거법 : 선형연립방정식의 첨가행렬을 RREF로 변형하여 푸는 방법.
행렬의 연산
행렬곱
전치행렬 transpose() : 정사각행렬을 (aᵢᵢ) 대각선을 중심으로 뒤집는다.
단위행렬 identity matrix : 정사각행렬 중 (aᵢᵢ) == 1, 그 외 성분은 0인 행렬.
가역 is_invertible() : 곱해서 단위행렬이 되는 행렬(역행렬)이 존재하는가?
역행렬 inverse() : 본행렬과 곱하여 단위행렬을 만드는 행렬.
add_multiple_of_row()와 elementary_matrix()의 용례좋은 질문이야! SageMath에서 행 연산을 다룰 때 사용하는 add_multiple_of_row()와 elementary_matrix()는 비슷한 맥락의 도구이지만 용도와 반환값이 확연히 다르다는 점에서 중요한 차이가 있어. 아래에 깔끔하게 비교해줄게.
add_multiple_of_row(i, j, c)🔧 행 연산을 직접 행렬에 적용하는 메서드
i번째 행에 j번째 행의 c배를 더하는 직접적인 행 연산A = Matrix(QQ, [[1, 2], [3, 4]])
A.add_multiple_of_row(1, 0, -3) # R1 ← R1 - 3*R0
# Before: [1 2]
# [3 4]
# After: [1 2]
# [0 -2]
elementary_matrix(n, i, j, c)🧱 해당 행 연산을 표현하는 '초등 행렬'을 생성하는 함수
R은 행렬의 스칼라 체계, 즉 어떤 숫자 체계를 사용할지 지정하는 것.
예:
QQ: 유리수 필드 ℚ (예: 1/2, -3/4)RR: 실수 필드 ℝ (부동소수점 실수)ZZ: 정수 링 ℤ (0, ±1, ±2, …)GF(p): 유한체 (예: 이진수 체계 등)R을 생략한다면?
scale 값으로 정수가 주어지면 ZZ, 실수가 주어지면 RR이 디폴트로 설정됨.E = elementary_matrix(QQ, 2, row1=1, row2=0, scale=-3)
A = Matrix(QQ, [[1, 2], [3, 4]])
result = E * A # 결과는 위의 add_multiple_of_row와 동일한 연산 효과
# E = 초등 행렬
# result = E * A == A.add_multiple_of_row(1, 0, -3) 의 결과와 같음
| 항목 | add_multiple_of_row() | elementary_matrix() |
|---|---|---|
| 목적 | 행 연산을 직접 적용 | 행 연산을 행렬로 표현 |
| 반환값 | 없음 (in-place 변경) | 초등 행렬 (Matrix 객체) |
| 적용 방법 | A.add_multiple_of_row(...) | E * A (행렬 곱으로 연산 효과) |
| 원본 변경 여부 | O (변형함) | X (행렬 그대로 유지) |
| 상황 | 추천 도구 |
|---|---|
| 연산을 직접 하고 싶을 때 (수작업) | add_multiple_of_row() |
| 행 연산을 행렬 형태로 저장하거나, 조합해서 분석하고 싶을 때 | elementary_matrix() |
A.add_multiple_of_row(i, j, c)==
A * elementary_matrix(QQ, 2, row1=i, row2=j, scale=c)
(QQ : 원소가 유리수임, 2 : 2*2 정사각 행렬임)
위 행렬은 에 가우스-조던 소거법(RREF)을 적용한 결과입니다.
즉,
이므로 행렬 는 역행렬이 존재하는 가역 함수임을 알 수 있습니다.
역행렬과 선형연립방정식
특수행렬
diagonal_matrix(): diag(), identity_matrix() matrix(n, m, 0)(반)대칭행렬
상삼각행렬
하삼각행렬
정삼각 행렬 를 하삼각 행렬 과 상삼각 행렬 의 곱으로 표현하는 것.
너는 지금 문제를 푸는 과정에서 가우스 소거법을 통해 행렬 를 상삼각행렬 로 바꾸는 과정을 생각 중이야. 이때 일련의 행 연산들이 행렬 곱 형태로 표현될 수 있고, 그 행렬들을 이라고 하자.
즉,
이 식을 정리하면:
이제 양변에 의 좌측에 있는 행연산들의 곱 의 역행렬을 곱하면:
이때 을 이라고 정의하는 것이 바로 LU 분해의 개념이야.
아주 본질적인 질문이야. 요지는 다음과 같지:
"왜 의 형태가 하삼각행렬 이라는 걸 확신할 수 있는가?"
즉, 역행렬의 곱으로 만들어진 저 행렬이 진짜로 하삼각행렬인지, 그냥 우연히 그렇게 생긴 게 아닌지 알고 싶다는 거지.
우리가 사용하는 들이 “앞에서 뒤로 가우스 소거”하는 데 사용된, 특별한 형태의 행 연산들만 쓰이기 때문에, 그 역행렬들을 곱한 결과는 항상 하삼각행렬이 된다.
가우스 소거법에서 우리가 사용하는 행 연산은 세 가지인데, LU 분해에서는 그중 하나만 써:
즉, LU 분해에서는 아랫행에 윗행의 배를 빼서 0을 만든다는 특정한 연산만 반복함.
이 행 연산을 행렬로 표현하면, 단위행렬에 아래 삼각형에만 값이 있는 형태로 나타남. → 하삼각 행렬
가우스 소거법에서 사용하는 기본 행연산(“행 에 배 행 를 빼기”)은
와 같이 표현되는데, 이 행렬은
인 하삼각 행렬입니다.
예를 들어 3×3일 때,
따라서
는 하삼각, 그리고 그 역행렬
역시 하삼각이 됩니다.
- 소거연산을 나타내는 는 모두 “단위행렬 + (아래쪽에만) 한 줄 복사” 형태의 하삼각 행렬
- 하삼각 행렬들의 곱과 역행렬 역시 하삼각
- 그래서 이 곧 이고, 자연히 하삼각 모양이 보장된다.
이 구조 덕분에 분해가 가능하고, 연립방정식도 , 순으로 깔끔히 풀 수 있는 거예요. any further?
치환과 반전
치환 permutarion, 순열, 순열 함수 Permutation(): 일대일 대응 함수 ()
반전 inversion .inversions() .number_of_inversions(): 치환() 값들 중, 는 1 이상의 정수일 때, 인 경우
짝치환 even permutation .is_even() : 반전이 짝수개 존재
홀치환 odd permutation : 반전이 홀수개 존재
부호화 함수 signature function
행렬식 .det()