GNU Scientific Library

GNU Scientific Library (GSL) は、C言語で記述された科学技術計算関数のライブラリである。オープンソースであり、GNU General Public Licenseのもとで配布されている。 このプロジェクトは1996年にロスアラモス国立研究所のDr. M. GalassiとDr. J. Theilerの着想に始まり、計算物理の専門家集団（Dr G. Jungman、Dr B. Gough、Dr J. Davies、R. Priedhorsky、Dr M. Booth、Dr F. Rossi、Dr D. Eddelbuettelら）を中心に作成された。 線形計算についてはBLASをサポートしており、CBLAS インターフェイスを実装している。 Linuxをはじめ、Unix系OSを中心にサポートしている。Microsoft Visual Studio用のバイナリもある。 参考論文のレファレンス、文献等も充実している (リファレンス・マニュアルには日本語訳がある)。リファレンス・マニュアルにはサンプル・コードも多数収録されている。PSPP、Perl Data Language (en)、O2sclなどのフリーウェア・プロジェクトでも利用されている。 複素数型やベクトル／行列型などは ANSI C で規定されている構造体で実装されており、C++ のクラスではない。そのためたとえば、複素数オブジェクト同士の加算が + 演算子で行えるようになっている訳ではなく、加算のための関数 (この場合 gsl_complex_add) を、二つの複素数オブジェクトを引数として呼ばねばならない。なお複素数型について、gsl-2.7 以降で C11に対応するCコンパイラを用い、 ヘッダファイルを適切にインクルードすれば、gsl_complex 型を C11標準の複素数型と同様に扱えるようになった。 拡張倍精度以上の精度における計算は、変数の内部表現が言語仕様で標準化されておらず、さらに環境に依存して精度が大きく変化するために対応していない。 GSL の開発チームは、GSL が GNUプロジェクトのパッケージであることを明示しており、GSL のコードはすべて誰もが自由に、どんな用途にでも使えることを保証している。そのために、プロプライエタリなコードや (たとえば 書籍 Numerical Recipes ISBN 4874085601 などの) GNU の定義するフリーソフトウェアに該当しないコードとは対立した開発姿勢をとっている。 2011年現在、年に1〜2回のメンテナンスリリースによるバグ修正対応が基本になっている。一方でブロックやスライスといったデータ構造の有用性や C++ 対応の是非についての議論も ML 上で行われており、もし議論が収束して開発陣での合意が形成されれば将来のバージョンで反映される可能性があるが、具体的なスケジュールを考慮するような段階ではない。 GSL は C 言語ライブラリであるため、C++のクラスから利用できる。しかしメンバー関数へのポインタは、その型が関数へのポインタとは異なるため、利用できない。関数へのポインタは、静的に定義された関数 (C言語における一般的な関数定義によるもの) に対して利用する必要がある。 C++から GSL を利用するためのラッパーも複数あるが、いずれも不完全であり、どの開発もあまり活発ではないか、停止している。GSL のヘルプ・メイリング・リストの議論では、ラッパーを使わなくても普通に関数を呼ぶのに支障はない、ベクトル用にラッパーを作って使っている、線形代数が目的ならEigenがある、などの情報が寄せられている。 なお、Microsoft Visual Studio 2008用にまとめられたパッケージが公開されている。 FORTRAN から GSL の各関数を利用するためのインターフェイスが開発中であり、β版がリリースされている。またラッパーを自作したい場合の情報も公開されている。 GNU Octave から GSL の特殊関数を利用できるパッケージがリリースされている。 GSL のホームページ に紹介されているもののうち、現在も開発が続いている主な言語バインディングを以下に挙げる。 Java Perl Perl Data Language Common LISP Python Ruby GNU R OCaml ベッセル関数の値を計算する C プログラムの例を以下に示す。 #include <stdio.h> #include <gsl/gsl_sf_bessel.h> int main(void) { double x = 5.0; double y = gsl_sf_bessel_J0(x); printf("J0(%g) = %.18e\n", x, y); return 0; } GNU Make を使って上のプログラムをコンパイルし、GSL とリンクしようとする場合、そのコマンドは Makefile ファイル中では以下のようになる。 gcc $(gsl-config --cflags) example.c $(gsl-config --libs) 上のコマンドで生成された実行ファイルを実行すると、以下のように出力する。計算値の精度は倍精度実数である。 J0(5) = -1.775967713143382920e-01 複素数 (Complex Numbers) 多項式の求根 (Roots of Polynomials) 特殊関数 (Special Functions) ベクトル・行列 (Vectors and Matrices) 置換 (Permutations) 組み合わせ (Combinations) 多重集合 (Multisets) 整列（Sorting) BLASサポート (BLAS Support) 線形代数 (Linear Algebra) 固有値問題 (Eigensystems) 高速フーリエ変換 (Fast Fourier Transforms) 数値積分 (Quadrature) 乱数 (Random Numbers) 準乱数列 (Quasi-Random Sequences、超一様分布列の事) 乱数分布 (Random Distributions) 統計計算 (Statistics) ヒストグラム (Histograms) N-Tuples モンテカルロ積分 (Monte Carlo Integration) 焼きなまし法 (Simulated Annealing) 微分方程式 (Differential Equations) 補間 (Interpolation) 数値微分 (Numerical Differentiation) チェビシェフ近似 (Chebyshev Approximation) 数列収束の加速 (Series Acceleration) 離散ハンケル変換 (Discrete Hankel Transforms) 一元および多次元の方程式の求根 (Root-Finding) 一次元及び多次元空間での非線形最小化問題 (Minimization) 最小二乗フィッティング (Least-Squares Fitting) 物理定数 (Physical Constants) IEEE浮動小数点の操作 (IEEE Floating-Point) 離散ウェーブレット変換 (Discrete Wavelet Transforms) B-スプライン曲線 (Basis Splines) 疎行列およびその線形代数 (Sparse Matrices and Linear Algebra) ポータル FLOSS 数値解析 アルゴリズム 計算科学 シミュレーション 数値解析ソフトウェア Netlib (数値計算ソフトウェアのリポジトリ、有益なプログラムが多数公開されている一方で、ライセンスが明確でないものが多く含まれている) FFTW (FFTライブラリ、より高速なライブラリとして紹介されている) ATLAS (行列計算ライブラリ、同上) GLPK (en、線形プログラミングのパッケージ、同上) NLopt (非線形数値最適化パッケージ、同上) GNU plotutils (GSL のマニュアル中で、gnuplot の代わりに利用が推奨されている)