回答編集履歴

2

修正したコードの全文の掲載

2017/01/17 07:15

投稿

MasashiKimura
MasashiKimura

スコア1150

test CHANGED
@@ -1,34 +1,148 @@
1
- ```C
2
-
3
- w /=b[i];
4
-
5
- anorm+=fabs(x[i]-w);
1
+ なんとなく質問者さんが理解されていないように感じるため、修正したコードの全文を掲載します。
6
-
7
- xnorm+=fabs(w);
8
-
9
- x[i]=w;
10
-
11
- ```
12
-
13
-
14
-
15
- ではなく、
16
2
 
17
3
 
18
4
 
19
5
  ```C
20
6
 
21
- w /= a[i][i];
7
+ #include<stdio.h>
22
8
 
23
- anorm += fabs(x[i]-w);
9
+ #include<stdlib.h>
24
10
 
25
- xnorm += fabs(w);
11
+ #include<math.h>
26
12
 
13
+ #define eps 1.e-5
14
+
15
+ int main(void)
16
+
17
+ {
18
+
19
+ double a[3][3],b[3],x[3];
20
+
21
+ double s,w,anorm,xnorm;
22
+
23
+ int i,j,k,n;
24
+
25
+ scanf("%d", &n);
26
+
27
+ for(i=0; i<n; i++){
28
+
29
+ for(j=0; j<n; j++){
30
+
31
+ scanf("%lf", &a[i][j]);
32
+
33
+ }
34
+
35
+ scanf("%lf", &b[i]);
36
+
37
+ }
38
+
39
+
40
+
41
+ for(i=0;i<n;i++){
42
+
43
+ s=0.0;
44
+
45
+ for(j=0;j<n;j++){
46
+
47
+ if(i==j) continue;
48
+
49
+ s+=fabs(a[i][j]);
50
+
51
+ }
52
+
53
+
54
+
55
+ if(fabs(a[i][i])<=s){
56
+
57
+ printf("ILL CONDITION i=%d\n",i);
58
+
59
+ exit(1);
60
+
61
+ }
62
+
63
+ }
64
+
65
+
66
+
67
+ for (i = 0; i < n; i++) {
68
+
69
+ for (j = 0; j < n; j++) {
70
+
71
+ printf("%lfx%d ", a[i][j], j+1);
72
+
73
+ }
74
+
75
+ printf("= %lf\n", b[i]);
76
+
77
+ }
78
+
79
+
80
+
81
+ for(i=0; i < n; i++){
82
+
83
+ x[i] = 0.0;
84
+
85
+ }
86
+
87
+
88
+
89
+ printf("Iteration x1 x2 x3\n");
90
+
91
+ for(k=1; ; k++){
92
+
93
+ anorm = 0.0;
94
+
95
+ xnorm = 0.0;
96
+
97
+ for(i = 0; i < n; i++){
98
+
99
+ w=b[i];
100
+
101
+ for(j=0; j<n; j++){
102
+
103
+ if(j==i) continue;
104
+
105
+ w -= a[i][j]*x[j];
106
+
107
+ }
108
+
109
+
110
+
111
+ // w /= b[i]; // ←ここが間違っている
112
+
113
+ w /= a[i][i];
114
+
115
+ anorm += fabs(x[i]-w);
116
+
117
+ xnorm += fabs(w);
118
+
27
- x[i] = w;
119
+ x[i] = w;
120
+
121
+ }
122
+
123
+
124
+
125
+ printf("%6d", k);
126
+
127
+ for(i = 0; i < n; i++){
128
+
129
+ printf(" %.4f", x[i]);
130
+
131
+ }
132
+
133
+ printf("\n");
134
+
135
+ if(anorm/xnorm < eps) break;
136
+
137
+ }
138
+
139
+ return 0;
140
+
141
+ }
28
142
 
29
143
  ```
30
144
 
31
- です。
145
+
32
146
 
33
147
  ガウス=ザイデル法の更新式をよく見なおしてください。
34
148
 

1

誤字修正

2017/01/17 07:15

投稿

MasashiKimura
MasashiKimura

スコア1150

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  ILL CONDITION i=0
40
40
 
41
- と出力れているように、ガウス=ザイデル法の収束条件(対角優位)を満たしていないため収束しません。
41
+ と出力れているように、ガウス=ザイデル法の収束条件(対角優位)を満たしていないため収束しません。
42
42
 
43
43
 
44
44