タイトルまんまです(ガウスの消去法については
wiki参照のこと)。逆行列を求めるのに似たような方法を使うのですが、微妙に忘れかけてたので復習を兼ねて解いてみた。本当は精度の問題とかもあって、もっとちゃんとしたアルゴリズムがあるらしいが、そんなのは知らん。あまりにひどいハードコーディングなので、明日はN元まで拡張するつもり。
04 | void PrintArray( const double *pArray, int col, int row) |
06 | for ( int i=0; i<col; ++i) |
08 | for ( int j=0; j<row; ++j) |
10 | std::cout << std::setw(10) << pArray[i*row+j] << " " ; |
12 | std::cout << std::endl; |
14 | std::cout << "------------------------------" << std::endl; |
31 | int main( int argc, char **argv) |
34 | double tmp[4*4] = {1}; |
37 | for ( int i=0; i<4; ++i) |
39 | tmp[i] = mat[i] / mat[0]; |
41 | PrintArray(tmp, 4, 4); |
44 | for ( int i=0; i<4; ++i) |
46 | tmp[1*4+i] = mat[1*4+i] / mat[1*4]; |
47 | tmp[2*4+i] = mat[2*4+i] / mat[2*4]; |
49 | PrintArray(tmp, 4, 4); |
52 | for ( int i=0; i<4; ++i) |
54 | tmp[1*4+i] = tmp[0*4+i] - tmp[1*4+i]; |
55 | tmp[2*4+i] = tmp[0*4+i] - tmp[2*4+i]; |
57 | PrintArray(tmp, 4, 4); |
60 | double yk = tmp[1*4+1] / tmp[2*4+1]; |
61 | for ( int i=1; i<4; ++i) |
63 | tmp[2*4+i] = tmp[2*4+i] * yk; |
65 | PrintArray(tmp, 4, 4); |
68 | for ( int i=1; i<4; ++i) |
70 | tmp[2*4+i] = tmp[1*4+i] - tmp[2*4+i]; |
72 | PrintArray(tmp, 4, 4); |
75 | double z = tmp[3*4+2] = tmp[2*4+3] / tmp[2*4+2]; |
76 | PrintArray(tmp, 4, 4); |
79 | double y = tmp[3*4+1] = (tmp[1*4+3] - (z*tmp[1*4+2])) / tmp[1*4+1]; |
80 | PrintArray(tmp, 4, 4); |
83 | double x = tmp[3*4+0] = (tmp[0*4+3] - (z*tmp[0*4+2] + y*tmp[0*4+1])) / tmp[0*4+0]; |
84 | PrintArray(tmp, 4, 4); |
86 | std::cout << "(x,y,z) = (" << x << ", " << y << ", " << z << ")" << std::endl; |
どうでもいいがなんで2次元配列使わなかったんだろう俺…。あと所々でPrintArrayを呼び出してるのはデバッグのためです。あしからず。
0 件のコメント:
コメントを投稿