이 글에서는 가우스-조던 소거법을 C++로 구현하는 방법을 소개합니다. 가우스-조던 소거법은 연립 선형 방정식을 풀기 위해 널리 사용되는 알고리즘으로, 행 연산(row operation)을 반복적으로 적용하여 방정식 계수 행렬을 대각행렬 형태로 변환합니다. 이렇게 하면 별도의 후처리 과정 없이 해를 직접 얻을 수 있다는 것이 큰 장점입니다.
알고리즘 개요
가우스-조던 소거법의 핵심 동작 과정은 다음과 같습니다.
시작
n = 입력 행렬의 크기
대각행렬의 원소를 찾는 과정:
j = 0부터 n까지, i = 0부터 n까지 중첩 반복문 실행
첫 번째 행과 첫 번째 열에 해당하는 원소를 1로 만들고,
첫 번째 열의 나머지 원소들은 모두 0으로 만든다.
마찬가지로 두 번째 행과 두 번째 열의 원소를 1로 만들고,
두 번째 열의 다른 원소들을 0으로 만드는 작업을 반복한다.
계산된 모든 해의 값을 출력한다.
끝C++ 예제 코드
아래 코드는 첨가행렬(augmented matrix)을 입력받아 가우스-조던 소거법을 수행하고, 각 변수의 해를 출력하는 완전한 프로그램입니다.
#include<iostream>
using namespace std;
int main() {
int i,j,k,n; // 변수와 행렬을 선언
float a[10][10],b,x[10];
printf("\n행렬의 크기를 입력하세요: ");
scanf("%d",&n);
printf("\n첨가행렬의 원소를 행 단위로 입력하세요:\n");
for(i=1; i<=n; i++) {
for(j=1; j<=(n+1); j++) {
cout << "A[" << i << ", " << j << " ]=";
cin >> a[i][j];
}
}
// 대각행렬의 원소를 구하는 부분
for(j=1; j<=n; j++) {
for(i=1; i<=n; i++) {
if(i!=j) {
b=a[i][j]/a[j][j];
for(k=1; k<=n+1; k++) {
a[i][k]=a[i][k]-b*a[j][k];
}
}
}
}
cout<<"\nThe solution is:\n";
for(i=1; i<=n; i++) {
x[i]=a[i][n+1]/a[i][i];
cout<<"x"<<i << "="<<x[i]<<" ";
}
return(0);
}코드 설명
프로그램의 주요 로직은 세 부분으로 나눌 수 있습니다.
- 입력 단계: 사용자로부터 행렬의 크기 n을 입력받은 뒤, n×(n+1) 크기의 첨가행렬 원소를 행 단위로 차례대로 입력받습니다.
- 소거 단계: 중첩 반복문을 사용하여 대각선 위치(i = j)를 제외한 모든 원소를 제거합니다. 각 단계에서 기준 행(pivot row)의 배수를 다른 행에서 빼주어 해당 열의 값을 0으로 만듭니다.
- 해 계산 단계: 대각화가 완료되면 각 행의 마지막 열(상수항)을 대각원소로 나누어 x₁, x₂, ..., xₙ의 해를 바로 구할 수 있습니다.
실행 결과
다음은 3×3 연립방정식에 대해 프로그램을 실행한 결과입니다.
Enter the size of matrix: 3 Enter the elements of augmented matrix row-wise: A[1, 1 ]=1 A[1, 2 ]=2 A[1, 3 ]=-4 A[1, 4 ]=2 A[2, 1 ]=7 A[2, 2 ]=6 A[2, 3 ]=-2 A[2, 4 ]=-5 A[3, 1 ]=0 A[3, 2 ]=-3 A[3, 3 ]=-5 A[3, 4 ]=-8 The solution is: x1=-2.89831 x2=2.5678 x3=0.059322
위 결과를 통해 세 개의 미지수에 대한 해가 정확하게 계산되었음을 확인할 수 있습니다. 실제 응용에서는 피벗(pivot)이 0이 되는 경우를 처리하기 위한 행 교환(row swapping) 기법을 추가하면 더 안정적인 프로그램을 만들 수 있습니다.