GSL
GSL (GNU Scientific Library) のコマンドを毎回忘れるのはバカらしいので,自分が使ったものはここにメモしておくことにしました.
行列・ベクトルの扱い
ベクトルを扱うには #include <gsl/gsl_vector.h>,行列を扱うには #include <gsl/gsl_matrix.h> とヘッダーファイルを読み込んでおく.
gsl_vector *gsl_vector_alloc(size_t n)
長さ n のベクトルを生成する.gsl_vector *gsl_vector_calloc(size_t n)
長さ n のベクトルを生成し,かつ全要素を 0 で初期化する.void gsl_vector_free(gsl_vector *v)
gsl_vector_alloc() で生成したベクトルのメモリを解放する.double gsl_vector_get(const gsl_vector *v, const size_t i)
v の i 番目の要素 v[i] を取得する.void gsl_vector_set(gsl_vector *v, const size_t i, double x)
v の i 番目の要素を x とする(つまり,v[i] = x).gsl_matrix *gsl_matrix_alloc(size_t n1, size_t n2)
n1 × n2 の行列を生成する.gsl_matrix *gsl_matrix_calloc(size_t n1, size_t n2)
n1 × n2 の行列を生成し,かつ全要素を 0 で初期化する.void gsl_matrix_free(gsl_matrix *m)
gsl_matrix_alloc() で生成した行列のメモリを解放する.double gsl_matrix_get(const gsl_matrix *m, const size_t i, const size_t j)
m の (i, j) 成分 m[i][j] を取得する.void gsl_matrix_set(gsl_matrix *m, const size_t i, const size_t j, double x)
m の (i, j) 成分を x とする(つまり,m[i][j] = x).
連立一次方程式:三重対角行列が係数行列の場合
(三重対角行列を係数行列とする)連立一次方程式を扱うには #include <gsl/gsl_linalg.h> と読み込んでおく.
int gsl_linalg_solve_tridiag(const gsl_vector *diag, const gsl_vector *e, const gsl_vector *f, const gsl_vector *b, gsl_vector *x)
係数行列の対角成分が gsl_vector *diag,上対角成分が gsl_vector *e,下対角成分が gsl_vector *f で与えられた三重対角行列で,また,右辺ベクトルが gsl_vector *b で与えられた連立一次方程式を解く.結果は gsl_vector *x に格納される.例えば,4 × 4 の時の係数行列は
d0 e0 0 0
f0 d1 e1 0
0 f1 d2 e2
0 0 f2 d3
という具合であり,いずれのベクトルも(当たり前ではあるが)インデックスは0スタートである.int gsl_linalg_solve_symm_tridiag(const gsl_vector *diag, const gsl_vector *e, const gsl_vector *b, gsl_vector *x)
係数行列の対角成分が gsl_vector *diag,上・下対角成分が gsl_vector *e で与えられた対称な三重対角行列で,また,右辺ベクトルが gsl_vector *b で与えられた連立一次方程式を解く.結果は gsl_vector *x に格納される.例えば,4 × 4 の時の係数行列は
d0 e0 0 0
e0 d1 e1 0
0 e1 d2 e2
0 0 e2 d3
という具合である.int gsl_linalg_solve_cyc_tridiag(const gsl_vector *diag, const gsl_vector *e, const gsl_vector *f, const gsl_vector *b, gsl_vector *x)
係数行列の対角成分が gsl_vector *diag,上対角成分が gsl_vector *e,下対角成分が gsl_vector *f で与えられた周期的三重対角行列で,また,右辺ベクトルが gsl_vector *b で与えられた連立一次方程式を解く.結果は gsl_vector *x に格納される.例えば,4 × 4 の時の係数行列は
d0 e0 0 f3
f0 d1 e1 0
0 f1 d2 e2
e3 0 f2 d3
という具合である.int gsl_linalg_solve_symm_cyc_tridiag(const gsl_vector *diag, const gsl_vector *e, const gsl_vector *b, gsl_vector *x)
係数行列の対角成分が gsl_vector *diag,上・下対角成分が gsl_vector *e で与えられた対称な周期的三重対角行列で,また,右辺ベクトルが gsl_vector *b で与えられた連立一次方程式を解く.結果は gsl_vector *x に格納される.例えば,4 × 4 の時の係数行列は
d0 e0 0 e3
e0 d1 e1 0
0 e1 d2 e2
e3 0 e2 d3
という具合である.