数値計算ツール

大石 進一
Shin'ichi Oishi

2000年11月26日

(URIはhttp://www.oishi.info.waseda.ac.jp/~oishi/FAQ/numtool.html)

数値計算に関連するサイトを紹介しよう。よくある質問とその解答のサイトとして FAQ Numerical Analysis and Associated Fields Resource Guide がある(これは最近移転したがここからたどれる)。この中には数値計算パッケージや数値計算ソフトウエアへのリンクもあり、様々な数値計算ツールを揃えるのに便利である。 また、最適化に関連する数値計算のサイトとしては Bibliography for Optimization with Sensitivity Analysisがある。

1.  数値線形代数の直接解法ライブラリ

まず、線形計算のためのツールとして、メモリ階層(キャッシュヒット率)を考えた、 信頼性のあるパッケージとしてLAPACK(レイパックと発音する)がある。 これは、Oak Ridge National Laboratory,Knoxville, TennesseeとAT&T Bell Laboratories, Murray Hill, NJに置かれている Netlib サイトからダウンロードできる。日本のミラーサイトとしては phase がある。LAPACKのユーザ マニュアル第3版がある。第2版は日本語訳がある。LAPACKはもともとFORTRANで書かれているライブラリであるが、 CLAPACKはそのC版である。LAPACKはCPUによる違いをBLAS(Basic Linear ALgebraic Subprograms)によって吸収してある。すなわち、 線形代数の基本演算をBLASの関数にし、これを標準化している。そして、LAPACKの関数をBLASを用いて書くことによってポータブル化を実現している。自分の使用するCPUに対して最適化されているBLAS(アセンブラ)を用いることによって、Cで書かれたBLASを 用いた場合の十倍程高速化が達成されている。線形方程式の直接解法に関しては、最適化BLASとLAPACKの組み合わせは、最も 優れた組み合わせの一つとなる。Pentium II上のLinux用の最適化 BLASがある。 現在はまだPentium III用のBLASは開発されていないようである(最近ベータ版が出た)。Cのコンパイラの 特性を考えてループ展開などの技法を駆使して、Cで書かれているにもかかわらず、コンパイル時にループ展開の数などのパラメータを 最適化することによって最適化BLASに匹敵するオブジェクトコードを生成する試みもある。 ATLASPHIPACK などである。尚、PHIPACKは dgemmという行列の乗算プログラムだけが対象にされている。原理的には、どのようなCPUとOSであっても、Cコンパイラがあれば、 CでかかれたATLASやPHIPACKをコンパイルするだけで最適化BLASに匹敵するコードが得られる。線形代数計算の直接解法に関しては 最も高速で、信頼性を求めるならLAPACKと最適化BLASを実装するのが有力な解となる。 LAPACK++はC++ versionであるが、LAPACKの一部の関数しか実装されていない。また、分散コンピュータ上のLAPACKとして ScaLAPACKが開発されている。数値計算パッケージの紹介としてはつぎのようなサイトもあるGAMS List of Packages

注意

  1. 数値計算のコードを載せた魔ニして、しばしば利用される向きのあるNumerical Recipesは数値計算の専門家でない著者による 書であるが、つぎのような批判Why not use Numerical Recipes他 がある。これらの批判は載せてあるコードが最適なものに比べて実行速度が数十倍遅く、 また、信頼性も低い場合があるという点に集中している。 Netlibなどの他の優良なソフトを利用すべきであろう。

  2. ここでは反復解法は扱わないが、 数値線形代数の反復解法のサーベイがある。

2.  数値計算パッケージ

LAPACKなどの数値計算ライブラリは高速、高信頼であるが、CやFORTRANから呼び出して使うので、 プログラム開発に時間がかかる。 そこで、LAPACKなどのライブラリを基礎にして、使い易いGUIをもたせた数値計算用インタプリタパッケージが開発されている。 The MathWorks, Inc.から発売されているMatlabはその代表である。 欧米では、研究者から、学生までこのようなパッケージを利用して数値計算をするのが 一般的である。

MATCOM(Matlab to C++ Compiler)はMatlabからC++へのコンパイラ、 すなわちMatlabコードからMEXファイルあるいはC++コードを生成するフリーなツールである。 生成されたC++コードを最適化されたC++コンパイラでコンパイルするとMatlabより数段高速なコードとなる。 MATLIBはMatlabコンパチなC++行列クラスライブラリである。同じサイトからダウンロードできる。 W. KahanによるMatlab's Loss is Nobody's Gainは Matlabに対する面白いコメントである。

また、つぎのようなフリーなパッケージソフトがある。 筆者の感覚では、まず、1と2が推奨される。

  1. Octaveは MATLABに最も近いMATLABクローンである。Linux用のソフトであるが、Windowsに実装することもできる。 まだ、オブジェクトプログラミ ングが実装されていない点ではMATLABに譲るが、 線型方程式の解や固有値を計算する組み込み関数の計算速度、信頼性ではMATLABに勝るとも劣らないと思われれる。 グラフィックスはgnuplotを利用している。また、ATLASを使ってOctaveを高速化することもできる (Tuning up Octave by ATLAS)。Octave2.1.xxはATLASに対応している。これについては、既に別に述べたので参照されたい。 ATLASによる高速化の効果は大変大きく、Alpha/EV56/533MHzで、2つの1000x1000行列の積の計算に reference BLAS(Cで書かれた高速化していないBLAS)とOctaveの組み合わせでは54.7秒かかっていたものが、 ATLASを使うと4.0秒で計算できるようになったとの報告が書かれている。
  2. Scilabは typed listによりオブジェクト指向プログラミ ングができる環境があり、MATLABクローンとしては一番完成している。 グラフィックスも独自の優れたものが実装されている。MAPLEとのリンクもできる。LinuxでもWindowsでも実装できる。
  3. Telaは大規模数値計算のプロトタイピング言語となることを目指して作られており、 グラフィックス、線形代数、FFTなどを 装備して偏微分方程式を解くことを念頭にしている。
  4. RLaBは行列数学用パッケージ。
  5. Eulerは実数、複素数、区間などを扱えるMatlabクローンな言語。 Linux版はフリーで、Windows版はシェアウエアである。
  6. ProphetはUnix上のライフサイエンス用言語。
  7. Yorickは型チェックをしないCライクなLinux上の数値計算 インタプリタ言語。
  8. SpYorickはYorickのプラグインで疎行列処理をする。
  9. PETScはMPIを用いた偏微分方程式の並列数値計算用のツール。unix上の CやC++から呼び出して使う。
  10. Ascendはフリーな強い型付けされたオブジェクト指向モデル記述言語。
  11. Algae(Alkiが前身)は疎系に対してMatlabより高速であることを ねらったMatlabクローン的なインタプリタ数値計算言語。
著者は、MatlabとOctaveとScilabを利用している。Matlab互換のScilabによる線形連立方程式の解法の例を次に示す。

-->A=[1 2;2 1]

A =

! 1. 2. !

! 2. 1. !

-->b=[1;1]

b =

! 1. !

! 1. !

-->x=A\b

x =

! 0.3333333 !

! 0.3333333 !

-->A*x-b

ans =

! 0. !

! 0. !

このように非常に簡単に(かつ高速に)線形方程式が解ける。詳細は著者によるMatalab, Octave, Scilabの使い方の htmlファイルなどを参照されたい(そのテキストも出版された[9])。

Demmelの著書[10]のMatlabコードがあるのでよいプログラム例として参考にされたい。

References

[1]
柏木雅英: ``精度保証付き数値計算[1]-区間解析'',シミュュレーション18 4, 261/267 (1999)
[2]
大石進一: ``精度保証付き数値計算[2]-線形方程式の高速精度保証とプログラミング技法'',シミュ ュレーション19 1, 39/45 (2000)
[3]
神澤雄智、相馬隆郎: ``精度保証付き数値計算[3]-常微分方程式の精度保証'',シミュ ュレーション19 2, 30/35 (2000)
[4]
中尾充宏: ``精度保証付き数値計算[4]-偏微分方程式の精度保証'',シミ ュレーション19 3 (2000)
[5]
大石進一: 非線形解析入門、コロナ社(2000)
[6]
中尾充宏、山本野人: 精度保証付き数値計算、日抹]論社(1998)
[7]
大石進一: 精度保証付き数値計算、コロナ社(2000)
[8]
大石進一: 数値計算、裳華房(1999)
[9]
大石進一: ``Linux数値計算ツール'',コロナ社(2000.9)
[10]
J. Demmel: ``Applied Numerical Linear Algebra'', SIAM (1997)
[11]
Shin'ichi Oishi and Siegfried M. Rump: ``Fast verification of solutions of matrix equations'', submitted to Numer. Math..
[12]
Nicholas J. Higham: ``Accuracy and Stability of Numerical Algorithms'', SIAM (1996).
[13]
Shin'ichi OISHI: ``Fast Enclosure of Matrix Eigenvalues and Singular Values via Rounding Mode Controlled Computation'', to appear in Linear Algebra and its Applications




File translated from TEX by TTH, version 2.80 and modified by Oishi.
On 26 Nov 2000, 23:09.

©Oishi Shin'ichi, Waseda University