解の検証(Solution Verification)
理論:数値解の3つの誤差
概要
格子を細かくして収束の次数を求めたら、2次のはずが1次になったりマイナスになったりしました。スキームがおかしいのでしょうか?
スキームより先に、反復計算の収束を疑ってみよう。数値解の誤差には、格子による離散化誤差のほかに、反復を途中で打ち切ったことによる反復誤差と、桁数が有限なことによる丸め誤差がある。格子を細かくすると離散化誤差は小さくなるけれど、同じ収束判定のままだと反復誤差は小さくならず、むしろ大きくなることもある。反復誤差が離散化誤差と同じくらいになると、見かけの次数がばらばらになるんだ。解の検証では、この3つを分けて、離散化誤差だけを見積もることが大事だよ。
誤差の分解
離散化誤差を格子の比較で見積もるには、反復誤差と丸め誤差が十分に小さいことが前提になる。
計算例の問題
2次精度の中心差分で解き、格子幅を半分にしたときの誤差の比から見かけの次数 $p_{obs}$ を求める。正しく計算できていれば2に近づく。
「検証」と「妥当性確認」を分ける
1990年代まで、計算の信頼性の議論では、計算が方程式を正しく解いているか(検証)と、方程式が現実を正しく表しているか(妥当性確認)がよく混同されていた。ローチは1998年の本で両者をはっきり分け、さらに検証を、プログラムの正しさを確かめる『コードの検証』と、個々の計算の誤差を見積もる『解の検証』に分けた。この整理は、のちのASMEのV&V規格の骨組みになった。まず解の検証で数値の誤差を把握してからでないと、実験との比較で見えた差がモデルのせいなのか数値のせいなのか区別できない。
計算例
例1:反復の収束判定の影響
ガウス–ザイデル法で、残差が初期値の何分の1になったら止めるか(収束判定)を変え、格子を細かくしたときの最大誤差と見かけの次数を求めた。
| 収束判定 | 10分割 | 20分割(次数) | 40分割(次数) | 80分割(次数) |
|---|---|---|---|---|
| 10⁻³ | 7.3×10⁻³ | 1.1×10⁻³ (2.77) | 4.8×10⁻⁴ (1.16) | 8.7×10⁻⁴ (−0.85) |
| 10⁻⁶ | 8.3×10⁻³ | 2.1×10⁻³ (2.01) | 5.1×10⁻⁴ (2.00) | 1.3×10⁻⁴ (2.01) |
| 10⁻¹⁰ | 8.3×10⁻³ | 2.1×10⁻³ (2.01) | 5.1×10⁻⁴ (2.00) | 1.3×10⁻⁴ (2.00) |
80分割で10⁻⁶まで収束させるには約9,000回、10⁻¹⁰では約15,000回の反復が必要だった。格子が細かいほど、同じ判定に届くまでの反復は増える。
例2:単精度の丸め誤差
| 分割数 | 倍精度の誤差 | 単精度の誤差 |
|---|---|---|
| 40 | 5.1×10⁻⁴ | 5.1×10⁻⁴ |
| 160 | 3.2×10⁻⁵ | 3.7×10⁻⁵ |
| 640 | 2.0×10⁻⁶ | 1.5×10⁻⁴ |
| 2,560 | 1.3×10⁻⁷ | 3.6×10⁻³ |
| 10,240 | 7.9×10⁻⁹ | 0.45 |
単精度だと、格子を細かくするほど誤差が大きくなるんですか!
格子を細かくすると、差分の式で近い値どうしの引き算が増え、そのたびに有効な桁が失われる。単精度は有効数字が7桁ほどしかないから、ある細かさを超えると丸め誤差が離散化誤差を追い越してしまうんだ。倍精度なら16桁あるので、この問題ではもっとずっと細かい格子まで大丈夫だった。実務のCFDや構造の計算は倍精度が基本だけど、GPUで速さのために単精度を使う場合は注意が要る。格子を細かくしたのに結果が良くならない、むしろ悪くなるときは、丸め誤差を疑おう。
解の検証の進め方
- 反復の残差と、関心のある量(抗力・温度など)の変化の両方で収束を確かめる。
- 収束判定を1桁厳しくして結果が変わらないことを確かめ、反復誤差を見積もる。
- 3段階以上の格子でGCIなどを使い、離散化誤差を見積もる。
- 非定常なら時間刻みも同じように変えて確かめる。
- 倍精度で計算し、丸め誤差が影響しないことを確かめる。
「細かい格子ほど悪い結果」
熱流体の計算で格子依存性を調べたところ、中程度の格子までは結果が落ち着いていくのに、最も細かい格子で急に値がずれた——という例がある。細かい格子では反復の回数を増やさないまま同じ時間で計算を打ち切っていたため、残差が十分に下がっていなかった。反復を続けて残差を2桁下げると、最も細かい格子の結果も並びにおさまった。格子依存性の検討では、格子ごとに反復が十分収束していることを確かめてから比べるのが鉄則だ。
よくある間違い
間違いと対策
| 間違い | 起きること | 対策 |
|---|---|---|
| 格子ごとに同じ反復回数 | 細かい格子が未収束 | 残差で判定 |
| 残差だけで判定 | 関心量が落ち着いていない | 関心量も監視 |
| 単精度で細かい格子 | 丸め誤差で悪化 | 倍精度 |
| 格子2つで判断 | 次数が確認できない | 3段階以上 |
| 時間刻みを固定したまま | 時間方向の誤差が残る | 時間刻みも変える |
関連する内容も知りたいです。
リチャードソン外挿ツールで次数を試せるよ。関連するページはRoacheのGCI、3格子のGCI、コードの検証、製造解の方法、ASME V&V 20が参考になる。
関連トピック
なった
詳しく
報告