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

回答編集履歴

2

修正

2018/08/09 23:03

投稿

asm
asm

スコア15149

answer CHANGED
@@ -20,4 +20,83 @@
20
20
  前段で配列`a`の中身が変化するため後段で同じことやっても結果は別になる。
21
21
 
22
22
  ~~(そもそも、後退代入部分だけ取り出したのになぜ係数配列が前進消去を終えていないのでしょうか)~~
23
- 計算するとあんまりキレイな解にならないし、不要部分の0埋めをやってないだけっぽいかな
23
+ 計算すると(**どっちにしろ**)あんまりキレイな解にならないし、不要部分の0埋めをやってないだけっぽいかな
24
+
25
+ ---
26
+
27
+ **追記**
28
+ `a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];`
29
+ この式がそもそも間違ってるので意味をなさない答えを返してますね。
30
+ 正しくは
31
+ a[i][N] = a[i][N] - a[i][j] * a[**j**][N] / a[i][i];
32
+ です。
33
+
34
+ なるべく、元のコードを直しつつ
35
+ - 上記バグ修正
36
+ - 経過を見やすく
37
+
38
+ してみた
39
+ ```c++
40
+ #include <iostream>
41
+ #include <stdio.h>
42
+
43
+ // 元の数定義
44
+ #define N 3 // 3
45
+
46
+ using namespace std;
47
+
48
+ static double A[N][N + 1] = {
49
+ { 1.0, 2.0, 8.0, 4.0},
50
+ { 0.0, 3.0, 2.0, 12.0},
51
+ { 0.0, 0.0, 2.0, 4.0},
52
+ };
53
+
54
+ void copy(double a[N][N+1]){
55
+ for(int i = 0; i < N; i++)
56
+ for(int j = 0; j <= N; j++)
57
+ a[i][j] = A[i][j];
58
+ }
59
+
60
+ int main()
61
+ {
62
+ double d;
63
+ int i;
64
+ int j;
65
+ double a[N][N+1];
66
+
67
+ copy(a);
68
+
69
+ for (i = N - 1; i >= 0; i--) {
70
+ printf("i=%d: ", i);
71
+ d = a[i][N]/ a[i][i];
72
+ printf("d=a[%d][%d]/a[%d][%d]よりdは%fです\n",i,N,i,i,d);
73
+
74
+ for (j = i + 1; j < N; j++){
75
+ printf(" j=%d:\n", j);
76
+ printf(" a[%d][%d]の中身は%f\n",i,N,a[i][N]);
77
+ printf(" 式は%f - a[%d][%d] * a[%d][%d]/a[%d][%d]です\n", d, i, j, j, N, i, i);
78
+ a[i][N] = d - a[i][j] * a[j][N] / a[i][i];
79
+ printf(" a[%d][%d]の中身は%f\n",i,N,a[i][N]);
80
+ }
81
+ }
82
+
83
+
84
+ puts("---------------------------------------------------------------------");
85
+ copy(a);
86
+
87
+ for (i = N - 1; i >= 0; i--) {
88
+ a[i][N] = a[i][N]/ a[i][i];
89
+ printf("i=%d: ", i);
90
+ printf("a[%d][%d]の中身は%fです\n", i,N, a[i][N]);
91
+ for (j = i + 1; j < N; j++){
92
+ printf(" j=%d:\n", j);
93
+ printf(" a[%d][%d] = %f\n", i, N, a[i][N]);
94
+ printf(" 式はa[%d][%d] - a[%d][%d] * a[%d][%d] / a[%d][%d]です\n",i,N,i,j,j,N,i,i);
95
+ a[i][N] = a[i][N] - a[i][j] * a[j][N] / a[i][i];
96
+ printf(" a[%d][%d] = %f\n", i, N, a[i][N]);
97
+ }
98
+ }
99
+
100
+ return 0;
101
+ }
102
+ ```

1

修正

2018/08/09 23:03

投稿

asm
asm

スコア15149

answer CHANGED
@@ -19,4 +19,5 @@
19
19
 
20
20
  前段で配列`a`の中身が変化するため後段で同じことやっても結果は別になる。
21
21
 
22
- (そもそも、後退代入部分だけ取り出したのになぜ係数配列が前進消去を終えていないのでしょうか)
22
+ ~~(そもそも、後退代入部分だけ取り出したのになぜ係数配列が前進消去を終えていないのでしょうか)~~
23
+ 計算するとあんまりキレイな解にならないし、不要部分の0埋めをやってないだけっぽいかな