본문 바로가기

학습공간/수치해석, 확률과통계, 이산수학

[C언어 수치해석] Gauss Jordan 소거법 (연립방정식의 해)

반응형

[연립방정식의 해 미지수 n = 3개]

[Gauss 소거 + 후진 대입법]

 

미지수 3개인 연립방정식의 해 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <math.h>
#define Max_DIM 3
 
void printmatrix(float a[3][4], int n)
{
    int i,j;
    for(i = 1; i<=n; i++){
        printf("\n");
        for(j=1; j<=n+1; j++){
            printf("%f  ",a[i-1][j-1]);
        }
    }
}
 
main()
{
//    float a[Max_DIM][MAX_DIM+1];
 
    float a[3][4= {1,-1,3,4,
                    1,2,-2,10,
                    3,-1,5,14};
    float x[3= {000};
    float temp,tmp;
 
    int n=3,i,j,k,l;
 
//    printf("\nInput n =");
//    scanf("%d",&n);
/*
    for(i=1; i<=n; i++){                // 배열 요소 입력
        printf("\n");
        for(j=1; j<=n+1; j++){
            printf("Input a[%d][%d]",i,j);
            scanf("%f", &(a[i-1][j-1]));
        }
    }
*/
    printmatrix(a,n);                    // 보여주기
 
    for(k=1; k<=n; k++){    
        temp = a[k-1][k-1];
        if(temp == 0){    // 0일경우 행 교환
            for(j=k; j<=n+1; j++){
                for(l = k; l < n; l++){    // 다음행도 0이 아닐경우 교환
                    if(a[l][j-1!= 0){
                        tmp = a[k-1][j-1];
                        a[k-1][j-1= a[l][j-1];
                        a[k][j-1= tmp;
                        break;
                    }
                }
            }
            temp = a[k-1][k-1];    // 행 교환후 새 temp 설정
        }
        for(j=k; j<=n+1; j++){        //전반 계산
            a[k-1][j-1= a[k-1][j-1]/temp;
        }
        for(i=k+1; i<=n; i++){        //후반 계산        
            temp = a[i-1][k-1];
            for(j=k; j<=n+1; j++){
                a[i-1][j-1= a[i-1][j-1- temp*a[k-1][j-1];
            }
        }
        printf("\n");
        printmatrix(a,n);        // Gauss 소거 과정
    }
    x[n-1= a[n-1][n];
 
 
    for(k=n-1; k>=1; k--){            // 후진 대입법
        x[k-1= a[k-1][n];
        for(j= k+1; j<=n; j++){
            x[k-1= x[k-1- a[k-1][j-1]*x[j-1];
            a[k-1][j-1= 0;
        }
        a[k-1][n] = x[k-1];
        printf("\n");
        printmatrix(a,n);        // 후진 대입 소거 과정
    }
    printf("\n");
    for(k=1; k<=n; k++){            // x값 출력
        printf("\nx[%d] = %f",k, x[k-1]);
    }
    printf("\n");
}
cs

반응형