GSLを使ってみよう -...

19
GSLを使ってみよう Visual C/C++で数値計算ライブラリを使う方法のメモ 九州大学大学院 工学研究院 航空宇宙工学部門 宇宙機ダイナミクス研究室 平山寛 2008/6/20

Transcript of GSLを使ってみよう -...

  • GSLを使ってみようVisual C/C++で数値計算ライブラリを使う方法のメモ

    九州大学大学院 工学研究院

    航空宇宙工学部門 宇宙機ダイナミクス研究室

    平山寛

    2008/6/20

  • 「車輪の再発明」をしていないか?

    車輪の再発明(しゃりんのさいはつめい)とは、「広く受け入れられ確立した技術や解決法を無視して、同様のものを再び一から作ってしまう事」の慣用句。英語では Reinventing the wheel であり、世界中で使われる。車輪を題材にして、「広く受け入れられ確立した技術や解決法を無視して、同様のものを再び一から作ってしまう事」を示している。新たな付加価値が何もないものを作成するのにコストをかけることから、皮肉的なニュアンスで用いられる。再発明を行ってしまう理由としては、「既存のものの存在を知らない」「既存のものの意味を誤解している」といったことが挙げられる。主にIT業界、特にSE・プログラマの間で良く用いられる。これらの業界では、ライブラリや先行事例があるにもかかわらず、多様な理由でそれを利用せず、コードやプログラミング技法を再び一から作ってしまう事が多い。

    教育の現場では、ある技術の意味を理解させるために、意図的に車輪の再発明を行わせる場合がある。

    ウィキペディアの解説より引用

  • 数値計算の場合・・・

    我々の分野でよく使う数値計算数値積分(微分方程式)

    ベクトル・行列計算

    ベッセル関数,ルジャンドル関数(摂動問題で)

    これらは再発明しなくても、既存の数値計算ライブラリが利用できる。有名なのは、

    Numerical Recipes → 研究室に書籍があります(ソースは書籍を見て打ち込むか、別途購入)

    GSL → これを使ってみよう!

  • GSLって?

    産総研・富永氏による和訳マニュアルから引用

    GNUはUNIXの世界では定評のある、フリーソフトフェア開発の有志団体。

  • 信用できるだろうか?

    ブラックボックスにならないか?ソースコードは公開されています。数百ページに及ぶ詳細な説明書も公開されています。

    • つまりNumerical Recipesを丸写しするのと透明度は違わない。• 解説文書が不完全な、先輩のプログラムをもらうより良いかも。

    最新版がダウンロードできる改訂の遅いNumerical Recipesの書籍版(とくに日本語)よりバグは少ないと考えられる。

    • Numerical Recipes も購入すればダウンロードできますが。開発集団はボランティアとはいえ計算科学の専門家

    (恐らく)我々程度の生半可なプログラマが作るコードより信頼できると考えます。

    数値計算の理論そのものが専門ではないという意味で。

  • 入手方法

    2008年6月現在 最新版はgsl-1.11

    ソースコード(GNU公式サイトから)http://www.gnu.org/software/gsl/

    UNIXならソースからコンパイルしてインストールWindows Visual C/C++用コンパイル済みバイナリファイル(CERNから)http://service-spi.web.cern.ch/service-spi/external/distribution/

    ここからGSL___LCG_.tar.gzというファイルをダウンロード

    最新版はGSL_1.10__LCG_win32_vc71.tar.gzちなみにCERNは欧州の素粒子研究所で、計算科学にも強く、WWW発祥の地。

    http://www.gnu.org/software/gsl/http://service-spi.web.cern.ch/service-spi/external/distribution/

  • 展開

    tar.gzを展開できるソフトで、展開する。

    下図のようなディレクトリ構成になる。

    include¥gslディレクトリ内にはヘッダファイル(拡張子 *.h)

    libディレクトリ内にはライブラリファイル(拡張子 *.lib, *.dll)

  • ヘッダファイルの配置展開した gsl フォルダを(Visual Studioのインストール先)¥VC¥includeの中にコピー

    これで、ソースファイルからは#include として参照できる。

  • 静的ライブラリ(*.lib)の配置

    (Visual Studioのインストール先)¥VC¥lib内に gsl フォルダを作る

    展開した lib フォルダ内の *.lib ファイルを(Visual Studioのインストール先)¥VC¥lib¥gslの中にコピー

    *.exp ファイルは、ふつう使いませんが、とりあえず一緒にコピー

  • 動的ライブラリ(*.dll)の配置gsl.dll と gslcblas.dll を実行PATHの通った所に置く。定番の場所は、

    今後よく使うようなら、C:¥WINDOWS¥system32 内へコピー。• この場合、一度だけコピーすればよい。

    たまにしか使わないようなら、先にプロジェクトを作製(次頁以降)し、コンパイルしてから、生成された実行ファイル(*.exe)と同じ場所へコピー。

    • プロジェクトフォルダ内の、debug ないし release というフォルダである。• この場合、新しいプロジェクトを作るたびに、DLLをコピーして入れる必要がある。

    又は system32 へ

    gsltestというプロジェクトで使用する例

  • Visual C/C++での設定概要以上で、GSLの使用準備は完了。続いて、 Visual C/C++での作業となる。

    1. 新規プロジェクトを作製2. C/C++のプログラムソースを作成

    (使用する関数のヘッダファイルをインクルードする)3. プロジェクトのプリプロセッサを設定4. 静的ライブラリを設定5. コンパイル6. (必要なら)DLLを実行フォルダにコピー7. 実行これらの設定は、新規プロジェクトを作製するたびに行うこと。3番以降の手順は、DebugからReleaseに切り換えたときも設定し直すこと。

  • プログラミング

    プロジェクトを作成する

    拡張子*.c ないし *.cpp のプログラムを作製使用する関数のヘッダファイルをインクルード#include とします***のところは関数の説明書で調べること(gsl_matrix.hなど)

  • プリプロセッサの設定

    「プロジェクト」メニューから「プロパティ」を開く

    「構成プロパティ」→「C/C++」→「プリプロセッサ」「プリプロセッサの定義」に ;GSL_DLL を追加

    プロジェクトにC/C++のソースファイルを追加してからでないと現れない

  • 静的ライブラリの設定「プロジェクト」メニューから「既存項目の追加」して

    ライブラリフォルダに保存してある*.libファイルをプロジェクトに追加

    gsl.lib GSL基本ライブラリ:必須gslcblas.lib 線形代数ライブラリ:必要に応じて

    (BLAS = Basic Linear Algebra Subprogram)

    gsl.expgslcblas.expgslML.libgslcblasML.libは、特殊なプロジェクトで使います。とりあえず無視。

    プロジェクトのプロパティで設定する方法もあるけど、難しいので説明省略します。

    ドラッグ&ドロップでも追加できます

  • サンプルプログラム#include #include #include #include

    intmain (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に付属していたサンプルです。

  • 配布上の注意

    プログラムが完成し構成を「Debug」から「Release」に変えたなら、プリプロセッサの設定で ;GSL_DLL を追加し直す。コンパイルした実行ファイルを、人に渡すときは、実行ファイルと同じフォルダにgsl.dllとgslcblas.dllを入れてあげるとよい。

  • 本稿での開発環境

    この文章は以下の環境に基づいて執筆した

    Microsoft Windows XP SP2 ProfessionalMicrosoft Visual C++ 2005 Express Edition

    他のバージョンではフォルダ名や、メニューの名前が異なるかもしれない。

  • 参考サイト

    GSL公式サイトhttp://www.gnu.org/software/gsl/産総研 富永氏による説明書の和訳http://www.cbrc.jp/~tominaga/translations/index.php

    http://www.gnu.org/software/gsl/http://www.cbrc.jp/~tominaga/translations/index.php

  • Numerical RecipesについてNumerical Recipesの公式サイトhttp://numerical-recipes.com/

    Numerical Recipes in C の英語版は無料でダウンロードできます。Numerical Recipes in C++ は書籍販売のみ。掲載しているソースコードは$65で販売。

    研究室にNumerical Recipes in C の日本語版書籍があります。

    原著の第1版の本文+第2版のコード相当。英語の直訳が多く読みにくい。

    数値計算アルゴリズムの教科書としてはよいと思うのですが、ネットで検索すると、けっこう批判意見も見つかるのが気になります。

    Why Not Numerical Recipes? など(和訳) http://nakano.webmasters.gr.jp/nr.htmlまあ、それだけ大勢に利用されている証拠でもある。

    対抗品

    http://numerical-recipes.com/http://nakano.webmasters.gr.jp/nr.html

    GSLを使ってみよう「車輪の再発明」をしていないか?数値計算の場合・・・GSLって?信用できるだろうか?入手方法展開ヘッダファイルの配置静的ライブラリ(*.lib)の配置動的ライブラリ(*.dll)の配置Visual C/C++での設定概要プログラミングプリプロセッサの設定静的ライブラリの設定サンプルプログラム配布上の注意本稿での開発環境参考サイトNumerical Recipesについて