takapack.h (疎行列用 LU分解, CG法の素朴(遅い)な実装)
要旨
修士で大学院に入って以来、疎な連立方程式はumfpackが解いてくれて、本当に感謝している.
企業とのコラボレーションのため,GPLのumfpackと一時お別れしなくてはならなくなった.
疎な連立方程式を解くtakapack.h/takapack.cppを作ったので公開しておく.
+ 与える行列は, umfpackと同様の comressed row form (umfpackではcompressed column formだった)
+ CG法による 連立方程式 Ax = b の 求解をサポート
+ LU分解による 連立方程式 Ax = b の 求解をサポート
NYSL(Version 0.9982)ライセンスなので、好きに使ってください(大学のレポートとかの参考になれば良いなと思っています.).
ソースコード
takapack.c takapack.cpp
使い方
1) 解きたい連立方程式 Ax = b の行列Aをcompressed row formで作る。
配列bもつくる。
/*---------------------------- 2 3 0 0 0 8 3 0 4 0 6 45 A = 0 -1 -3 2 0 b =-3 0 0 1 0 0 3 0 4 2 0 1 19 ----------------------------*/ //(umfpackは complessed columnだけど、実装の都合上 Compressed Rowを採用 ()) // umfpackと併用するときは umfpack_solve の第一引数に UMFPACK_At を食わせて転置すればOK //compressed row form of A const int N = 5; int Ap [ ] = { 0, 2, 5, 8, 9, 12} ; int Ai [ ] = { 0, 1, 0, 2, 4, 1, 2, 3, 2, 1, 2, 4 } ; double Ax [ ] = { 2., 3., 3, 4, 6, -1, -3, 2, 1, 4, 2, 1 } ; double b [ ] = { 8, 45, -3, 3, 19} ;
2) CG法で解くなら CG法の関数を呼ぶdouble x1 [5] = {0,0,0,0,0}; takapack_CG_sparse_solve(N, Ap, Ai, Ax, b, x2, 0.00000001); fprintf( stderr, "%f %f %f %f %f\n", x2[0], x2[1], x2[2], x2[3], x2[4]);}3)LU分解で解くなら i)LU分解関数 ii)解く関数 iii)解放する関数 を順に呼ぶ
double x1 [5] = {0,0,0,0,0}; int *LUp, *LUi, *LU_rowflip; double *LUx; takapack_LU_factorization( N, Ap, Ai, Ax, LUp, LUi, LUx, LU_rowflip); takapack_LU_solve ( N, LUp, LUi, LUx, LU_rowflip, b, x1 ); fprintf( stderr, "%f %f %f %f %f\n", x1[0], x1[1], x1[2], x1[3], x1[4]);//適当にprintfしてください... takapack_LU_free( LUp, LUi, LUx, LU_rowflip);