GSLを使ってみよう Visual C/C++で数値計算ライブラリを使う方法のメモ 九州大学大学院 工学研究院 航空宇宙工学部門 宇宙機ダイナミクス研究室 平山寛 2008/6/20 「車輪の再発明」をしていないか? 車輪の再発明(しゃりんのさいはつめい)とは、「広く受け入れられ確立した 技術や解決法を無視して、同様のものを再び一から作ってしまう事」の慣用 句。英語では Reinventing the wheel であり、世界中で使われる。 車輪を題材にして、「広く受け入れられ確立した技術や解決法を無視して、 同様のものを再び一から作ってしまう事」を示している。新たな付加価値が 何もないものを作成するのにコストをかけることから、皮肉的なニュアンスで 用いられる。再発明を行ってしまう理由としては、「既存のものの存在を知ら ない」「既存のものの意味を誤解している」といったことが挙げられる。主にIT 業界、特にSE・プログラマの間で良く用いられる。これらの業界では、ライブ ラリや先行事例があるにもかかわらず、多様な理由でそれを利用せず、コー ドやプログラミング技法を再び一から作ってしまう事が多い。 教育の現場では、ある技術の意味を理解させるために、意図的に車輪の再 発明を行わせる場合がある。 ウィキペディアの解説より引用 数値計算の場合・・・ z我々の分野でよく使う数値計算 ¾数値積分(微分方程式) ¾ベクトル・行列計算 ¾ベッセル関数,ルジャンドル関数(摂動問題で) zこれらは再発明しなくても、既存の数値計算 ライブラリが利用できる。有名なのは、 ¾Numerical Recipes → 研究室に書籍があります (ソースは書籍を見て打ち込むか、別途購入) ¾GSL → これを使ってみよう! GSLって? GNUはUNIXの世界では 定評のある、フリーソフト フェア開発の有志団体。 産総研・富永氏による和訳マニュアルから引用 信用できるだろうか? z ブラックボックスにならないか? ¾ ソースコードは公開されています。 ¾ 数百ページに及ぶ詳細な説明書も公開されています。 • つまりNumerical Recipesを丸写しするのと透明度は違わない。 • 解説文書が不完全な、先輩のプログラムをもらうより良いかも。 z 最新版がダウンロードできる ¾ 改訂の遅いNumerical Recipesの書籍版(とくに日本語) よりバグは少ないと考えられる。 • Numerical Recipes も購入すればダウンロードできますが。 z 開発集団はボランティアとはいえ計算科学の専門家 ¾ (恐らく)我々程度の生半可なプログラマが作るコードより 信頼できると考えます。 数値計算の理論そのものが 専門ではないという意味で。 入手方法 z 2008年6月現在 最新版はgsl-1.11 z ソースコード(GNU公式サイトから) http://www.gnu.org/software/gsl/ ¾ UNIXならソースからコンパイルしてインストール z Windows Visual C/C++用 コンパイル済みバイナリファイル(CERNから) http://service-spi.web.cern.ch/service-spi/external/distribution/ ¾ ここからGSL_<version>__LCG_<platform>.tar.gz というファイルをダウンロード ¾ 最新版はGSL_1.10__LCG_win32_vc71.tar.gz ちなみにCERNは欧州の素粒子研究所で、 計算科学にも強く、WWW発祥の地。 展開 ztar.gzを展開できるソフトで、展開する。 z下図のようなディレクトリ構成になる。 ¾include¥gslディレクトリ内にはヘッダファイル (拡張子 *.h) ¾libディレクトリ内にはライブラリファイル (拡張子 *.lib, *.dll) ヘッダファイルの配置 z 展開した gsl フォルダを (Visual Studioのインストール先)¥VC¥include の中にコピー z これで、ソースファイルからは #include <gsl/gsl_***.h> として参照できる。 静的ライブラリ(*.lib)の配置 z (Visual Studioのインストール先)¥VC¥lib 内に gsl フォルダを作る z 展開した lib フォルダ内の *.lib ファイルを (Visual Studioのインストール先)¥VC¥lib¥gsl の中にコピー *.exp ファイルは、ふつう使いませんが、 とりあえず一緒にコピー 動的ライブラリ(*.dll)の配置 z gsl.dll と gslcblas.dll を実行PATHの通った所に置く。 定番の場所は、 ¾ 今後よく使うようなら、C:¥WINDOWS¥system32 内へコピー。 • この場合、一度だけコピーすればよい。 ¾ たまにしか使わないようなら、先にプロジェクトを作製(次頁以降)し、 コンパイルしてから、生成された実行ファイル(*.exe)と同じ場所へコピー。 • プロジェクトフォルダ内の、debug ないし release というフォルダである。 • この場合、新しいプロジェクトを作るたびに、DLLをコピーして入れる必要がある。 gsltestというプロジェクトで使用する例 又は system32 へ Visual C/C++での設定概要 z 以上で、GSLの使用準備は完了。 z 続いて、 Visual C/C++での作業となる。 1. 新規プロジェクトを作製 2. C/C++のプログラムソースを作成 (使用する関数のヘッダファイルをインクルードする) 3. プロジェクトのプリプロセッサを設定 4. 静的ライブラリを設定 5. コンパイル 6. (必要なら)DLLを実行フォルダにコピー 7. 実行 z これらの設定は、新規プロジェクトを作製するたび に行うこと。3番以降の手順は、DebugからRelease に切り換えたときも設定し直すこと。 プログラミング zプロジェクトを作成する z拡張子*.c ないし *.cpp のプログラムを作製 z使用する関数のヘッダファイルをインクルード ¾#include <gsl/gsl_***.h> とします ¾***のところは関数の説明書で調べること (gsl_matrix.hなど) プリプロセッサの設定 z 「プロジェクト」メニューから「プロパティ」を開く z 「構成プロパティ」→「C/C++」→「プリプロセッサ」 z 「プリプロセッサの定義」に ;GSL_DLL を追加 プロジェクトにC/C++のソースファイル を追加してからでないと現れない 静的ライブラリの設定 z 「プロジェクト」メニューから「既存項目の追加」して z ライブラリフォルダに保存してある*.libファイルを プロジェクトに追加 ¾ gsl.lib GSL基本ライブラリ:必須 ¾ gslcblas.lib 線形代数ライブラリ:必要に応じて (BLAS = Basic Linear Algebra Subprogram) gsl.exp gslcblas.exp gslML.lib gslcblasML.lib は、特殊なプロジェ クトで使います。 とりあえず無視。 プロジェクトのプロパティで 設定する方法もあるけど、 難しいので説明省略します。 ドラッグ&ドロップでも追加できます サンプルプログラム #include <stdio.h> #include <gsl/gsl_rng.h> #include <gsl/gsl_vector.h> #include <gsl/gsl_blas.h> int main (void) { const gsl_rng_type * T = gsl_rng_default; gsl_rng * r = gsl_rng_alloc (T); int i; printf ("Here are ten random numbers in the range 0-99:¥n"); for (i = 0; i < 10; i++) { int k = gsl_rng_uniform_int (r, 100); printf(" %d", k); } printf("¥n"); { double x[5] = { 1.0, 2.0, 3.0, 4.0, 5.0} ; double y[5] = { 5.5, 4.4, 3.3, 2.2, 1.1} ; gsl_vector_view v = gsl_vector_view_array(x, 5); gsl_vector_view w = gsl_vector_view_array(y, 5); printf("blas operation DAXPY¥n"); printf("x:"); for (i = 0; i < 5; i++) { printf(" %g", x[i]); } ; printf(" y:"); for (i = 0; i < 5; i++) { printf(" %g", y[i]); } ; gsl_blas_daxpy (1.0, &v.vector, &w.vector); printf("¥n"); printf("a x + y:"); for (i = 0; i < 5; i++) { printf(" %g", y[i]); } ; } printf("¥n"); return 0; } 乱数発生と行列演算のデモ GSL 1.2 for Visual C に付属していたサンプルです。 実行結果 配布上の注意 zプログラムが完成し構成を「Debug」から 「Release」に変えたなら、プリプロセッサ の設定で ;GSL_DLL を追加し直す。 zコンパイルした実行ファイルを、人に渡す ときは、実行ファイルと同じフォルダに gsl.dllとgslcblas.dllを入れてあげるとよい。 本稿での開発環境 zこの文章は以下の環境に基づいて執筆した ¾Microsoft Windows XP SP2 Professional ¾Microsoft Visual C++ 2005 Express Edition z他のバージョンではフォルダ名や、メニューの 名前が異なるかもしれない。 参考サイト zGSL公式サイト http://www.gnu.org/software/gsl/ z産総研 富永氏による説明書の和訳 http://www.cbrc.jp/~tominaga/translations/index.php 対抗品 Numerical Recipesについて z Numerical Recipesの公式サイト http://numerical-recipes.com/ ¾ Numerical Recipes in C の英語版は 無料でダウンロードできます。 ¾ Numerical Recipes in C++ は書籍販売のみ。 ¾ 掲載しているソースコードは$65で販売。 z 研究室にNumerical Recipes in C の 日本語版書籍があります。 ¾ 原著の第1版の本文+第2版のコード相当。 ¾ 英語の直訳が多く読みにくい。 z 数値計算アルゴリズムの教科書としてはよい と思うのですが、ネットで検索すると、けっこう 批判意見も見つかるのが気になります。 ¾ Why Not Numerical Recipes? など (和訳) http://nakano.webmasters.gr.jp/nr.html ¾ まあ、それだけ大勢に利用されている証拠でもある。
© Copyright 2024 ExpyDoc