2011年8月4日木曜日

オイラー・丸山法とPythonのMatplotlib

MatplotlibはPython向けの2次元プロットライブラリ。Wikipediaの記事「Euler-Maruyama method - Wikipedia, the free encyclopedia」(確率微分方程式の数値解法「オイラー・丸山法」)の、サンプルプログラムの中で使われていたので、インストールすることになった。

以下、Mac OS 10.6.8にMatplotlibをインストールして、Wikipediaのサンプルプログラムを実行したという話。

Matplotlibのインストール

Mac OSの場合、特にMacPortsやHomebrewなどのパッケージ管理ソフトを使っているとインストールがうまくいかないことが多いらしい。というのは、Matplotlibが最新の共有ライブラリにリンクされずに、パッケージ管理ソフトであらかじめ導入されていた別の共有ライブラリにリンクされる、といった現象が起こりやすいから。開発者の人も認識しているようで、README.osxというファイルに"Building mpl on OSX has proven to be a nightmare because of all the different types of zlib, png and freetype that may be on your system."と書いてあった(まるでナイトメアらしい)。

Mac OS X 10.6.8 (Darwin 10.8.0 x86_64) では、次の手順でインストールができた。

1. PythonとNumPyを確認

前提条件として、Python 2.5以上と、NumPyモジュール(version 1.1以上)が必要とのこと。これは以下のコマンドで確認できる。

$ python --version
Python 2.6.1
$ python -c "import numpy;print numpy.__version__"
1.2.1

自分で入れたのか最初から入っていたのか記憶が無いが、とりあえず自分の場合はすでに必要なものがインストールされていた。

2. githubからMatplotlibを取得
$ git clone https://github.com/matplotlib/matplotlib.git
3. make.osxの一部を書きかえる
$ cd matplotlib
$ vi make.osx
$ git diff make.osx
diff --git a/make.osx b/make.osx
index 4639eac..8dc60c7 100644
--- a/make.osx
+++ b/make.osx
@@ -3,6 +3,7 @@
 # make -f make.osx PREFIX=/Users/jdhunter/dev PYVERSION=2.6 fetch deps mpl_install
 # (see README.osx for more details)
 
+PREFIX=/usr/local
 MPLVERSION=1.1.0
 PYVERSION=2.6
 PYTHON=python${PYVERSION}
@@ -16,8 +17,8 @@ ARCH_FLAGS=-arch i386 -arch x86_64
 # but the download URLs are subject to change.
 
 ZLIBVERSION=1.2.5
-PNGVERSION=1.5.1
-FREETYPEVERSION=2.4.4
+PNGVERSION=1.5.4
+FREETYPEVERSION=2.4.6

変更点は3つ。第一に、共有ライブラリのインストールパスを"/usr/local/lib"にしたいので、PREFIX=/usr/local を追加。それから、libpng と freetype のバージョンを現時点で最新の番号にした。

4. makeする
$ make -f make.osx fetch deps mpl_install_std

これを実行すると、fetch, deps, mpl_install_stdという3つのターゲットが処理される。fetchがzlib等のライブラリのソースをダウンロードしてきて、depsがライブラリのコンパイルとインストールをして、最後にmpl_install_stdがMatplotlib自身のコンパイルとインストールを行う流れ。

完了したら、/usr/local/lib/Library/Python/2.6/site-packages/matplotlib を確認してみる。

$ ls -t1 /usr/local/lib/
libz.1.2.5.dylib
libz.1.dylib
(略)

$ ls -t1 /Library/Python/2.6/site-packages/matplotlib
mlab.pyc
mpl.pycf
offsetbox.pyc
(略)

$ otool -L /Library/Python/2.6/site-packages/matplotlib/_png.so
/Library/Python/2.6/site-packages/matplotlib/_png.so:
 /usr/local/lib/libpng15.15.dylib (compatibility version 20.0.0, current version 20.0.0)
 /usr/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
 /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)

ポイントは(1)共有ライブラリができていて、(2)matplotlibのモジュールができていて、(3)モジュール内の共有ライブラリが(1)の共有ライブラリに依存していることの3つ。

オイラー・丸山法

常微分方程式の世界における「オイラー法」に対応するのが「オイラー・丸山法」らしい。「丸山」のフルネームは丸山儀四郎。

Euler-Maruyama method - Wikipedia, the free encyclopedia のExample code(Python)をそのままコピー&実行するとグラフができる。

コードでrandomとか使ってるからあたり前だけど、「実行する度に結果が変わってOK」という考えが新鮮。これまで確定的な微分方程式の数値計算しか扱ったことが無かったので変な感じがする。

ざっと検索したところ、普通のプログラミング環境ではなくエクセルを使って計算する人もいる(そういう方向性の本が出版されている)。

0 件のコメント:

コメントを投稿