1 検証と妥当性確認
数値実験の誤りには、性質の異なる二つの源がある。両者を混同すると、正しいコードを疑い続けたり、不適切なモデルを精緻化し続けたりする。
定義 1.1. 数理モデル(方程式)Mを離散化・実装して数値解A(h)を得る過程について、次を区別する。
- 検証 (verification)(verification)——「方程式を正しく解いているか」。離散解A(h)が、h→0でMの厳密解Aに、理論が予言する次数で収束することの確認。数学とコードの問題であり、実世界のデータを必要としない。
- 妥当性確認 (validation)(validation)——「正しい方程式を解いているか」。モデルMの解が、実際の観測・実験データと許容範囲で一致することの確認。モデル化の問題であり、外部データを要する。
検証は数値解と厳密解の比較、妥当性確認は数値解(またはモデル解)と現実の比較である。
検証を経ずに妥当性確認へ進むと、離散化誤差とモデル誤差が相殺・累積して見分けがつかなくなる。本記事が主題とするのは、外部データを要さずに実行できる検証の手続きである。
2 収束試験と観測収束次数
検証の中核は、刻み幅を細かくしたときに誤差が理論どおりの速さで減るかを測ることである。
定義 2.1. 基準刻み幅h0と細分化比r>1(多くはr=2)を固定し、刻み幅の列hj=h0/rj(j=0,1,2,…)に対して離散解A(hj)を計算する手続きを収束試験 (convergence study)
という。厳密解Aが既知なら誤差e(hj)=A(hj)−Aを、未知なら連続する解の差A(hj)−A(hj+1)を、jに対して記録する。e(hj)をhjの両対数目盛にとった図(収束プロット (convergence plot))の傾きが、以下の観測収束次数を可視化する。
離散法の設計時に理論上の収束次数p(例:局所打切り誤差O(hp+1)の一段法が与える大域誤差O(hp)、中心差分が与えるO(h2))が分かっていても、実装のバグや仮定の破れは、この理論次数が観測されないこととして現れる。したがって観測次数を理論次数と突き合わせることが検証になる。
命題 2.2. 誤差がe(h)=Chp+o(hp)(h→0、C=0、p>0)の形をもつとする。細分化比をr>1とすると、次が成り立つ。
- 厳密解が既知で誤差e(h)が測れるとき、p=limh→0logrlog(e(h)/e(h/r)).
- 厳密解が未知でも、三つの格子解A(h),A(h/r),A(h/r2)からp=limh→0logr1log(A(h/r)−A(h/r2)A(h)−A(h/r)).
証明.(1)を示す。仮定よりe(h)=Chp+o(hp)、また(h/r)p=r−phpゆえe(h/r)=Cr−php+o(hp)。C=0だからe(h/r)e(h)=Cr−php(1+o(1))Chp(1+o(1))=rp(1+o(1)).両辺の対数をlogrで割るとlog(e(h)/e(h/r))/logr=p+o(1)→p。
(2)を示す。厳密解をAとするとA(h)−A=Chp+o(hp)。差をとるとA(h)−A(h/r)=(A(h)−A)−(A(h/r)−A)=C(1−r−p)hp+o(hp),A(h/r)−A(h/r2)=C(1−r−p)(h/r)p+o(hp)=C(1−r−p)r−php+o(hp).C(1−r−p)=0(r>1より1−r−p>0)だから、両者の比はA(h/r)−A(h/r2)A(h)−A(h/r)=C(1−r−p)r−php(1+o(1))C(1−r−p)hp(1+o(1))=rp(1+o(1)),再び対数をとってpを得る。▨
(2)は厳密解を要さないため、実問題の検証で実際に使う形である。3格子で推定したpが理論値へ近づかないなら、細分化がまだ漸近域に入っていないか、離散化・実装に欠陥があるかのいずれかである。
3 リチャードソン外挿
誤差が刻み幅のべきで展開できるとき、二つの解を線形結合して主要誤差項を消去できる。これにより高精度解と、その場で使える誤差推定の両方が得られる。
証明.(1)を示す。展開にh↦h/rを代入すると(h/r)p=r−php、(h/r)q=r−qhqよりA(h/r)=A+cpr−php+cqr−qhq+o(hq).両辺をrp倍してA(h)を引くと、hpの項がちょうど打ち消し合う:
rpA(h/r)−A(h)=(rp−1)A+(cphp−cphp)+cq(rp−q−1)hq+o(hq).右辺のhqの係数はcq(rp−q−1)で、rp−1>0で割るとAR(h)=A+cqrp−1rp−q−1hq+o(hq).q>pよりrp−q−1=r−(q−p)−1は0でない有限値だから、主要誤差はO(hq)である。
(2)を示す。展開の主要項だけを見るとA(h)−A=cphp+o(hp)、A(h/r)−A=cpr−php+o(hp)。差をとってA(h)−A(h/r)=cp(1−r−p)hp+o(hp)=cpr−php(rp−1)+o(hp).両辺をrp−1で割ると右辺はcpr−php+o(hp)=(A(h/r)−A)+o(hp)、すなわちA(h/r)−A=rp−1A(h)−A(h/r)+o(hp)=−(rp−1)A(h/r)−A(h)⋅(−1)+o(hp).符号を整理すれば主張の等式を得る。▨
外挿値AR(h)を新たなA(⋅)とみなして展開の次の項cqhqに同じ操作を繰り返すと、O(hq)、さらに高次へと段階的に精度を上げられる。積分に対してこれを台形則から系統的に行うのがロンバーグ積分である。
検算(台形則へのリチャードソン外挿).∫01exdx=e−1=1.7182818285…を複合台形則で近似する。台形則の誤差はオイラー・マクローリン展開により偶数べきT(h)=A+c2h2+c4h4+⋯をもつので、p=2、q=4、r=2とし、外挿式はAR=(22T(h/2)−T(h))/3=(4T(h/2)−T(h))/3となる。各Tは等比和の閉形式で厳密に評価し、誤差比を二重確認した。
| n |
h=1/n |
台形則T(h) |
誤差∣e(h)∣ |
観測次数p |
外挿AR |
外挿誤差 |
| 1 |
1 |
1.8591409142 |
1.409×10−1 |
— |
— |
— |
| 2 |
1/2 |
1.7539310925 |
3.565×10−2 |
1.982 |
1.7188611519 |
5.79×10−4 |
| 4 |
1/4 |
1.7272219046 |
8.940×10−3 |
1.996 |
1.7183188419 |
3.70×10−5 |
| 8 |
1/8 |
1.7205185922 |
2.237×10−3 |
1.999 |
1.7182841547 |
2.33×10−6 |
観測次数(真誤差からlog(e(h)/e(h/2))/log2で算出)は2へ収束し、台形則の理論次数O(h2)と一致する(命題 2.2)。外挿値の誤差は5.79×10−4→3.70×10−5→2.33×10−6と、1段細分化ごとに約16=24倍で減っており、定理 3.1の予言するO(h4)を確認する。n=8の台形則が2.24×10−3の誤差にとどまるのに対し、n=4,8からの外挿は2.33×10−6——同じ計算量でおよそ1000倍の精度である。
4 製作解法(MMS)
検証は厳密解Aの存在を前提とするが、実際の問題の厳密解はまず得られない。そこで解を先に決め、それを厳密解にする方程式を逆算する。
定義 4.1. 微分作用素Lに対する問題Lu=fを解くコードを検証したいとする。製作解法 (method of manufactured solutions)
(method of manufactured solutions, MMS)とは、次の手順をいう。
- 十分滑らかな関数u∗(製作解 (manufactured solution))を任意に選ぶ。物理的意味は要らない。
- 強制項をf∗:=Lu∗と解析的に計算する。これによりu∗はLu=f∗の厳密解になる。境界・初期条件もu∗から定める。
- 強制項f∗を入力してコードで数値解uhを求め、既知のu∗との誤差∥uh−u∗∥を格子ごとに測り、観測収束次数を理論次数と照合する。
MMS はu∗を自由に選べるため、あらゆる項(拡散・移流・反応・非線形・境界)を励起する解を設計でき、離散化のどの部分が理論次数を出していないかを切り分けられる。例えば区間(0,1)上の−u′′=f、u(0)=u(1)=0を検証するにはu∗(x)=sin(πx)ととればf∗(x)=−(u∗)′′(x)=π2sin(πx)で、境界条件u∗(0)=u∗(1)=0も自動的に満たされる。これを二階中心差分で解けば、L∞誤差がO(h2)で減ることを確認できる。観測次数が2に届かなければ、境界の扱いか行列組み立てにバグがある。MMS はモデルの正しさ(妥当性確認)ではなく、離散化・実装の正しさ(定義 1.1の検証)を試す道具であることに注意する。
5 浮動小数点と再現性
以上の手続きは、同じコードが同じ入力に対して同じ出力を返すことを暗黙に仮定している。有限精度の計算では、この「同じ」が思うほど自明でない。
順序に依存しない総和が必要なら、補償付き加算(カハンの総和)や、ペアワイズ総和、あるいは整数化した固定小数点での確定的リダクションを使う。いずれも、非結合性という事実(注意 5.1)を迂回するための設計である。