/* LU.c 数値解析C 2007.12.19 の課題 LU 分解法 3次元限定version gcc LU.c -lm */ #include"sqmatrix.h" // sqmatrix.h を同じディレクトリに download せよ /* 正方行列 A の LU 分解を計算する手続き ふたつの行列 L, U はポインタで返す pivot 選択は使っていない */ /***** 3次元限定なのでここを書き換えよ *****/ void LU_decomp(MATRIX A, MATRIX *L, MATRIX *U) { *L=zeromat(); // 初期値はゼロ行列 *U=unitmat(); // 初期値は単位行列 L->ent[0][0] = A.ent[0][0]; U->ent[0][1] = A.ent[0][1] / L->ent[0][0]; U->ent[0][2] = A.ent[0][2] / L->ent[0][0]; L->ent[1][0] = A.ent[1][0]; L->ent[1][1] = A.ent[1][1] - L->ent[1][0] * U->ent[0][1]; U->ent[1][2] = (A.ent[1][2] - L->ent[1][0] * U->ent[0][2]) / L->ent[1][1]; L->ent[2][0] = A.ent[2][0]; L->ent[2][1] = A.ent[2][1] - L->ent[2][0] * U->ent[0][1]; L->ent[2][2] = A.ent[2][2] - L->ent[2][0] * U->ent[0][2] - L->ent[2][1] * U->ent[1][2]; } /* LU 分解法の前進代入 : L y = b の解 y を求める */ /***** 3次元限定なのでここも書き換えよ *****/ VECTOR LU_step2(MATRIX L, VECTOR b) { VECTOR y; y.ent[0] = b.ent[0] / L.ent[0][0]; y.ent[1] = (b.ent[1] - L.ent[1][0] * y.ent[0]) / L.ent[1][1]; y.ent[2] = (b.ent[2] - L.ent[2][0] * y.ent[0] - L.ent[2][1] * y.ent[1]) / L.ent[2][2]; return y; } /* LU 分解法の後退代入 : U x = y の解 x を求める */ /***** 3次元限定なのでここも書き換えよ *****/ VECTOR LU_step3(MATRIX U, VECTOR y) { VECTOR x; x.ent[2] = y.ent[2]; x.ent[1] = y.ent[1] - U.ent[1][2] * x.ent[2]; x.ent[0] = y.ent[0] - U.ent[0][1] * x.ent[1] - U.ent[0][2] * x.ent[2]; return x; } main() { MATRIX A,L,U,C; VECTOR b,x,y,z; int i,j,n,k; RANDOMIZE(); SIZE = 3; // 行列のサイズを設定 /***** 課題 (3) の行列・ベクトル *****/ for(i=0; i