最速怪談選手権

static double a[N][N + 1] = {
{ 1.0, 2.0, 8.0, 4.0},
{ 4.0, 3.0, 2.0, 12.0},
{ 1.0, 4.0, 2.0, 4.0},
};
for (i = N - 1; i >= 0; i--) {

d = a[i][N]/ a[i][i];
 for (j = i + 1; j < N; j++) {
      a[i][N] = d - a[i][j] * a[i][N] / a[i][i];
}

}
展開の式をprintfを用いて過程の式を見てみたのですが、
なぜ、このように計算されるのかわかりません。
どっから-4や36が出てきたのかわかりません。どうか一緒に考えていただけないでしょうか?

以下は過程の計算を表示した実行結果です。
d=a[2][3]/a[2][2]よりdは2.000000です
d=a[1][3]/a[1][1]よりdは4.000000です
式は4.000000 - a[1][2] * a[1][3]/a[1][1]です
式の中身は4.000000 - 2.000000 * -4.000000/3.000000です
a[1][3]の中身は-4.000000
-4.000000/3.000000-(2.000000)*-4.000000/3.000000である
d=a[0][3]/a[0][0]よりdは4.000000です
式は4.000000 - a[0][1] * a[0][3]/a[0][0]です
式の中身は4.000000 - 2.000000 * -4.000000/1.000000です
a[0][3]の中身は-4.000000
-4.000000/1.000000-(2.000000)*-4.000000/1.000000である
式は4.000000 - a[0][2] * a[0][3]/a[0][0]です
式の中身は4.000000 - 8.000000 * 36.000000/1.000000です
a[0][3]の中身は36.000000
36.000000/1.000000-(8.000000)*36.000000/1.000000である

A 回答 (2件)

-4はj=1の計算結果のa[0][3]


-8の8はa[0][2]
j=2での計算では
a[0][3]=d-a[0][2]*a[0][3]/a[0][0];
    • good
    • 0
この回答へのお礼

すごくわかりやすくて助かります。どうもありがとうございます。
ベストアンサーにさせて頂きます。

お礼日時:2018/08/10 13:02

各行の計算が分離されてるので、追うのは簡単ですよ。

i=0だけ考えればよい。

d=4だから、j=1の計算で
a[0][3]=4-2*4/1
j=2の計算で
a[0][3]=4-8*(-4)/1

で、そもそも後退代入は

a[i][N] = a[i][N]/ a[i][i];
for (j = i + 1; j < N; j++) {
      a[i][N] = a[i][N]- a[i][j] * a[j][N] / a[i][i];
}

と書かないと駄目です。
    • good
    • 0
この回答へのお礼

解答ありがとうございます。
あの、-8と-4はどっから来たのでしょうか?

お礼日時:2018/08/10 12:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!