波飛沫に霞む
および(その2)ではグラフ描画のためのdrawパッケージ以外にもdistrib, descriptive, lapackというパッケージを読み込んで使用しています。これらのおかげで随分と簡単に今回のプログラムを記述することができました。そこで今回使用した関数と関連する話題をまとめました。
まずはサイズの大きな行列の固有値を数値計算で求めるためにlapackパッケージのzheev()を使いました。Maximaには行列の固有値を求める方法がいくつもありますから使い分けも含めて簡単に紹介します。
- eigenvalues() (eigenパッケージ)
Maximaで固有値を求める関数としては普通このeigenvalues()が紹介されます。この関数は与えられた行列について数式として特性多項式を求めてから、それを数式処理で解く関数solve()に渡して解を求めます。この解が元の行列の固有値となります。今回作った1000x1000行列の特性方程式は1000次の多項式ですから数式処理では全く解けません。 - eigens_by_jacobi()
行列が実対称行列である場合、固有値を数値計算で求めます。今回は複素数が登場しますし、対称ではないので使えませんでした。 - dgeev() (lapackパッケージ)
行列が正方実行列である場合、固有値を数値計算で求めます。今回は複素数が登場するので使えません。 - zgeev() (lapackパッケージ)
行列が正方複素行列である場合、固有値を数値計算で求めます。今回、これを使うこともできました。 - zheev() (lapackパッケージ)
行列が正方エルミート行列である場合、固有値を数値計算で求めます。固有値は実数として求まります。今回はこれを使いました。
drawパッケージはMaximaでグラフを描くためのパッケージです。(その1)や(その2)のMaximaのプログラムを見るとヒストグラムを描くためにdraw2d()が使われているのですが、その引数の中にhistogram_description()という関数が登場します。 しかしMaximaマニュアルのdrawのページにはこの関数は記載されていません。
histogram_description()はdescriptiveパッケージで定義されている関数です。目的はもちろんヒストグラムを簡単に表示することです。生のサンプル数値データ及び横に棒を何本並べるか(nclassで指定します)を指定すれば、残りの処理は全自動で行われます。またfrequency=densityと指定するとヒストグラムの面積が1になるように正規化してくれます。色々と便利です。ちなみにdescriptiveパッケージには記述統計と呼ばれる分野の関数とそのグラフ化のための関数が含まれます。
最後はdistribパッケージです。このパッケージには確率分布に関する関数が収録されています。正規分布をはじめとする様々な確率分布関数が組み込まれています。今回使用したrandom_normal()もこのパッケージに含まれています。シミュレーションなどを行うためには特定の分布に従った乱数を発生させることが必要です。そのような場合にこのパッケージを探せば必要な確率分布関数が見つかるでしょう。
(このシリーズ、終わり)