- 戸川 隼人, 1976: 数値解析とシミュレーション (共立全書 211 ΣΤΑΜΠ)。共立出版, 141+iii pp.
1990年代、同僚がこの本を学生に勧めていた。その人は、フィールド地球科学をやっていたが、この本を読んで計算機も使おうと思ったのだそうだ。
わたしはこの本をまだ読んでいなかったが、著者名は知っていた。わたしが店頭で内容を見て選んだ本がこの著者の著書だったことが何度もあった。その多くは、数値計算方法(本書でいう「数値解析の第1の意味」)の実用的教科書だった。「数値計算技法」「微分方程式の数値計算」「マトリクスの数値計算」などの書名を覚えている。とくべき問題に対して、複数の手法を提示し、精度や計算量(計算時間)・必要記憶容量などで手法の長所短所を比較していた。ソースプログラムそのものではないがそれにおきかえやすい形でアルゴリズムを示していた。また、「計算機のための誤差解析の基礎」など、近似のよさを数学的に評価する、本書でいう「数値解析の第2の意味」の本もあった。1990年代当時の新しい著書には、数値計算方法の教科書もあったが、Fortran, Cをはじめとするいろいろなプログラム言語によるプログラミング入門書をいくつも出していた。
1990年代に、この本は店になかったが(注文すれば買えたかどうかは知らない)、図書館で借りて読んだ。たしかにおもしろい本だった。ただし、技法の教科書としては、多くの項目をつめこみすぎで、各項目の記述が短く、理解するのにはほかの本も読まないといけないかもしれない。発想の本としても具体例がおもしろいのは初めのほうだけかもしれない。しかし、力学と電気など物理学的には違うが数学的には同じ問題があるという指摘は有意義だろう。
プログラム例の提示のしかたがうまいと思った。変な入力への対応などの配慮が乏しいのでそのまま実用になるかは疑問だが、最小限に近い行数で、動くプログラムを示していることが多い。著者はかつて個人ウェブサイトで著書の関連情報を提供しており、本書のページ http://nyan11.ciao.jp/B/NA/KZ211/ にはソースプログラムもあったと思う。しかしそのウェブサイトはもうなく、web.archive.org にはそのサイトのページがいくつかあるものの本書のページは見あたらない。
ただし、本書のプログラム例は、Fortranなのだが、言語仕様が 1960年代当時 FORTRAN IV,のちにFortran 66と呼ばれたものだ。わたしは、1990年代の教材としてこれではスタイルが古すぎると思ったので、Fortran 77 に DO … END DOを加えた構文で書きなおしてみた。[このウェブページ]にアクセス制限つきで置いてある。
2000年代になって、物質・エネルギー循環系でもありフィードバックシステムでもあるシステムの例としての、いわゆる「ふろおけモデル」[教材ページ]を説明しようとして、この本の最初の具体例がそれと同じものだったのを思い出した。3.1節のもので、「水時計」とされている。たまった水の質量と水位の関係と、水位と流出速度の関係を、いずれも任意の関数形として問題を定式化したあと、単純に比例する場合に限定してプログラムを提示している。この提示のしかたはうまいと思った。
ここまでわたし個人の本書との出会いを書いてしまったが、ここから本書に即して書いてみる。
あとがきで説明されているが、本書は共立出版から出ていた雑誌「bit」の1974年3月号から1975年2月号まで連載された「数値計算のフィロソフィー」という記事をもとにしている。ただし単行本にまとめなおすときに、プログラム例(日立製作所主催の講習会用に作成したもの)を加えたかわりに、「肩のこらないおもしろい話や「フィロソフィー」は影が薄くなった」そうだ。
本書の趣旨はまえがきにも説明されているが、2.1節「数値解析とは何か」のほうが明確だと思う。「数値解析」ということばは、だいたい次の3つの意味で使われてきた。
- 1. 計算機を使った数値計算で(応用)数学的問題の答えを得る方法
- 2. 数値計算に関する数学的理論、数値計算を題材とした解析学
- 3. (解析的方法に対して)数値的方法、シミュレーション(数値実験)
従来の数値解析の本は第1主題が多いのだが、本書では、第3主題を中心に、第1、第2を加味した。
著者は「計算機は「数学のあとしまつをする機械」ではない。実験の道具として使え!」という主張をもっている。ここでいう「実験」と「シミュレーション」とは同じ意味で使われているようだ。本書では、工学・理学の現場で現われる問題をとりあげ、プログラムを作り、計算機にかけてみる、というスタイルをとった。(読者からみると、第3章はそうなっているが、第4章以後は(おそらく連載記事はそうだったのだろうがプログラム例をふやした結果)「第1主題」の本に近づいてしまったと思う。)
第1章「計算機入門」。1.1節「計算機」では、小石、算木、ソロバン、パスカルの計算器、バベジの自動計算機、リレー(継電器)計算機、そして、電子計算機という歴史をたどる。電子計算機が広く使われるようになったのはアメリカで1955年ごろ、日本で1960年ごろだった。Fortranでプログラムを書いて計算センターにもっていくというスタイルが普及したのはアメリカで1960年ごろ、日本で1965年ごろだ (これを「ごく最近」と言っている。そのころに書かれた講習会教材の文章なのだろう)。1.2節「FORTRAN」ではプログラム言語Fortranが紹介される(文法の要約は巻末の付録3)。1.3節は「アルゴリズム」。
第2章「数値解析とシミュレーション」。2.1節についてはすでに述べた。2.2「シミュレーションとは何か」で具体的に取り上げられているのは地球物理の流体(大気・海洋・陸水)の話題だ。
まず、大西 行雄さん(京都大学 地球物理学教室。もとは数学を学んだ人だそうだ)による、琵琶湖の水温が急激に変わった現象を、湖面が風を受けたことによる「静振」で説明するシミュレーションの話。琵琶湖の断面を格子状に細分し、格子点における水圧、密度、流速などを未知数とする方程式をたて、振動解を仮定して解く。Computation and Analysis [Analysitとあるが誤植だろう] vol. 5 no. 1 (1973)に論文が出ているそうだ。
それから「黒潮のシミュレーション」の話があるが、途中から、「プリンストンのブライアンと真鍋の研究」(海洋大循環のシミュレーション)の話になっている。
そして気象のシミュレーションの話になる。Richardson (1922年)の本について「実用にならなかったが、当時の気象学者に夢と希望を与えた。」と言う。また脚注に
そればかりでなく、当時リチャードソンが考察した計算技法の数々は、今日でも広く使われている。特に、リチャードソンの補外と呼ばれる方法は、微分方程式の数値解の精度改善にきわめて有効である。
とある。それから次のように語っている。
1945年、計算機が誕生すると、気象学者たちは早速、大気の運動方程式の計算を試みた。… 解が非常に不安定で、異常に振動したり発散したりしてしまう。物理学者たちはここで、「単純な考えで構成した近似解法が100%成功するとは限らない」という教訓を得た。一方、数学者たちは、ここに新しい問題の宝庫を見出した。J. フォン・ノイマンをはじめとする数学者たちによって、計算が脱線する原因が解明され、安定性の理論が作られ、安定性が強くしかも効率のよい解法が続々と考案された。こうして、1955年ごろには、大気の運動がまともに計算できるようになったけれど、なんとそれまでに10年間を要しているのである。
大西さんの仕事以外の気象・海洋のシミュレーションについての参考文献は示されておらず、著者がどんな情報源によったかはわからない。
ここまではお話で、ここからが実習教材になる。
第3章「伝導、拡散のシミュレーション」。
3.1節はすでにふれた「水時計」。数値解法の考えかたを、まず次のように述べている。(細かいことだが、「Δt秒」という表現があり、次元のついた物理量と数値との区別があいまいだと思った。)
- 微小時間 Δt の間の変化に注目する
- その間の「自分自身への影響」は無視する [このように処理しても、Δtを十分に小さくとるならば十分に精度のよい結果が期待できる]
- まず「最初の状態」をもとにして、「そのΔt秒後の状態」を計算し、それをもとに「さらにそのΔt秒後の状態」を計算し、以下同様に計算を進める
次に、アルゴリズムの説明がある。【プログラム言語ではないのだが「GO TO i」という表現があり、これは(くりかえし回数の決まったDO文以外のループ構文がなかった) Fortran 66の話者らしい表現だと思った。】
演習3.2(図3.8)は、図3.2を見ると、水槽が2段直列になっていて、上の水槽の下の出口から出た水が下の水槽にはいる構造になっている。これは、水文学での流出過程(雨から川の水になるまで)の「タンクモデル」の基本構造そのものだ。ただ残念ながら、本文に図への参照以外の説明がないので、演習を実際にやってみようと思った読者以外には印象に残らないだろう。
3.2節以後、複数の水槽をつなぐ管があって相互に水が移動するような問題を想定しながら話が進むのだが、現実の水の問題との関連は薄くなっていく。
ひとつは、同じ「水槽」がたくさんならんでいる状況から、連続体の問題(の離散近似)の話になる。熱伝導、電気伝導、溶質の拡散などが同じ形になる。3.3節で1次元の問題、3.5節で2次元の問題を扱っている。
もうひとつは、「水槽」どうしの任意の対の相互作用があったりなかったりする状況で、相互作用はマトリクス[注]で表現される。「水槽」の問題としては現実的でないが、コンデンサと抵抗からなる電気回路の問題としては現実的なものらしい。
- [注] 本書では「行列」でなく「マトリクス」という用語を使っている。(「行列」は「待ち行列」を思わせるから避けたのだろうか?) ただし「行列式」は出てくることがある。
3.6節「不安定現象とその対策」は、伝導・拡散型の問題について、Δtをじゅうぶん小さくとらないと、単に精度が悪いだけでなく、数値的不安定を起こす(振動の振幅が無限に増大してゆく)という話。Δtをどのようにとれば安定かという理論的解析の紹介と、台形公式を使う方法の紹介。(ここで連立方程式をとくことから、消去法と反復法、反復法のうち「ガウス・ザイデル法」と「SOR法」ということばが出てくるが、その実質的説明は第4章にある。)
第4章「平衡状態の計算法」。時間変化のあるシステムのシミュレーションでも、定常状態が知りたいことがある。この章は現象のシミュレーションの例は最初だけで、しかもあまり現実みがない。ほとんど計算技術の話。連立1次方程式をとく。それを利用して、偏微分方程式(ポアソン方程式)の境界値問題を差分法でとく。
【わたしが勉強した1970年代後半から1980年代前半は、連立方程式のときかたは、教科書にはどちらかというと反復(逐次近似)法が重視されていたが、大型計算機を使う人のあいだでは直接法である消去法が勧められていた。メモリー容量が従来よりも大きくなったことによる時代の変わりめだったのだろう。同時期にもパソコンでやろうとすると反復法が必要なこともあった。】
第5章「振動の問題」。振動の例は、(重力のもとでの)管の中の流体、バネ、コイルとコンデンサのある電気回路など。
まず、単振動になる問題。時間に関する2階微分(位置に対して加速度)を含む微分方程式になる。
次に、多自由度の問題。例としては複数の質点がバネで連結されているもの。マトリクス表現する。
それから、連続体にもっていく。振動が空間的に伝わる波動の問題。まず時間発展をすなおにシミュレーションする。プログラム例では、文字を打つプリンタでできる範囲でがんばったグラフ表現もしている。
サイン・コサイン(あるいは複素数の指数関数)型の解を想定すると、固有値問題になる。固有値を得る計算は専門家が書いた「ライブラリー・サブルーチン」(これは本書が出たころの計算機センターで通じた表現)に頼ればよいが、説明しやすい方法として、反復法のひとつのヤコビ法を紹介している。
(固有値問題の話題の途中にはさまれて、それとの関連が明示されていないが) 高次代数方程式の解きかたの話もあり、ベアストウ法が紹介されている。
第6章。章の題名は「有限要素法」だが、6.1節「近似式の作りかた」は有限要素法に関心のない人にも有意義だ。正確に計算できない関数の近似値を得るにはどうするか。テイラー展開を適当な次数で打ち切って使う方法もあるが、展開の中心付近と離れたところで精度がちがうという難点がある。精度がほぼ一定の近似式をつくることを考えたほうがよい。近似式を、基底関数の重みつき合計で表現し、重みの値を決定する、という問題にする。決定の基準には次のものがある。
- いくつかの点で合わせる (選点法)
- 残差の2乗和を最小にする (最小2乗法)
- 重みつき残差が最小になるようにする
区分多項式も出てくるが、「スプライン関数」ということばは出てこない。同じ著者の別の本では出てきたという記憶があるのだが、使うならば本来のsplineとは意味がずれていることも言うべきで、長くなるので避けたのかもしれない。
6.2節から、偏微分方程式の近似解法の話になる。(わたしは有限要素法を使わないので、ここはしっかり読んでいないのだが) やはり、選点法、最小2乗法があり、重みつき残差の積分が0になるようにする方法が「ガレルキン法」、「エネルギー原理」がなりたつ問題で「全ポテンシャルエネルギー」を最小にする方法が「レイレイ・リッツ法」と呼ばれている。ただし、実際の問題で、レイレイ・リッツ法で式をたてると、ガレルキン法と同様になるそうだ。
折り返しのあとに詳しい目次をつける。
== 目次 ==
まえがき
目次
第1章 計算機入門
– 1.1 計算機
– 1.2 FORTRAN
– 1.3 アルゴリズム
第2章 数値解析とシミュレーション
– 2.1 数値解析とは何か
– 2.2 シミュレーションとは何か
– – 琵琶湖の静振
– – 黒潮のシミュレーション
– – リチャードソンの夢
第3章 伝導、拡散のシミュレーション
– 3.1 水時計
– – 計算式の検討
– – プログラム例
– – 流れの速さが水位に比例する場合
– – 計算結果の検討
– – もう一つの計算例
– 3.2 水位の差に比例して水が移動する問題
– – プログラム例
– – 移動の速さが水位差に比例する場合
– – 電位差に比例して電気が流れる
– – 温度差に比例して熱が流れる
– – 濃度差に比例して汚染物質が移動する
– 3.3 一列につないだ水槽
– – プログラム例
– – 応用
– – αとSが共通の場合
– – 連続な場合
– 3.4 ネットワーク
– – マトリクスによる表現
– – 電気回路網
– – プログラム例
– – 電源や負荷をつないだ場合
– 3.5 ラプラシアンに対する近似
– – 連続な場合
– – プログラム例
– 3.6 不安定現象とその対策
– – 原因と、Δtとの限界
– – 対策
第4章 平衡状態の計算法
– 4.1 落ち着く先はどこか
– – 計算法
– 4.2 連立1次方程式の解法
– – ガウスの消去法
– – プログラム例
– – 使用上の注意
– – ピボット選択
– – 対称な問題の場合
– – 3重対角の場合
– – 左辺が共通の問題を何題も解く場合
– 4.3 ネットワークの解析
– – プログラム例
– 4.4 反復法
– – ガウス-ザイデル法
– – プログラム例
– – 収束の加速
– – プログラムの変更
– – 収束の条件
– 4.5 差分法におけるSOR法の活用
– – 格子点
– – 数値例
– – プログラム例
– – SOR法
第5章 振動の問題
– 5.1 振動問題のシミュレーション
– – 計算法
– – プログラム例
– – 別法
– – 結果の検討
– – U字管の中の液体の往復運動
– – LC回路
– – 質点-バネ系
– – 減衰がある場合
– – 強制振動の場合
– 5.2 多自由度系の振動
– – プログラム例
– 5.3 波動方程式
– – プログラム例
– – 2, 3次元の場合
– 5.4 固有振動数の求めかた
– – 多変数の場合
– 5.5 高次代数方程式の解法
– – プログラム例
– 5.6 固有値問題の解法
– – ヤコビ法
– – プログラム例
第6章 有限要素法
– 6.1 近似式の作りかた
– – 近似式の係数の決めかた
– – 区分多項式の利用
– – 1次元の場合
– – 2次元の場合
– – 数値積分への応用
– 6.2 微分方程式の級数解法
– – 係数の決めかた
– – 各方法の間の関係
– 6.3 エネルギー原理
– – 全ポテンシャル・エネルギー
– 6.4 三角形要素
– – 公式の導きかた
– 6.5 決定方程式
– – エネルギー原理の第2項
– – プログラム例
– – 有限要素法
付録1 数値計算公式集
– 1. 連立1次方程式の解法
– – 1-A クラメルの公式
– – 1-B ガウスの消去法
– – 1-C ガウス-ザイデル法
– – 1-D SOR法
– – 1-E 共役勾配法 (CG法)
– 2. 逆行列計算
– – 2-A ガウス-ジョルダン法
– 3. 行列式の値の計算
– – 3-A 趙(ちょう)の方法
– 4. 高次代数方程式の解法
– – 4-A 2次方程式の根の公式
– – 4-B 3次方程式の根の公式(カルダンの公式)
– – 4-C 4次方程式の根の公式(フェラリの公式)
– – 4-D ベアストウ法
– 5. 非線形方程式の解法
– – 5-A ニュートン法
– – 5-B 一次補間法
– – 5-C 逐次代入法
– 6. 固有値問題の解法
– – 6-A ヤコビ法
– – 6-B ベキ乗法
– – 6-C 逆反復法
– – 6-D ハウスホルダー法
– – 6-E スツルム法
– 7. 補間法
– – 7-A ラグランジュの補間公式
– – 7-B ニュートンの補間公式
– – 7-C スターリングの補間公式
– – 7-D ベッセルの補間公式
– – 7-E エベレットの補間公式
– 8. 数値積分法
– – 8-A ニュートン-コーツの積分公式
– – 8-B スターリングおよびベッセルの公式の積分形
– – 8-C ガウスの積分公式
– 9. 常微分方程式の解法
– – 9-A オイラー法
– – 9-B 台形法
– – 9-C ルンゲ-クッタ法
– – 9-D アダムス-バッシュホース法
– – 9-E アダムス-ムルトン法
– – その他
付録2 マトリクス代数の要点
– マトリクス
– ベクトル
– 固有値と固有ベクトル
付録3 FORTRANの文法
– 1. 定数の書きかた
– 2. 変数の書きかた
– 3. 整数型と実数型
– 4. 添字つきの変数
– 5. 算術式
– 6. 算術代入文
– 7. 文番号
– 8. GO TO 文
– 9. IF文
– 10. DO文
– 11. CONTINUE文
– 12. 入出力
– 13. FORMAT文
– 14. 副プログラム
索引