Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 구현하는 가우스-조던 소거법(Gauss-Jordan Elimination) 프로그램

이 글에서는 가우스-조던 소거법을 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) 기법을 추가하면 더 안정적인 프로그램을 만들 수 있습니다.