質問したいことがあります。
以下の式に間違いがないかを指摘してほしいです。
~~ for (i = N - 1; i >= 0; i--) {~~
~~d = a[i][N] ; //d = a[2][3] / a[2][2]
for (j = i + 1; j < N; j++)
a[i][N] = d - a[i][j] * a[i][N] / a[i][i];
~~
}
の式a[i][N] = d - a[i][j] * a[i][N] / a[i][i]は
a[i][N] = (d - a[i][j] * a[i][N]) / a[i][i]と同じような式なのでしょうか?
また、同じように、
~~ for (i = N - 1; i >= 0; i--) {~~
~~a[i][N] = a[i][N] ; ~~
for (j = i + 1; j < N; j++)
~~ a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i];
~~
}
の式a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i]は
a[i][N] = a[i][N] - (a[i][j] * a[i][N] / a[i][i])と同じような式なのでしょうか?
編集
以下のプログラムをprintfで中身を表示してみました。
以下が全体のプログラムです。
#include <iostream> #include <stdio.h> // 元の数定義 #define N 3 // 3 using namespace std; //double a[N][N+1]; // 係数 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}, }; int main() { double d; int i; int j; for (i = N - 1; i >= 0; i--) { d = a[i][N] ; //d = a[2][3] / a[2][2] printf("**d=a[%d][%d],中身は%fです**\n",i,N,d); for (j = i + 1; j < N; j++) a[i][N] = d - a[i][j] * a[i][N] / a[i][i]; printf("%f/%f-(%f)*%f/%fである\n", a[i][N],a[i][i],a[i][j],a[i][N],a[i][i]); printf("a[%d][%d] / a[%d][%d]-a[%d][%d]*a[%d][%d]/a[%d][%d]である\n",i,N,i,i,i,j,i,N,i,i); printf("%f\n", a[i][N]); } for (i = N - 1; i >= 0; i--) { a[i][N] = a[i][N] ; printf("a[%d][%d],中身は%fです\n", i,N, a[i][N]); for (j = i + 1; j < N; j++) a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i]; printf("%f\n", a[i][N]); } return 0; }
正直、変数に置き換えた場合と配列のまま置いて計算した場合でなぜ答えが変わってくるのかよくわかりません。どうか理由を計算順序を踏まえて詳しく教えていただけないでしょうか?
実行結果は以下の通りです。
d=a[2][3],中身は4.000000です 4.000000/2.000000-(4.000000)*4.000000/2.000000である a[2][3] / a[2][2]-a[2][3]*a[2][3]/a[2][2]である 4.000000 d=a[1][3],中身は12.000000です 4.000000/3.000000-(4.000000)*4.000000/3.000000である a[1][3] / a[1][1]-a[1][3]*a[1][3]/a[1][1]である 4.000000 d=a[0][3],中身は4.000000です 36.000000/1.000000-(36.000000)*36.000000/1.000000である a[0][3] / a[0][0]-a[0][3]*a[0][3]/a[0][0]である 36.000000 **a[2][3],中身は4.000000です** 4.000000 **a[1][3],中身は4.000000です** 1.333333 **a[0][3],中身は36.000000です** 252.000000
編集8/10
#include <iostream> #include <stdio.h> // 元の数定義 #define N 3 // 3 using namespace std; //double a[N][N+1]; // 係数 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}, }; int main() { double d; int i; int j; for (i = N - 1; i >= 0; i--) { d = a[i][N]/ a[i][i]; printf("d=a[%d][%d]/a[%d][%d]よりdは%fです\n",i,N,i,i,d); for (j = i + 1; j < N; j++) a[i][N] = d - a[i][j] * a[i][N] / a[i][i]; printf("式は%f - a[%d][%d] * a[%d][%d]/a[%d][%d]です\n", d, i, j, i, N, i, i); printf(" a[%d][%d]の中身は%f\n",i,N,a[i][N]); printf("%f/%f-(%f)*%f/%fである\n", a[i][N],a[i][i],a[i][j],a[i][N],a[i][i]); } for (i = N - 1; i >= 0; i--) { a[i][N] = a[i][N]/ a[i][i]; printf("a[%d][%d]の中身は%fです\n", i,N, a[i][N]); for (j = i + 1; j < N; j++) a[i][N] = a[i][N] - a[i][j] * a[i][N] / a[i][i]; printf("%f\n", a[i][N]); printf("式はa[%d][%d] - a[%d][%d] * a[%d][%d] / a[%d][%d]です\n",i,N,i,j,i,N,i,i); } return 0; }
を実行したところ、以下のようになりました。
d=a[2][3]/a[2][2]よりdは2.000000です 式は2.000000 - a[2][3] * a[2][3]/a[2][2]です a[2][3]の中身は4.000000 4.000000/2.000000-(4.000000)*4.000000/2.000000である d=a[1][3]/a[1][1]よりdは4.000000です 式は4.000000 - a[1][3] * a[1][3]/a[1][1]です a[1][3]の中身は-4.000000 -4.000000/3.000000-(-4.000000)*-4.000000/3.000000である d=a[0][3]/a[0][0]よりdは4.000000です 式は4.000000 - a[0][3] * a[0][3]/a[0][0]です a[0][3]の中身は36.000000 36.000000/1.000000-(36.000000)*36.000000/1.000000である a[2][3]の中身は2.000000です 2.000000 式はa[2][3] - a[2][3] * a[2][3] / a[2][2]です a[1][3]の中身は-1.333333です -0.444444 式はa[1][3] - a[1][3] * a[1][3] / a[1][1]です a[0][3]の中身は36.000000です 252.000000 式はa[0][3] - a[0][3] * a[0][3] / a[0][0]です
jの部分がなぜか変化せず、3のままです。
他にもi=2,N=3,j=3の時、j<Nよりj=3の時は実行結果の
式は2.000000 - a[2][3] * a[2][3]/a[2][2]です 4.000000/2.000000-(4.000000)*4.000000/2.000000である
自体は出ないと思います。
printfで中身を表示してみたのですが、原因が全くわかりません。
どうしたらfor文を正しく動作させて、jを変化させて理想の計算をさせられるでしょうか?
以前に載せたプログラムと少し違うのですが、私のくだらない質問を新しく質問として投稿するのは申し訳ないと思い編集という形で質問させていただきました。
どうか知恵を貸していただけないでしょうか。お願いします。
回答2件
あなたの回答
tips
プレビュー