/* lu2004.c 数値解析C LU 分解法, 2次元限定 version gcc lu2004.c ; a.out */ #include #include /* 行列のサイズを設定 */ #define SIZE 2 /* MATRIX, VECTOR という型を定義 */ typedef struct { double ent[SIZE][SIZE]; } MATRIX; typedef struct { double ent[SIZE]; } VECTOR; /* MATRIX a; と宣言すると a.ent[i][j] が a の (i,j)-成分を表す。 VECTOR b; と宣言すると b.ent[i] が b の 第i成分を表す。 */ /* 行列を表示する関数 */ void matprint(MATRIX a); /* ベクトルを表示する関数 */ void vecprint(VECTOR b); /* 行列 A, B の積 C = A B を返す関数 */ MATRIX matmul(MATRIX a, MATRIX b); /* 行列 A とベクトル b の積 c = A b を返す関数 */ VECTOR matvecmul(MATRIX a, VECTOR b); /* 正方行列 A の LU 分解を計算する関数 2つの行列を返すために、L と U はポインタで受け渡しする。 */ void lu(MATRIX a, MATRIX *l, MATRIX *u); /* LU 分解法の前進代入 : L y = b の解 y を返す関数 */ VECTOR step2(MATRIX l, VECTOR b); /* LU 分解法の後退代入 : U x = y の解 x を求める関数 */ VECTOR step3(MATRIX u, VECTOR y); main() { MATRIX a,l,u,c; VECTOR b,x,y,z; int i,j,n,k; /* ランダムな行列 A, ベクトル b の生成 */ srand(time(NULL)); for(i=0;ient[0][0]=a.ent[0][0]; u->ent[0][1]=a.ent[0][1]/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]; l->ent[0][1]=0.0; u->ent[0][0]=1.0; u->ent[1][0]=0.0; u->ent[1][1]=1.0; } /* (注:pivot 選択は使っていない) */ /* LU 分解法の前進代入 : L y = b の解 y を返す関数 */ VECTOR 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]; return y; } /* LU 分解法の後退代入 : U x = y の解 x を求める関数 */ VECTOR step3(MATRIX u, VECTOR y) { VECTOR x; x.ent[1]=y.ent[1]; x.ent[0]=y.ent[0]-u.ent[0][1]*x.ent[1]; return x; }