MMS収束次数の算出方法
理論:誤差の比から次数を読む
概要
MMSで誤差を出したあと、次数はどう計算するんですか?単純に割り算すればいいだけですか?
式は単純だが、落とし穴がいくつもある。格子の比を取り違える、細かくしすぎて丸め誤差の床に当たる、単精度で計算してしまう、解がなめらかでない、境界だけ次数の低い式を使っている——どれも次数が理論値からずれる原因になる。コードのバグと見分けるには、それぞれがどんな見え方をするかを知っておくことが大切だ。1次元のポアソン方程式を2次の中心差分で解いて、1つずつ確かめてみよう。
観測次数の式
$e_1, e_2$ は粗い格子と細かい格子の誤差、$r$ は格子間隔の比。$r = 2$ のときだけ $\log_2(e_1/e_2)$ と書ける。
丸め誤差の床
2階微分の差分は $h^2$ で割るので、丸め誤差は $h$ が小さいほど大きくなる。離散化の誤差と丸め誤差の和が最小になる格子より細かくすると、誤差はかえって増える。
丸め誤差と格子の細かさ
数値微分で刻み幅を小さくしすぎると丸め誤差で精度が落ちることは、計算機の初期から知られていた。浮動小数点数の表し方がIEEE 754として統一されたのは1985年で、倍精度では有効数字が約16桁、単精度では約7桁になった。GPUの普及で単精度や半精度の計算が再び使われるようになり、格子を細かくしても精度が上がらない問題は、今また身近な注意点になっている。
計算例:1次元ポアソン方程式
−u″ = f、製造解 u = sin(πx) + x³、2次の中心差分、両端はディリクレ条件。誤差は最大値ノルム。
倍精度と単精度
| 分割数 | 倍精度の誤差 | 次数 | 分割数 | 単精度の誤差 | 次数 |
|---|---|---|---|---|---|
| 100 | 8.23e-5 | 2.00 | 30 | 9.14e-4 | 2.00 |
| 1,000 | 8.22e-7 | 2.00 | 100 | 8.27e-5 | 2.00 |
| 10,000 | 8.24e-9 | 2.00 | 300 | 3.03e-5 | 0.91 |
| 100,000 | 3.26e-10 | 1.40 | 1,000 | 4.01e-4 | −2.15 |
| 1,000,000 | 6.85e-7 | −3.32 | 3,000 | 2.90e-3 | −1.80 |
そのほかの落とし穴
| 状況 | 得られた次数 | 本来の次数 |
|---|---|---|
| 解が x^1.5(最大値ノルム、512分割) | 1.44 | 2(なめらかな解なら) |
| 解が x^1.5(L2ノルム、512分割) | 1.47 | 2 |
| 格子比1.5を log₂ で計算 | 1.17 | 2.00 |
| ノイマン端を片側差分(1次) | 0.99 | 2 |
| ノイマン端をゴースト点(2次) | 2.00 | 2 |
倍精度でも100万分割では誤差が増えてしまうんですね。細かくすればするほど良いわけではないと。
2階微分の差分は、隣り合う値の小さな差を h² で割る。h が小さくなると、その差が丸め誤差と同じくらいになり、割り算で拡大される。倍精度でも10万分割あたりで床に当たり、単精度ではたった300分割で崩れる。MMSで次数を確かめるときは、次数が理論値で並んでいる範囲だけを使い、床に当たった点は外す。もう一つ大事なのは、次数が下がったときに原因を切り分けることだ。解がなめらかでなければ次数1.44のように中途半端な値で安定し、境界の式が1次なら次数はきれいに1に落ちる。丸め誤差なら急に崩れて負になる。こうした見え方の違いが、バグとそれ以外を見分ける手がかりになる。
次数を求める手順
- 格子は一定の比で4段階以上作り、比 r を記録する。
- p = ln(e₁/e₂)/ln r で隣り合う組ごとに次数を出し、表にする。
- 次数が理論値に並んでいる範囲を『漸近範囲』として使う。
- 細かい格子で誤差が増えたら、丸め誤差の床を疑い、精度を上げて確かめる。
- 製造解はなめらかな関数にし、境界条件の式の次数も確かめる。
「GPUに移したら次数が崩れた」
あるチームが、熱伝導のコードをGPUで速くするために単精度に切り替えたところ、MMSの検証で細かい格子の次数が負になった。コードの移植ミスを疑って何日も調べたが、原因は単精度の丸め誤差だった。倍精度に戻すと次数は2.00に並んだ。そこで、計算の本体は単精度のまま、残差の計算と一部の足し算だけ倍精度にする方法に変えると、速さを保ちながら必要な精度が得られた。
よくある間違い
間違いと対策
| 間違い | 起きること | 対策 |
|---|---|---|
| 比が2でないのに log₂ | 次数を誤る | ln r で割る |
| 細かくしすぎる | 丸め誤差の床 | 漸近範囲だけ使う |
| 単精度で検証 | 早く崩れる | 倍精度で確認 |
| なめらかでない製造解 | 次数が中途半端 | なめらかな関数 |
| 境界の式の次数を見ない | 全体が1次に | 境界も同じ次数に |
関連する内容も知りたいです。
関連するページはMMSの概要、MMS:2次元弾性体、MMS:2次元熱伝導、コード検証、リチャードソン外挿が参考になる。
関連トピック
なった
詳しく
報告