가우시안 소거법 (Gaussian Elimination)와 가우스-조던 소거법
선형 대수학의 핵심 알고리즘인 가우시안 소거법은 선형 방정식 시스템을 풀거나 행렬의 역행렬, 행렬식, 그리고 행렬의 계수(rank)를 계산하는 데 널리 사용됩니다. 이 방법은 독일의 수학자 카를 프리드리히 가우스(Carl Friedrich Gauss)의 이름을 따서 명명되었으며, 연립 방정식을 행 사다리꼴(Row Echelon Form) 또는 기약 행 사다리꼴(Reduced Row Echelon Form)로 변환하는 것을 목표로 합니다.
https://www.youtube.com/watch?v=L9fTll_vOxQ&pp=ygUT6rCA7Jqw7IqkIOyGjOqxsOuylQ%3D%3D
https://www.youtube.com/watch?v=Q1zCibRtI2A&pp=ygUT6rCA7Jqw7IqkIOyGjOqxsOuylQ%3D%3D
1. 기본 개념
가우시안 소거법은 행렬을 세 가지 기본 행 연산을 사용하여 변환합니다:
- 행 교환 (Row Swapping): 두 행의 순서를 바꿉니다.
- 행 스케일링 (Row Scaling): 한 행의 모든 원소를 0이 아닌 상수로 곱하거나 나눕니다.
- 행 덧셈 (Row Addition): 한 행에 다른 행의 상수 배를 더합니다.
이러한 연산을 통해 증강 행렬 [A | b]를 상삼각행렬(upper triangular matrix) 또는 계단형 행렬(row echelon form)로 변환하면, 역순 대입(Back Substitution)을 통해 해를 구할 수 있게 됩니다.
주요 목표: 연립 방정식을 아래와 같이 변환하여 미지수의 값을 쉽게 구하는 것입니다.
{a11x1+a12x2+…+a1nxn=b10⋅x1+a22x2+…+a2nxn=b2⋮0⋅x1+0⋅x2+…+annxn=bn⎧⎪ ⎪ ⎪⎨⎪ ⎪ ⎪⎩a11x1+a12x2+…+a1nxn=b10⋅x1+a22x2+…+a2nxn=b2⋮0⋅x1+0⋅x2+…+annxn=bn2. 알고리즘 단계
2.1 Forward Elimination (전진 소거)
첫 번째 단계에서는 증강 행렬의 각 열에서 피벗(pivot)을 선택하여, 해당 열 아래의 모든 원소들을 0으로 만듭니다. 피벗 선택 시 수치적 안정성을 위해 절댓값이 가장 큰 원소를 선택하는 부분 피벗법을 사용합니다.
for k = 1 to n-1:
// k번째 열의 피벗 선택 (부분 피벗법)
max_index = index of max(|A[i][k]|) for i = k to n
if max_index ≠ k:
swap rows k and max_index
// 피벗 아래 행의 원소 소거
for i = k+1 to n:
factor = A[i][k] / A[k][k]
for j = k to n:
A[i][j] = A[i][j] - factor * A[k][j]
b[i] = b[i] - factor * b[k]
이 과정을 거치면 증강 행렬은 상삼각 행렬 UU의 형태를 갖추게 됩니다.
2.2 Back Substitution (역순 대입)
상삼각 행렬이 완성되면, 마지막 행부터 시작하여 하나씩 미지수를 구합니다.
x[n] = b[n] / A[n][n]
for i = n-1 downto 1:
sum = 0
for j = i+1 to n:
sum += A[i][j] * x[j]
x[i] = (b[i] - sum) / A[i][i]

2.3 Gauss-Jordan Elimination (가우스-조던 소거법)
가우스-조던 소거법은 가우시안 소거법을 확장하여, 변환된 행렬을 기약 행 사다리꼴(Reduced Row Echelon Form)로 만듭니다. 이 과정에서는 각 피벗을 1로 만들고, 피벗이 있는 열의 다른 모든 원소를 0으로 만듭니다.
3. 예제와 단계별 과정
3.1 2x2 연립방정식 예제
간단한 2x2 연립방정식을 통해 기본 원리를 살펴봅니다.
주어진 연립방정식:
3x+2y=8,x−y=1.3x+2y=8,x−y=1.
Step 1: Forward Elimination
- 첫 번째 행의 피벗 선택: 첫 번째 행의 첫 번째 원소 33을 피벗으로 선택합니다.
- 두 번째 행 소거: 두 번째 행에서 첫 번째 행의 1313배를 빼서 xx 계수를 0으로 만듭니다.
결과 증강 행렬 (예시):
[32|8043|53][32|8043|53]Step 2: Back Substitution
- y=(5/3)(4/3)=54y=(5/3)(4/3)=54
- x=8−2y3=8−2⋅(5/4)3=8−2.53≈1.83x=8−2y3=8−2⋅(5/4)3=8−2.53≈1.83
3.2 3x3 연립방정식 예제
3개의 미지수를 포함한 연립방정식을 통해 보다 복잡한 과정을 살펴봅니다.
주어진 연립방정식:
2x+3y−z=5,4x+y+2z=6,−2x+5y+2z=7.2x+3y−z=5,4x+y+2z=6,−2x+5y+2z=7.
Step 1: 증강 행렬 작성
[23−1|5412|6−252|7]⎡⎢⎣23−1|5412|6−252|7⎤⎥⎦Step 2: Forward Elimination
- 첫 번째 행 피벗 사용: 첫 번째 행의 피벗 22를 기준으로 두 번째 행에는 4/2=24/2=2배, 세 번째 행에는 −2/2=−1−2/2=−1배를 적용하여 xx 계수를 소거합니다.
- 부분 피벗 적용: 필요시 행 교환을 통해 더 큰 피벗을 선택하여 수치적 안정성을 확보합니다.
이 과정을 거치면 증강 행렬은 상삼각 행렬의 형태가 됩니다.
Step 3: Back Substitution
x[3] = b[3] / A[3][3]
x[2] = (b[2] - A[2][3]*x[3]) / A[2][2]
x[1] = (b[1] - A[1][2]*x[2] - A[1][3]*x[3]) / A[1][1]
최종적으로 xx, yy, zz의 값을 구하여 연립방정식의 해를 얻습니다.
4. 응용 및 구현
4.1 역행렬 및 행렬식 계산
가우시안 소거법은 단순히 연립 방정식의 해를 구하는 데 그치지 않고, 다음과 같은 응용 분야에서도 사용됩니다:
- 역행렬 계산: 원래 행렬 AA와 단위 행렬 II를 나란히 배치한 증강 행렬 [A|I][A|I]에 가우스-조던 소거법을 적용하면, AA 부분이 단위 행렬로 변환되고 오른쪽 부분이 A−1A−1가 됩니다.
- 행렬식 계산: 행렬을 상삼각 행렬로 변환한 후, 대각선 원소의 곱을 계산하여 행렬식을 구할 수 있습니다. 단, 행 교환이 발생하면 행렬식의 부호가 반전됨에 주의해야 합니다.
4.2 선형 방정식의 해의 존재 및 유일성 판단
증강 행렬의 계수(rank)를 분석하면 연립 방정식이 해를 가지는지, 유일한 해가 존재하는지, 또는 무수히 많은 해나 해가 없는지를 판별할 수 있습니다.

5. 구현 시 고려사항 및 복잡도
컴퓨터로 가우시안 소거법을 구현할 때는 다음 사항들을 고려해야 합니다:
- 피벗 선택: 절댓값이 가장 큰 원소를 선택하는 부분 피벗팅 또는 완전 피벗팅 기법을 사용하여 수치적 불안정성을 최소화합니다.
- 반올림 오차: 부동 소수점 연산의 특성상 발생할 수 있는 반올림 오차를 관리하기 위해 적절한 정밀도 설정이 필요합니다.
- 계산 복잡도: n×nn×n 행렬에 대해 가우시안 소거법은 대략 O(n3)O(n3)의 연산량을 요구하므로, 매우 큰 시스템에서는 효율적인 알고리즘 개선이나 수치 해법 기법이 필요할 수 있습니다.
6. 결론
가우시안 소거법은 선형 대수학에서 가장 기본적이고 강력한 도구로, 연립 방정식의 해 구하기, 역행렬 및 행렬식 계산, 그리고 행렬의 계수 결정 등 다양한 응용 분야에서 핵심 역할을 합니다. 알고리즘의 각 단계—피벗 선택, 전진 소거, 역순 대입(및 필요시 기약 행 사다리꼴 변환)—을 명확히 이해하고, 수치적 안정성을 확보하기 위한 피벗 전략 및 반올림 오차 관리의 중요성을 인지하는 것이 필수적입니다.
예시
다음은 두 미지수 xx와 yy에 대한 연립방정식
{2x+3y=8(1)4x+y=9(2){2x+3y=8(1)4x+y=9(2)
에 대해 가우스 소거법을 적용한 예시 계산이다.
1. 첨가 행렬 작성
연립방정식을 첨가 행렬로 나타내면
[238419][238419]
이다.
2. 피봇 행 선택 및 소거
첫 번째 행의 첫 번째 원소 22를 피봇으로 선택한다. 두 번째 행의 xx 계수를 소거하기 위하여, 첫 번째 행을 2배한 후 두 번째 행에서 빼준다.
첫 번째 행을 2배하면
(2×2,2×3,2×8)=(4,6,16)(2×2,2×3,2×8)=(4,6,16)
이다.
두 번째 행에서 첫 번째 행의 2배를 빼면
(4,6,16)−(4,1,9)=(0,5,7)(4,6,16)−(4,1,9)=(0,5,7)
로, 새로운 두 번째 행은
[238057][238057]
이다.
3. 후진 대입법
두 번째 행은
5y=75y=7
이므로,
y=75y=75
이다.
첫 번째 행에 yy의 값을 대입하면
2x+3(75)=82x+3(75)=8
이다. 양변에서 3×75=2153×75=215를 빼면
2x=8−215=405−215=1952x=8−215=405−215=195
따라서,
x=1910x=1910
이다.
4. 최종 해
가우스 소거법을 통해 구한 해는
x=1910,y=75x=1910,y=75
이다.
다음은 세 미지수 xx, yy, zz에 대한 연립방정식
{x+2y+3z=9(1)2x+5y+2z=12(2)3x+y+z=8(3)⎧⎨⎩x+2y+3z=9(1)2x+5y+2z=12(2)3x+y+z=8(3)
에 대해 가우스 소거법을 적용한 예시 계산이다.
## 1. 첨가 행렬 작성
위 연립방정식을 첨가 행렬(augmented matrix)로 나타내면 다음과 같다.
[1239252123118]⎡⎢
⎢⎣1239252123118⎤⎥
⎥⎦
---
## 2. 가우스 소거 단계
### (1) 첫 번째 피봇: 11 (첫 번째 행의 첫 번째 원소)
- **목표**: 아래 행들의 xx 계수를 0으로 만든다.
1. 두 번째 행에서 첫 번째 행의 2배를 빼기
- 첫 번째 행을 2배: (2,4,6,18)(2,4,6,18)
- 두 번째 행에서 뺀다:
(2,5,2,12)−(2,4,6,18)=(0,1,−4,−6)(2,5,2,12)−(2,4,6,18)=(0,1,−4,−6)
2. 세 번째 행에서 첫 번째 행의 3배를 빼기
- 첫 번째 행을 3배: (3,6,9,27)(3,6,9,27)
- 세 번째 행에서 뺀다:
(3,1,1,8)−(3,6,9,27)=(0,−5,−8,−19)(3,1,1,8)−(3,6,9,27)=(0,−5,−8,−19)
- **변환 후 행렬**:
[123901−4−60−5−8−19]⎡⎢
⎢⎣123901−4−60−5−8−19⎤⎥
⎥⎦
---
### (2) 두 번째 피봇: 11 (두 번째 행의 두 번째 원소)
- **목표**: 세 번째 행의 yy 계수를 0으로 만든다.
1. 세 번째 행에 (두 번째 행의 5배)를 더하기
- 두 번째 행을 5배: (0,5,−20,−30)(0,5,−20,−30)
- 세 번째 행에서 더한다:
(0,−5,−8,−19)+(0,5,−20,−30)=(0,0,−28,−49)(0,−5,−8,−19)+(0,5,−20,−30)=(0,0,−28,−49)
- **변환 후 행렬**:
[123901−4−600−28−49]⎡⎢
⎢⎣123901−4−600−28−49⎤⎥
⎥⎦
---
### (3) 세 번째 피봇: −28−28 (세 번째 행의 세 번째 원소)
- 세 번째 행을 −28−28로 나누어 zz의 계수를 1로 만든다.
1−28(0,0,−28,−49)=(0,0,1,4928)1−28(0,0,−28,−49)=(0,0,1,4928)
- **변환 후 행렬**:
[123901−4−60014928]⎡⎢
⎢⎣123901−4−60014928⎤⎥
⎥⎦
여기서
z=4928=74z=4928=74
---
## 3. 해 구하기 (후진 대입)
### (1) z=74z=74
두 번째 행은
0x+1y−4z=−60x+1y−4z=−6
즉,
y−4(74)=−6y−7=−6y=1
### (2) y=1
첫 번째 행은
x+2y+3z=9
이므로,
x+2(1)+3(74)=9x+2+214=9x+84+214=9x+294=9x=9−294=364−294=74
---
## 4. 최종 해
x=74,y=1,z=74
이와 같이 가우스 소거법을 통해 단계적으로 계수를 소거하고, 후진 대입법을 사용해 해를 구할 수 있다.
'Tech > Coding' 카테고리의 다른 글
바이트배열을 이용한 에라토스테네스의 체와 그 업그레이드 버전 (0) | 2025.03.01 |
---|---|
에라스토테네스의 체 추가실험(로컬에서 실험) (0) | 2025.02.28 |
벨만 포드 알고리즘 (0) | 2025.02.24 |
에라토스테네스의 체 (0) | 2025.02.24 |
1836🐨트리의 가짓수 세기 .py (0) | 2025.02.23 |