teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

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

2017/01/17 07:15

投稿

MasashiKimura
MasashiKimura

スコア1150

answer CHANGED
@@ -1,19 +1,76 @@
1
+ なんとなく質問者さんが理解されていないように感じるため、修正したコードの全文を掲載します。
2
+
1
3
  ```C
2
- w /=b[i];
4
+ #include<stdio.h>
5
+ #include<stdlib.h>
6
+ #include<math.h>
7
+ #define eps 1.e-5
3
- anorm+=fabs(x[i]-w);
8
+ int main(void)
9
+ {
10
+ double a[3][3],b[3],x[3];
11
+ double s,w,anorm,xnorm;
4
- xnorm+=fabs(w);
12
+ int i,j,k,n;
13
+ scanf("%d", &n);
5
- x[i]=w;
14
+ for(i=0; i<n; i++){
15
+ for(j=0; j<n; j++){
16
+ scanf("%lf", &a[i][j]);
6
- ```
17
+ }
18
+ scanf("%lf", &b[i]);
19
+ }
7
20
 
21
+ for(i=0;i<n;i++){
8
- ではなく、
22
+ s=0.0;
23
+ for(j=0;j<n;j++){
24
+ if(i==j) continue;
25
+ s+=fabs(a[i][j]);
26
+ }
9
27
 
28
+ if(fabs(a[i][i])<=s){
29
+ printf("ILL CONDITION i=%d\n",i);
30
+ exit(1);
31
+ }
32
+ }
33
+
34
+ for (i = 0; i < n; i++) {
35
+ for (j = 0; j < n; j++) {
36
+ printf("%lfx%d ", a[i][j], j+1);
37
+ }
38
+ printf("= %lf\n", b[i]);
39
+ }
40
+
41
+ for(i=0; i < n; i++){
42
+ x[i] = 0.0;
43
+ }
44
+
45
+ printf("Iteration x1 x2 x3\n");
46
+ for(k=1; ; k++){
47
+ anorm = 0.0;
48
+ xnorm = 0.0;
49
+ for(i = 0; i < n; i++){
10
- ```C
50
+ w=b[i];
51
+ for(j=0; j<n; j++){
52
+ if(j==i) continue;
53
+ w -= a[i][j]*x[j];
54
+ }
55
+
56
+ // w /= b[i]; // ←ここが間違っている
11
- w /= a[i][i];
57
+ w /= a[i][i];
12
- anorm += fabs(x[i]-w);
58
+ anorm += fabs(x[i]-w);
13
- xnorm += fabs(w);
59
+ xnorm += fabs(w);
14
- x[i] = w;
60
+ x[i] = w;
61
+ }
62
+
63
+ printf("%6d", k);
64
+ for(i = 0; i < n; i++){
65
+ printf(" %.4f", x[i]);
66
+ }
67
+ printf("\n");
68
+ if(anorm/xnorm < eps) break;
69
+ }
70
+ return 0;
71
+ }
15
72
  ```
16
- です。
73
+
17
74
  ガウス=ザイデル法の更新式をよく見なおしてください。
18
75
 
19
76
  なお、ひとつ目の例は、

1

誤字修正

2017/01/17 07:15

投稿

MasashiKimura
MasashiKimura

スコア1150

answer CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  なお、ひとつ目の例は、
20
20
  ILL CONDITION i=0
21
- と出力れているように、ガウス=ザイデル法の収束条件(対角優位)を満たしていないため収束しません。
21
+ と出力れているように、ガウス=ザイデル法の収束条件(対角優位)を満たしていないため収束しません。
22
22
 
23
23
  以上のように修正すれば、2つ目の例は収束します。
24
24