だいぶん前に買っていた本だが読んでいなかった。コロナ禍で在宅勤務が増えたからか、
MATLAB 最新バージョンをお試しで使えるようになっていたのでこの機会に使ってみようと思い、
以前に買っていたこの本で MATLAB を勉強した。お試し期間が終わった後は、
MATLAB 互換のフリーウェアである GNU Octave を使った。
MATLAB/Octave を使ってみると、行列を使うことを前提とした独特のプログラミングのコツが
必要とされることがわかった。これも慣れてみると面白い。
MATLAB と Octave では微妙な違いもある。
Octave が MATLAB を追いかけているようなものなので、Octave の方がやや性能が劣るかというと
必ずしもそうではないところが面白い。たとえば、常微分方程式を解くソルバーは、Octave の標準は
LSODE (Livermore Solver for Ordinary Differential Equatoins) なのだが、
これは MATLAB には装備されていない。
教科書としての特徴は、数値計算を学ぶときに、お手軽に使える MATLAB を使って、少しずついろいろ試してみましょう
というものだ。私が学生の頃は、数値計算の授業はふつうの講義だったが、今時は MATLAB などを使って、簡単にいろいろ
試しながら行くのかもしれない。確かに便利である。本書の MATLAB に関する記述は簡潔で、全容を勉強するというよりは、
いろいろな例で慣れていきましょうという書き方である。
数値計算の記述の方は、項目は初学者向きだが、説明は簡潔過ぎて不親切なところも多い。これは、講義テキスト用として
書いてあり、講義で補足することが前提で、自学自習用とは考えていないのかもしれない。
そのほか、式の誤りが散見される(以下の「細かい点で気づいたこと」参照)。
3.3 の Padé 近似のあたりは、著者の専門に近いらしく、やや高度な内容が入っている。
5 章の共役勾配法までがメインらしく、6 章以下はかなりおざなりな感じになっている。6 章の固有値問題は
かなり不親切で、いろいろな記述が論理的につながっておらず、これだけ読んでわかる人はいないだろう。
内容としては行列計算関係が多い。だから MATLAB を使っているのか、MATLAB を使うからそうなるのかもしれない。
地球科学者のための数値計算のような授業があるとすると、まず微分方程式から行くような気もするが、
この教科書では微分方程式の記述はわずかで、MATLAB に備わっているソルバーの紹介だけにとどまっている。
細かい点で気づいたこと
この本(第7刷)で MATLAB ではすでに古くなっていること
以下のコマンドは R2020a 版を使うと、使うなという警告が出る。
しかし、Octave では普通に使える。
- 簡単に数式のグラフを描くための ezplot (p.52 など) は、代わりに fplot を使うように警告される。Octave では使える。
- 数値積分を行う quad (p.224 など) は、代わりに integrate を使うように警告される。
しかし、Octave では標準。かといって、Octave の方が単純に MATLAB に追いついていないというわけでもない。
MATLAB の quad は適応 Simpson 法だが、Octave の quad は Gauss 求積法による。
分かりづらい点
- p.121 の「形式的直交多項式」を定義しているところで「< ψ, φ > が内積の条件を満たしていない場合であっても」
と書いてあるが、内積はその8行前で定義してあるので、満たしているのかいないのかはわかっているはずで、それを書いていないということに
私は戸惑った。さらに内積の公理をどう満たしていないことを許容するのか書かれていない。
後まで読んでみると、「5.3.3 の共役勾配法」のところで、こことは違う内積もどきを定義していて(こちらは内積の公理を満たさない)、
ここ 3.3.3 の結果を使っているため、それを意識しているからだと推測できたのだが、それならそうとこの時点ではっきり書いてもらわないと困る。
- p.122 (3.7) と (3.8) の間の式で γ0 = 0 としている理由の説明が不親切である。
「φk+1 と φ0 の内積を取ると、
< φk+1, φ0 > = γ0 < φ0, φ0 >
となる。」としてあるが、これはすぐには導かれない。その間に1ステップあって
「φk+1 と φ0 の内積を取ると、
< φk+1, φ0 >
= ξk < z φk, φ0 >
+ γ0 < φ0, φ0 >
であるが、< z φk, φ0 > = < φk, z φ0 > = 0
なので、
< φk+1, φ0 > = γ0 < φ0, φ0 >
となる。」と書くと親切である。内積(もどき)ならばいつでも < z ψ, φ > = < ψ, z φ > が成り立つというわけでもないので、
これは書いておかないといけないことだと思う。
- p.124 で < ψk+1, z ψk > = 0 が成り立つ理由が書かれていない。
しばらく理由が分からなかったが、これも < z ψ, φ > = < ψ, z φ > を使う必要がある。
< ψk+1, z ψk >
= < z ψk+1, ψk >
= - (1/αk+1) < ϕk+2 - ϕk+1, ψk >
= 0
最後の等号は ϕk が k-1 次以下の多項式と直交することから導かれる。
- pp.135-136 で Householder 変換の幾何学的な意味があまり書かれていない(図 4.6 が不親切)。
私は鏡像変換だと知っていたのだが、初学者にはわからないだろう。
- 第 6 章の固有値問題は、著者のメモに近いもので、これを読んだだけで分かる人はいないだろう。
QR アルゴリズムがどういうふうに固有値を求めていくアルゴリズムなのか全く書かれていないし、
Lanczos 法も何が良いのか全く書かれていない。
ミスプリ(第7刷)
- p.120 の 3.3.2 節の4つ目の式で「k=1,2,...」となっているのは、「k=0,1,2,...」の誤り。
- p.123 の (3.10) の前の式の中で、φ(z) に下付き添え字の m が抜けている。
- p.123 の (3.11) と (3.12) の間の文で、「式 (3.8) から」は「式 (3.10) と (3.11) の間の式から」の誤り。
- p.131 の s の定義式で、分母が和記号の外に出ているが中に入っているべき。
- p.131 の一番下の式(誤差の分散を考慮した正規方程式)で、右辺の D は D2 の誤り。
- p.180 の mat2CRS のプログラムの中で for i = 1:n は for i = 1:m とすれば正方行列でなくても"正しく"動作する(ただし、もともと CRS 形式は正方行列しか想定していないので、間違いではない)。
- p.191 の1行目の x(2か所)は、x0 が正しい。
- p.193 (誤)個体物理(正)固体物理
- p.214 の Durand-Kerner 法の反復公式の中の x は xk(0) の誤り。
- p.215 の Durand-Kerner 法のプログラムの中の df0=polyval(df,x0); の行は不要(df も定義されていないので、消去すべき)。
- p.215 の Durand-Kerner 法のプログラムの中の s(k)= の行で積が .* になっているが、スカラーどうしの積なので * で良い。
誤りと思われる点(第7刷)
- p.169 「5.3.4 前処理」のところで、C = M2 と分解できる行列を使っているが、
この例として用いられている不完全コレスキー分解の場合は C= M MT という分解である。