반응형
[미지수 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] = {0, 0, 0};
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] = {0, 0, 0,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 |
반응형
'학습공간 > 수치해석, 확률과통계, 이산수학' 카테고리의 다른 글
[C언어 수치해석] 2차 Simpson 방법과 3차 Simpson 방법 비교 (0) | 2019.11.28 |
---|---|
[C언어 수치해석] 직사각형 방법, 사다리꼴 방법, Simpson 방법 (수치적분) (0) | 2019.11.28 |
[C언어 수치해석] 라그랑지(Lagrange) 곡선 그리기 (MFC 활용) (0) | 2019.11.28 |
[C언어 수치해석] Gauss Jordan 소거법 (연립방정식의 해) (0) | 2019.11.28 |
[C언어 수치해석] 이분법, Scant법, Newton법 (근사해 구하기) (0) | 2019.11.28 |