丸め誤差 — CAE用語解説

カテゴリ: 用語集 | 2026-01-15

理論と物理

丸め誤差の定義と発生源

🧑‍🎓

「丸め誤差」とは、具体的にどういう現象を指すんですか?単に計算結果が少し違うだけ?

🎓

コンピュータが有限の桁数で実数を表現する際に生じる誤差だ。例えば、10進数の0.1を2進数で正確に表現できない。IEEE 754の倍精度(64ビット)では、約

$$ 0.1 \approx 1.10011001100110011001101 \times 2^{-4} $$
と近似され、真の値との間に約
$$ 1.0 \times 10^{-16} $$
程度の誤差が最初から埋め込まれる。これが計算を重ねるごとに蓄積していく。

🧑‍🎓

CAEでは、その小さな誤差が実際の解析結果にどう影響するんですか?無視できるレベルじゃないの?

🎓

条件によっては無視できない。代表例は「悪条件問題」だ。剛性マトリクスの条件数が大きい、つまり

$$ \kappa(\mathbf{K}) = \|\mathbf{K}\| \cdot \|\mathbf{K}^{-1}\| $$
$$ 10^{10} $$
を超えるようなモデルでは、丸め誤差が解ベクトルに増幅される。例えば、非常に細長いビームや、剛性が極端に異なる部品が結合されたモデルで顕著だ。

🧑‍🎓

条件数が大きいと、なぜ丸め誤差が増幅されるのですか?

🎓

数値的に線形方程式

$$ \mathbf{Ku} = \mathbf{f} $$
を解くとき、右辺ベクトル
$$ \mathbf{f} $$
に微小な摂動
$$ \delta \mathbf{f} $$
があると、解の誤差
$$ \delta \mathbf{u} $$
$$ \frac{\|\delta \mathbf{u}\|}{\|\mathbf{u}\|} \leq \kappa(\mathbf{K}) \frac{\|\delta \mathbf{f}\|}{\|\mathbf{f}\|} $$
で抑えられる。丸め誤差はこの
$$ \delta \mathbf{f} $$
に相当し、
$$ \kappa(\mathbf{K}) $$
倍されて現れる。条件数が
$$ 10^{12} $$
もあれば、入力誤差が12桁も増幅される可能性がある。

数値解法と実装

ソルバーにおける丸め誤差対策

🧑‍🎓

ソフトウェアのソルバーは、丸め誤差をどうやって抑えているんですか?

🎓

主に二つのアプローチがある。第一は「スケーリング」だ。Ansys Mechanicalのデフォルト設定では、方程式を解く前に剛性マトリクスと荷重ベクトルを自動スケーリングし、数値のオーダーを揃える。これにより条件数を改善する。第二は「高精度演算」の利用だ。Intel Math Kernel Library (MKL)の一部のルーチンでは、内部で80ビット拡張精度(Intel FPUのレジスタ長)を用いて演算を実行し、最終結果だけを64ビットに戻す手法が採られる。

🧑‍🎓

直接法ソルバーと反復法ソルバーで、丸め誤差への感受性は違いますか?

🎓

大きく異なる。直接法(例えば、スパース直接ソルバーのPARDISOやMUMPS)は、前進消去・後退代入の過程で丸め誤差が蓄積する。特にピボット選択が重要で、部分ピボット法を用いて誤差の増幅を抑える。一方、反復法(例えば、共役勾配法:CG法)は、残差ノルムの収束判定に丸め誤差が影響する。残差がマシンイプシロン

$$ \epsilon \approx 2.2 \times 10^{-16} $$
のオーダーまで減少すると、それ以下は丸め誤差のノイズで収束しなくなる「停滞」が起こる。Abaqusでは、反復ソルバーの収束基準をデフォルトの
$$ 10^{-6} $$
から
$$ 10^{-8} $$
に厳しくしすぎると、この停滞で計算が終了しないことがある。

🧑‍🎓

非線形解析では、収束判定に与える影響は?

🎓

非常に大きい。ニュートン・ラフソン法では、残差力と接線剛性マトリクスを計算するが、これらが丸め誤差レベルで振動すると、収束判定を満たせずに反復がループする「偽の非収束」が発生する。対策として、AnsysやAbaqusでは、力の収束基準(例えば、

$$ 0.5\% $$
)と同時に、変位の収束基準(例えば、
$$ 1\% $$
)も設定し、どちらかを満たせば次のステップに進むようにしている。これが丸め誤差による振動をある程度吸収する。

実践ガイド

モデリングと設定での対策

🧑‍🎓

ユーザーがモデリング段階で気をつけるべき、丸め誤差を悪化させる具体的なポイントは?

🎓

まず「単位系の混在」だ。SI単位系でモデリングする場合、長さ[m]、力[N]、ヤング率[Pa]を使う。ここで、[mm]と[N]、ヤング率[MPa]を使うと、剛性マトリクスの成分のオーダーが最大で

$$ 10^{12} $$
もばらつき、条件数を悪化させる。一貫した単位系を徹底せよ。次に「極端な形状・剛性比」を避ける。厚さ0.1mmのシェルと直径100mmのソリッドを直接結合するなどは、剛性のオーダーが違いすぎる。適切な剛体要素やマスタースレーブで連結する。

🧑‍🎓

メッシュサイズが極端に小さい場合も問題ですか?

🎓

その通り。例えば、一辺1mの立方体を1mmの要素で切ると、要素数は10億個に近づく。要素剛性マトリクスの成分は非常に小さくなり、全体剛性マトリクスの対角項のオーダーもばらつく。これにより条件数が増大し、丸め誤差の影響を受けやすくなる。実務では、必要な精度を確保できる最大のメッシュサイズを選ぶことが重要だ。COMSOLのマニュアルでも、極端に細かいメッシュは数値誤差の源になり得ると警告している。

🧑‍🎓

解析結果を比較するとき、「1e-10」のような微小な変位差が出た場合、それは丸め誤差とみなしていいですか?

🎓

状況によるが、目安はある。モデルの代表長さをL、代表変位をUとする。倍精度演算の相対誤差は

$$ \epsilon $$
なので、変位の絶対誤差の目安は
$$ \epsilon \times U $$
程度。Uが1mmなら、
$$ 2.2 \times 10^{-16} \times 1 \text{mm} \approx 2.2 \times 10^{-19} \text{m} $$
だが、条件数が悪いとこれよりはるかに大きくなる。実務的には、異なるメッシュやソルバー設定で計算し、結果の差が物理量の最大値の0.01%以下で安定していれば、丸め誤差の範囲内と判断できることが多い。

ソフトウェア比較

主要ソフトウェアのデフォルト挙動

🧑‍🎓

Ansys、Abaqus、COMSOLで、丸め誤差対策のデフォルト設定に違いはありますか?

🎓

各社の哲学が反映されている。Ansys Mechanicalは「保守的」で、デフォルトの直接ソルバー(スパース直接法)では強力なピボット選択とスケーリングを適用し、安定性を最優先する。その代わり、メモリ使用量と計算時間が多くなりがちだ。Abaqus/Standardは、問題サイズとタイプに応じて自動で直接法か反復法を選択するが、反復法のデフォルト収束基準は比較的緩い

$$ 10^{-6} $$
に設定され、丸め誤差による停滞を避けている。

🧑‍🎓

COMSOLはどうですか?マルチフィジックスが売りですが。

🎓

COMSOL Multiphysicsは、結合された物理場の方程式を一つの大規模な係数マトリクスとして扱う「完全結合型」がデフォルトだ。このマトリクスは条件数が悪化しやすいため、デフォルトで「定数スケーリング」と「変数スケーリング」の両方を適用する。また、PARDISOやMUMPSといった外部ソルバーライブラリを使用するが、その内部の「ピボット許容値」を調整して数値的安定性を確保している。ユーザーがこの値を厳しくしすぎると(例えば1e-12から1e-16へ)、丸め誤差でピボット失敗が多発する。

🧑‍🎓

無償のオープンソースソルバー(CalculiX, Code_Aster)では、対策は弱いですか?

🎓

必ずしも弱いわけではないが、デフォルト設定が「研究者向け」で厳しい場合がある。例えば、Code_Asterの反復ソルバー(PETSc経由)の収束基準は、相対残差ノルムで

$$ 10^{-10} $$
という厳しい値が推奨されることもある。商用ソフトのように「とにかく計算を止めない」という堅牢性よりも、「可能な限り正確な解を」という思想だ。そのため、ユーザー自身がモデルのスケーリングやソルバー設定(前処理行列の選択など)を理解して調整する必要が商用ソフトより高い。

トラブルシューティング

よくあるエラーとその解釈

🧑‍🎓

「ピボットが小さすぎる」や「マトリクスが特異に近い」というエラーは、丸め誤差と関係ありますか?

🎓

大いに関係する。直接法ソルバーは、ガウスの消去法の過程で対角成分(ピボット)で割り算を行う。丸め誤差のため、理論上は正則なマトリクスでも、計算上はピボットの値が非常に小さく(例えば

$$ < 10^{-12} \times \text{最大行列成分} $$
)なると、このエラーが出る。Ansysでは「ピボット警告」が出ても計算は続行されるが、結果の信頼性は低下する。これはモデルの拘束不足(剛体モード)だけでなく、単位系の不統一や極端な剛性比によっても引き起こされる。

🧑‍🎓

非線形解析で、荷重ステップを極端に小さくすると、かえって収束しなくなることがあるのはなぜ?

🎓

まさに丸め誤差が原因の一つだ。ステップが小さすぎると、反復ごとの変位増分や残差力の変化が丸め誤差のノイズレベルに近づく。すると、収束判定ロジックが「変化がない」と誤認したり、逆にノイズで判定が振動したりする。Abaqusのマニュアルでは、初期増分サイズを小さくしすぎないように警告している。目安として、第一ステップでの変位が、モデル全体の代表長さの

$$ 10^{-6} $$
倍以下になるような設定は危険だ。

🧑‍🎓

異なるハードウェア(CPU)やOSで同じモデルを計算すると、結果が微妙に違うことがあります。これも丸め誤差?

🎓

その可能性が高い。IEEE 754規格は演算結果の「精度」を定めるが、「正確なビットパターン」までは規定していない部分がある。特に、超越関数(sin, cos, exp)の計算や、内積演算の順序(CPUの並列化による)が異なると、丸め誤差の発生の仕方が変わる。Intel CPUとAMD CPU、あるいは同じCPUでも使用する数学ライブラリ(MKL vs. OpenBLAS)の違いで、最下位ビットレベルで結果が分岐する。CAEのベンチマークテストでは、この差異を考慮し、相対誤差が

$$ 10^{-10} $$
程度以内であれば「一致」とみなすことが多い。

🧑‍🎓

丸め誤差を完全に排除する方法はないのですか?四倍精度演算を使えば?

🎓

四倍精度(128ビット、約34桁の10進精度)を使えば丸め誤差は劇的に減るが、計算コストは数倍から数十倍に跳ね上がり、メモリ使用量も倍増する。現状、汎用CAEソフトウェアで四倍精度をフルサポートしているものはほとんどない。ただし、特定の領域では利用が始まっている。例えば、Ansysの一部の専門ソルバーや、高精度が要求される宇宙機軌道計算ではオプションとして存在する。根本的な解決策は「丸め誤差を理解し、悪条件問題をモデリング段階で回避する」ことだ。数値解析には必ず誤差が伴うという前提が重要である。

この記事の評価
ご回答ありがとうございます!
参考に
なった
もっと
詳しく
誤りを
報告
参考になった
0
もっと詳しく
0
誤りを報告
0
Written by NovaSolver Contributors
Anonymous Engineers & AI — サイトマップ
プロフィールを見る