본문 바로가기

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

[C언어 수치해석] Pivoting 전략 (연립방정식의 해)

반응형

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

[미지수 4개 연립방정식의 해]

 

미지수 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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdio.h>
#include <math.h>
#define Max_DIM 3
 
void printmatrix(double 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]);
        }
    }
}
 
double Max2(double a, double b)
{
    if(a>=b)
        return a;
    else
        return b;
}
main()
{
//    float a[Max_DIM][MAX_DIM+1];
    double a[3][4= {1,-1,3,4,
                    1,2,-2,10,
                    3,-1,5,14};
    double x[3= {000};
    double temp,tmp=0,max[3= {0,0,0};
 
    int n=3,i,j,k,l,m;
 
//    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++){        // pivot 검사
        temp = a[k-1][k-1];
        
        for(l=k; l<=n; l++){
 
            for(j=1; j<=n; j++){
                if(max[l-1== 0)
                    max[l-1= fabs(a[l-1][j-1]);
                else
                max[l-1= Max2(max[l-1],fabs(a[l-1][j-1]));
            }
        max[l-1= fabs(a[l-1][k-1])/max[l-1];
        printf("\n%d행 Pivot값 = %lf\n",l,max[l-1]);
        }
        //////////
        for(j=k; j<=n; j++){
            if(max[k-1< max[j-1&& tmp < max[j-1]){
                tmp = max[j-1];    // j는 행
                m = j;        // 가장 큰 pivot값을 담았던 j행 담아둠
            }
        }
        for(j=1; j<=n; j++)        // max 초기화
            max[j-1= 0;
        if(tmp != 0){    // j행 과 지금의 행과 교환
            for(j=k; j<=n+1; j++){
                tmp = a[k-1][j-1];
                a[k-1][j-1= a[m-1][j-1];
                a[m-1][j-1= tmp;
            }
            m = 0;
            tmp = 0;
            temp = a[k-1][k-1];            
            printmatrix(a,n);    printf("\nPivot값이 큰행과 교환완료");
        }
 
        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;
                    }
                }
                tmp = 0;
            }
            temp = a[k-1][k-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]/a[k-1][k-1]);
            }
        }
        printf("\n");
        printmatrix(a,n);        // Gauss 소거 과정
    }
 
    x[n-1= a[n-1][n]* 1/a[n-1][n-1];    // 맨 마지막 해 세팅
    a[n-1][n] *= 1/a[n-1][n-1];
    a[n-1][n-1*= 1/a[n-1][n-1];
 
    for(k=n; 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;
        }
        x[k-1*= 1/a[k-1][k-1];
        a[k-1][k-1*= 1/a[k-1][k-1];    
        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

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

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <stdio.h>
#include <math.h>
#define Max_DIM 4
 
void printmatrix(double a[4][5], 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]);
        }
    }
}
 
double Max2(double a, double b)
{
    if(a>=b)
        return a;
    else
        return b;
}
main()
{
//    float a[Max_DIM][MAX_DIM+1];
    double a[4][5= {0.4096,0.1234,0.3678,0.2943,0.4043,
                    0.2246,0.3876,0.4015,0.1129,0.1550,
                    0.3645,0.1920,0.3781,0.0643,0.4240,
                    0.1784,0.4002,0.2786,0.3927,0.2557};
    double x[4= {000,0};
    double temp,tmp=0,max[4= {0,0,0,0};
 
    int n=4,i,j,k,l,m;
/*
    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++){        // pivot 검사
        temp = a[k-1][k-1];
        
        for(l=k; l<=n; l++){
 
            for(j=1; j<=n; j++){
                if(max[l-1== 0)
                    max[l-1= fabs(a[l-1][j-1]);
                else
                max[l-1= Max2(max[l-1],fabs(a[l-1][j-1]));
            }
        max[l-1= fabs(a[l-1][k-1])/max[l-1];
        printf("\n%d행 Pivot값 = %lf\n",l,max[l-1]);
        }
        //////////
        for(j=k; j<=n; j++){
            if(max[k-1< max[j-1&& tmp < max[j-1]){
                tmp = max[j-1];    // j는 행
                m = j;        // 가장 큰 pivot값을 담았던 j행 담아둠
            }
        }
        for(j=1; j<=n; j++)        // max 초기화
            max[j-1= 0;
        if(tmp != 0){    // j행 과 지금의 행과 교환
            for(j=k; j<=n+1; j++){
                tmp = a[k-1][j-1];
                a[k-1][j-1= a[m-1][j-1];
                a[m-1][j-1= tmp;
            }
            m = 0;
            tmp = 0;
            temp = a[k-1][k-1];            
            printmatrix(a,n);    printf("\nPivot값이 큰행과 교환완료");
        }
        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;
                    }
                }
                tmp = 0;
            }
            temp = a[k-1][k-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]/a[k-1][k-1]);
              }
        }
        printf("\n");
        printmatrix(a,n);        // Gauss 소거 과정
    }
    x[n-1= a[n-1][n]* 1/a[n-1][n-1];    // 맨 마지막 해 세팅
    a[n-1][n] *= 1/a[n-1][n-1];
    a[n-1][n-1*= 1/a[n-1][n-1];
 
    for(k=n; 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;
        }
        x[k-1*= 1/a[k-1][k-1];
        a[k-1][k-1*= 1/a[k-1][k-1];    
        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

반응형