戸川隼人「マトリクスの数値計算」オーム社

Matrix Computation

(絶版) [ Amazon ] ISBN 4-274-07008-5, \4301 + TAX

 Wikipedia風に本書の著者紹介をすると次のようになる。

戸川隼人(1936 – 2015) 1958年早稲田大学第一理工学部数学科卒,1971年まで科学技術庁航空宇宙技術研究所(現JAXA)研究員,1976年まで京都産業大学助教授→教授,2000年まで日本大学理工学部数学科教授,その後,尚美学園大学,サイバー大学で教鞭を取る。数値解析,数値計算,プログラミング, CG,情報処理全般の著作多数。

 理工系大学・専門学校でプログラミングを学んだ,現在40歳以上の元学生の諸氏は,C, Fortran, Visual Basic等のテキストの著者として認知しているのではないかと思われる。特にサイエンス社からは多数の書籍を出しており,関連会社の数理工学社のテキストや「数理科学」の表紙絵も描いていた。個人的には器用で世渡りのうまいタイプの秀才だったという認識を持っている。

 本書は著者自身による著作リストにも入っていないオーム社からのロングセラーで,ワシの手元にあるのは平成4年(1992年)の「第1版第17刷」である。現在は絶版品切れ状態だが,21世紀になってもひょっとしたら生き残っていた可能性もある。第1刷が刊行されたのが昭和46年(1971年)だから,かれこれ40年以上も継続して読まれ続けたということは,ことこの分野の書籍としては異例で,しかも第1版のまま改定もされずに生き残っていたのだから,記述そのものがそれほど古びなかった,ということである。内容は「マトリクス」(行列)ということから類推できる通り,連立一次方程式と行列の固有値問題がメインであるが,執筆当時は最先端の話題であった区間演算,キングサイズ(今でいう大規模問題)向けの計算法,疎行列の扱い・・・に加えて「高次代数方程式」(第4章),「常微分方程式の初期値問題」(第5章)まで扱っており,内外の文献を集めまくって精力的に執筆を行ったことが巻末の膨大な文献リストからも伺える。実際,現代でもこの分野の勉強の一環として本書に目を通す価値はあるだろう。但し,あくまで参考程度に留めるべきである。

 著者の履歴を眺めていて気が付くのだが,本書刊行時点ではまだ博士号を取得しておらず,母校・早大から博士論文「ロケットの運動の数値解析的研究」が認められたのが4年後の昭和50年(1975年)である。多分,本書の記述に使われた膨大な文献は,航空宇宙研在籍時からのものも含め,博士論文執筆のために存分に利用されたのだろうと推察できる。
 残念ながら,その後,本書は改版されることなく,当然その後の研究の進展も,Linpack, Eispack,そして統合されたLAPACK/BLASと派生ライブラリの高速性については全く触れられないままとなってしまった。書籍ではありがちのことではあるが,科学技術計算基盤が大型計算機からワークステーションやパソコンに移ってしまった1990年以降の技術動向を著者は全くフォローしていなかったようなのである。

 実はワシはちょうどその時期に博士号の取得のために永坂秀子先生の実質的な指導の下,著者に主査をお願いしていたのだが,研究そのものについての役立つアドバイスは皆無であり,博士号取得の要件となる査読論文はほぼ全部,ワシと永坂先生との共著として出版したものである。とはいえ,いざ博士号の審査となれば,著者の顔の広さを存分に発揮して頂き,副査として日大工学部に移っていた田中正次先生と,物理学科の川上一郎先生という大御所を付けて頂いたことは今でも感謝している。しかし,肝心の論文の中身についてのアドバイスは地に足のついたものではなく,正直イラつくことが多かった。当時は数値解析よりもCGやプログラミング言語の方に著者の関心が移っていたことも原因であろうが,やっぱり,数値線型代数に関する最新知識の習得は怠っていたのかなぁと思わざるを得ないのである。

 本書に関しては,今でも内容的に使えるところが結構ある反面,更に高度に発展した技法があり,それを取り込んだLAPACK/BLASが既に無料で入手できる状況にあることを鑑みると,歴史的価値以上のものを見出すことは難しいというのが今の偽らざるワシの感想である。理論的な記述,本書で言うとQR法の収束の解説などはさすがに心血を注いでいるだけあって分かりやすいが,同様のものは森正武「数値解析」(共立出版)にもあるので,本書が唯一無二の数値線型代数中心のアルゴリズム解説書であるという記述はそんなに多くはないのではないか。それよりは1970年代初頭の段階でのこの分野の動向,そしてその当時の著者の博覧強記ぶりを知るための歴史的資料として捉えるべきであろう。

 ワシが現在刊行を目論んでいる「LAPACK/BLAS入門」(仮)は,実は本書の記述に対する一種の「恩返し」の意味合いも込められている。まことに嫌味で反抗的だった院生として著者に対し「先生の書いた数値線型代数の技法は全てLAPACK/BLASにつぎ込まれて更に洗練されてますよ」と言いたくて書いているところもあるのだ。ちょうどその執筆に苦しんでいる時期に著者が亡くなっていたことをこの年の瀬に知ったこともあり,博士号取得に際して散々お世話になった「お礼」も兼ねてこの小文を書くことにしたのである。

[進捗報告] 関数リファレンス,参考文献,索引挿入

 最終章を書きながら前の商を見返していたのだが,関数リファレンスとしての使い勝手が悪いので,下記のような表を挿入しまくり,最終的に10ページ近く増えてしまったぞい。

2015-11-29_173518

 あと,不完全だった参考文献,索引も入れてみた。後は校正しながら書き直す程度かなぁ。

 残っている一番の問題はWindows環境でのLAPACK/BLASの使い方の解説なんだが,本家提供のWindows用が出るまで待つか,3.5.0で書いちまうか,まだ思案中なう。

 とりあえず11月末までに全部できたので,後はチマチマ直していこうっと。もう心は「多倍長数値計算入門(仮称)」に飛んでいるのであるからして~。

[進捗報告] 最終章一応完成

 Hammerstein型積分方程式の解法に衣替えした最終章,一応完成。固有値問題,連立一次方程式のどちらも使ってなおかつ平易(かな?)な問題を対象に,Derivative free解法を使う内容になったので,まぁとりあえずはおさまりがいいと思っている,思いこんでいる,思いこまなきゃやってられないと思っている。

 ふひ~,これで来週一杯かけて手直しして出版社に投げることができる。最終章を書くにあたりつたつら前の章を参照したが,思いのほかreferenceとしての使い勝手がよろしくないので,その辺りの修正がメインかしらん。あとはWindows環境だが,LAPACK 3.6.0のWindows版(ここに出るはず)が出てからにしたいなぁと思いつつ,まぁ3.5.0で困るという内容ではないので一応は使えるんだけど,Reference BLASを使うためのcblas.hとcblas_f77.hがどこにも入ってない。結局,Windows環境ではスタンダードなVisual C++で使おうとするとこれを持ってこないといかん。CBLASが同梱されている3.6.0なら楽なんだろうなと愚考する次第。まぁ後はタイミングの問題かな。

 つーことで1年かかってようやっとここまでこれました。A4サイズで111ページってのはちと少ないかなぁと思いつつこの辺りでやめておかないとA5にした時に200ページ越えちゃうぞと。

 風邪ひいて死にそうなのでまずは寝ます。

[進捗報告] LAPACK 3.6.0 Released and how to install

LAPACK 3.6.0が出たので早速試す。今まで別パッケージだったCBLASが同梱されているので,ソースからコンパイルした素のLAPACK/BLASを使いたい場合は重宝しそう。

 以下インストール方法 with gfortran & gcc or ifort & icc on Linux

1. lapack-3.6.0.tgzをダウンロードして適当なディレクトリに置く
2. 解凍 -> lapack-3.6.0ディレクトリ生成 -> lapack-3.6.0へ移動(以下,カレントディレクトリを./と表記)
3. ./INSTALL/make.inc.gfortran (gfortran & gcc用) or make.inc.ifort (ifort & icc用)を./make.incにコピー
4. cd BLAS/SRC; make でBLASコンパイル -> librefblas.a生成
5. cd ../../; cd SRC; make でLAPACKコンパイル -> liblapack.a生成
6. cd ../; cd TESTING; make でLAPACKテスト -> libtmglib.a生成
7. cd CBLAS; make でCBLASコンパイル -> libcblas.a生成
8. cd ../../; makeLAPACKEコンパイル -> liblapacke.a生成

 ちなみに,5と6は./でmakeでもO.K.

 gfortranの場合,TESTINGのコンパイル時にetime関数がないとうエラーが出る。その時にはmake.incで”TIMER = NONE”を指定しておく。副作用として時間計測はできなくなる。

[進捗報告] 最終章プログラム開発完了

 Gauss-Legendre積分公式の導出(DGESY関数使用),積分方程式の離散化とDerivative-free解法の実装(DGETRF & DGETRS関数使用),ついでにOpenMP並列化も行って高速になることも確認したのでとりあえずこれにてプログラム開発は終了。

 文章はまだ7割方しか埋まってないが,まぁベンチマーク結果を入れてとりあえず明日中には上がりそう。固有値計算+連立一次方程式+OpenMP並列化と3拍子揃ってまとめられたのでなんとか安心できそう。

 つーことで,残りは頭からの見直しをしつつ

  • Windows環境でコンパイル(Windows用Intel C++どっかに落ちてない?)するための解説
  • 索引づくり

かなぁ。MacOS Xは無視する(メンドクサイ)。