칸 아카데미
1. 미적분학 기초
2. 확룰/통계학 기초
3. 선형대수학 기초

선형연립방정식 system of linear equations
동차 선형연립방정식/동차 선형방정식 시스템 homogeneous system of linear equations
계수행렬 : n개 방정식 계수값만 행렬로 따온 것
첨가행렬 augment() : 계수행렬 + n개 방정식 상수항을 행렬로 만든 것 (붙이기)

  • [Ab](Ax=b)[A⋮b] (Ax=b)

소거법 : 기본행연산(ERO)(add_multiple_of_row())을 n번 수행하여 변수를 소거하는 것
add_multiple_of_row() 1회 == 기본행렬
add_multiple_of_row() 2회 이상 == 그 외
치환행렬 : 곱하여 행렬의 행 교환의 역할을 수행하며, 단위행렬의 행들을 교환한 형태이다.
행 사다리꼴 row echelon form, REF

  • 1) 성분이 모두 0인 행이 있다면 그 행은 행렬 맨 아래에 존재할 것.
  • 2) 선행성분 leading entry : 각 행에 처음으로 나타나는 0이 아닌 성분 => 선행성분이 1일 것.
  • 3) i행과 그 다음 행 모두 선행성분 존재할 경우, i행의 선행성분은 그 다음 행의 것보다 좌측에 위치할 것.

기약 행 사다리꼴 reduced row echelon form, RREF .rref()

  • 1), 2), 3)
  • 4) 선행성분을 포함하는 의 선행성분 외의 모든 성분이 0일 것.

가우스 Gauss 소거법 : 선형연립방정식의 첨가행렬을 REF로 변형하여 푸는 방법.
가우스-조던 Gauss-Jordan 소거법 : 선형연립방정식의 첨가행렬을 RREF로 변형하여 푸는 방법.
행렬의 연산
행렬곱
전치행렬 transpose() : 정사각행렬을 (aᵢᵢ) 대각선을 중심으로 뒤집는다.
단위행렬 identity matrix InI_n: 정사각행렬 중 (aᵢᵢ) == 1, 그 외 성분은 0인 행렬.
가역 is_invertible() : 곱해서 단위행렬이 되는 행렬(역행렬)이 존재하는가?
역행렬 inverse() : 본행렬과 곱하여 단위행렬을 만드는 행렬.

add_multiple_of_row()elementary_matrix()의 용례

좋은 질문이야! SageMath에서 행 연산을 다룰 때 사용하는 add_multiple_of_row()elementary_matrix()비슷한 맥락의 도구이지만 용도와 반환값이 확연히 다르다는 점에서 중요한 차이가 있어. 아래에 깔끔하게 비교해줄게.


✅ 1. add_multiple_of_row(i, j, c)

🔧 행 연산을 직접 행렬에 적용하는 메서드

✔ 개요:

  • i번째 행에 j번째 행의 c배를 더하는 직접적인 행 연산
  • 원본 행렬을 **변형(mutate)**시킴

✔ 사용 예:

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]

✅ 2. elementary_matrix(n, i, j, c)

🧱 해당 행 연산을 표현하는 '초등 행렬'을 생성하는 함수

✔ 개요:

  • 특정 행 연산을 하나의 행렬로서 표현함 (행렬 곱으로 사용)
  • 원본 행렬은 건드리지 않고, 행 연산이 어떤 형태인지 행렬로 표현하고 싶을 때 사용

🧐 elementary_matrix()에서 첫 번째 인자 R의 역할

  • 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(A)=In=AA1RREF(A) = I_n = AA^{-1}
A1=RREF(In)∴ A^{-1} = RREF(I_n)

A=[211132100]A= \begin{bmatrix} 2 & 1 & 1 \\ 1 & 3 & 2 \\ 1 & 0 & 0 \end{bmatrix}
[100001010213001315]\begin{bmatrix} 1 & 0 & 0 & 0 & 0 & 1 \\ 0 & 1 & 0 & -2 & 1 & 3 \\ 0 & 0 & 1 & 3 & -1 & -5 \end{bmatrix}

위 행렬은 [AI][A \mid I] 에 가우스-조던 소거법(RREF)을 적용한 결과입니다.

  • 왼쪽 3×33 \times 3 부분은 완전히 항등행렬 II가 되었고,
  • 오른쪽 3×33 \times 3 부분은 원래 행렬 AA역행렬 A1A^{-1} 입니다.

즉,

[AI]RREF[IA1][A \mid I] \xrightarrow{\text{RREF}} [I \mid A^{-1}]

이므로 행렬 AA는 역행렬이 존재하는 가역 함수임을 알 수 있습니다.


🔄 역행렬 A1A^{-1}의 실제 값:

A1=[001213315]A^{-1} = \begin{bmatrix} 0 & 0 & 1 \\ -2 & 1 & 3 \\ 3 & -1 & -5 \end{bmatrix}

역행렬과 선형연립방정식

A=[a1,1a1,nan,1an,n],b=[b1bn]A = \begin{bmatrix} a_{1,1} & ⋯ & a_{1, n}\\ ⋮ & ⋱ & ⋮\\ a_{n,1} & ⋯ & a_{n, n} \end{bmatrix}, b = \begin{bmatrix} b_1 & ⋯ b_n \end{bmatrix}
A[x1xn]=b,A⋅\begin{bmatrix} x_1\\ ⋮\\ x_n \end{bmatrix} = b,

💡 RREF(A)=In=AA1RREF(A) = I_n = A⋅A^{-1} 💡

AA1[x1xn]=A1A[x1xn](교환법칙)=In[x1xn]=A1b,A⋅A^{-1}⋅\begin{bmatrix} x_1\\ ⋮\\ x_n \end{bmatrix} = A^{-1}⋅A⋅\begin{bmatrix} x_1\\ ⋮\\ x_n \end{bmatrix} (교환법칙)= I_n⋅ \begin{bmatrix} x_1\\ ⋮\\ x_n \end{bmatrix}= A^{-1}⋅b,
[x1xn]=A1b∴ \begin{bmatrix} x_1\\ ⋮\\ x_n \end{bmatrix} = A^{-1}⋅b

특수행렬

  • 대각선행렬 diagonal_matrix(): diag(a11,a22,,anna_{11}, a_{22}, ⋯, a_{nn}), (aii0)(a_{ii} ≠ 0)
  • 단위행렬 identity_matrix() InI_n
  • 스칼라 행렬 kInkI_n
  • 영행렬 matrix(n, m, 0)

(반)대칭행렬

  • 대칭행렬 : AT=AA^T = A인 정사각행렬
  • 반대칭행렬 : AT=AA^T = -A인 정사각행렬

상삼각행렬
하삼각행렬

LU분해

정삼각 행렬 AA를 하삼각 행렬 LL과 상삼각 행렬 UU의 곱으로 표현하는 것.

A=LUA = LU

1. 배경 요약:

너는 지금 Ax=bAx = b 문제를 푸는 과정에서 가우스 소거법을 통해 행렬 AA를 상삼각행렬 UU로 바꾸는 과정을 생각 중이야. 이때 일련의 행 연산들이 행렬 곱 형태로 표현될 수 있고, 그 행렬들을 E,E,...,EnE₁, E₂, ..., E_n 이라고 하자.

즉,

En...EEA=UE_n ... E₂ E₁ A = U

이 식을 정리하면:

(En...EE)A=U(E_n ... E₂ E₁) A = U

이제 양변에 AA의 좌측에 있는 행연산들의 곱 (En...E)(E_n ... E₁)역행렬을 곱하면:

A=(En...E)1UA = (E_n ... E₁)^{-1} U

이때 (En...E)1(E_n ... E₁)^{-1}L**L**이라고 정의하는 것이 바로 LU 분해의 개념이야.


2. 왜 (En...E1)1=L(E_n ... E_1)^{-1} = L인가?

아주 본질적인 질문이야. 요지는 다음과 같지:

"왜 (EnE1)1(E_n \cdots E_1)^{-1}형태가 하삼각행렬 LL이라는 걸 확신할 수 있는가?"

즉, 역행렬의 곱으로 만들어진 저 행렬이 진짜로 하삼각행렬인지, 그냥 우연히 그렇게 생긴 게 아닌지 알고 싶다는 거지.


🔑 답변 요약

우리가 사용하는 EiE_i들이 “앞에서 뒤로 가우스 소거”하는 데 사용된, 특별한 형태의 행 연산들만 쓰이기 때문에, 그 역행렬들을 곱한 결과는 항상 하삼각행렬이 된다.

즉, "역으로 소거 과정 전체를 재현"하면, 그것은 항상 하삼각 형태로 기록된다.


🔍 세부 설명

1. Elementary Row Operation = 특정한 종류의 행렬

가우스 소거법에서 우리가 사용하는 행 연산은 세 가지인데, LU 분해에서는 그중 하나만 써:

  • 행 교환 (X) → LU 분해에서는 안 씀 (없으면 A가 pivoting 없이 분해 가능할 때만 가능)
  • 행에 상수 곱 (X) → LU 분해에서도 안 씀
  • 다른 행에 상수배 덧셈 (✓)

즉, LU 분해에서는 아랫행에 윗행의 배를 빼서 0을 만든다는 특정한 연산만 반복함.

이 행 연산을 행렬로 표현하면, 단위행렬에 아래 삼각형에만 값이 있는 형태로 나타남. → 하삼각 행렬


2. 각 EiE_i가 갖는 구조

가우스 소거법에서 사용하는 기본 행연산(“행 jjlijl_{ij}배 행 ii를 빼기”)은

Eij  =  I    lijeiejTE_{ij} \;=\; I \;-\; l_{ij}\,e_i e_j^T

와 같이 표현되는데, 이 행렬은

  • 주대각성분 모두 11,
  • i>ji>j일 때 (i,j)(i,j) 위치에만 lij-l_{ij},
  • 나머지는 00

하삼각 행렬입니다.

예를 들어 3×3일 때,

E21=(100l2110001),E31=(100010l3101),E32=(1000100l321).E_{21}=\begin{pmatrix} 1&0&0\\ -l_{21}&1&0\\ 0&0&1 \end{pmatrix},\quad E_{31}=\begin{pmatrix} 1&0&0\\ 0&1&0\\ -l_{31}&0&1 \end{pmatrix},\quad E_{32}=\begin{pmatrix} 1&0&0\\ 0&1&0\\ 0&-l_{32}&1 \end{pmatrix}.

3. 곱과 역행렬의 성질

  1. 하삼각 행렬들의 곱은 다시 하삼각 행렬이 됩니다.
  2. 하삼각 행렬은 가역(invertible)하면 그 역행렬도 하삼각입니다.

따라서

EnE2E1E_n\cdots E_2\,E_1

는 하삼각, 그리고 그 역행렬

(EnE2E1)1\bigl(E_n\cdots E_2\,E_1\bigr)^{-1}

역시 하삼각이 됩니다.


요약

  1. 소거연산을 나타내는 EiE_i는 모두 “단위행렬 + (아래쪽에만) 한 줄 복사” 형태의 하삼각 행렬
  2. 하삼각 행렬들의 곱과 역행렬 역시 하삼각
  3. 그래서 (EnE1)1(E_n\cdots E_1)^{-1}이 곧 LL이고, 자연히 하삼각 모양이 보장된다.

이 구조 덕분에 A=LUA=LU 분해가 가능하고, 연립방정식도 Ly=bLy=b, Ux=yUx=y 순으로 깔끔히 풀 수 있는 거예요. any further?


치환과 반전
치환 permutarion, 순열, 순열 함수 Permutation(): 일대일 대응 함수 (y=f(x)y = f(x))
반전 inversion .inversions() .number_of_inversions(): 치환(yy) 값들 중, i<j,i,ji<j, i, j는 1 이상의 정수일 때, f(xi)>f(xj)f(x_i) > f(x_j)인 경우
짝치환 even permutation .is_even() : 반전이 짝수개 존재
홀치환 odd permutation : 반전이 홀수개 존재
부호화 함수 signature function
행렬식 .det() A,det(A)|A|, det(A)

  • nn차 정사각 행렬 A,BA, B에 대해 AB=AB|AB|= |A||B|가 성립한다.
profile
개발자

0개의 댓글