数値計算の答えがずれる理由は、一つではありません。
「表しきれない誤差」と「近似したことで入る誤差」を分けて考えると、計算の見通しが一気によくなります。
結論
数値誤差は主に「丸め誤差」と「打ち切り誤差」に分かれる。
数値誤差とは、理論上の正しい値と、コンピュータが計算して得た値のずれのことです。
その中でも基本として押さえるべきなのが、丸め誤差と打ち切り誤差です。
丸め誤差は、コンピュータが有限桁でしか数を表せないために生じます。たとえば $1/3$ を小数で有限桁にすると $0.3333\ldots$ を途中で切る必要があり、その時点でずれが入ります。
打ち切り誤差は、本来は連続な式や無限級数で書かれるものを、差分近似や有限項で置き換えることで生じます。つまり「近似したこと」そのものが原因です。
つまり、丸め誤差はコンピュータの表現の限界から生まれ、打ち切り誤差は数値的な近似の設計から生まれます。数値計算では、この2つを分けて見ることが基本です。
あるある
誤差と聞くと全部同じに見えて、何を直せばいいか分からなくなる。
数値計算で結果がずれたとき、「誤差がある」と一言で片づけてしまうと、原因が見えにくくなります。刻み幅を細かくすべきなのか、桁数を増やすべきなのか、それとも計算順序を見直すべきなのかは、誤差の種類で変わります。
数値誤差って言われると、つい全部まとめて「計算はずれるもの」って思っちゃうのよね。でも本当は原因が違うの?
かなり違うたい。数を表しきれん誤差と、式を近似したせいで入る誤差は、手当ての仕方も別なんよ。
なるほど。誤差を一つにまとめず、まず「どこから来たか」を分ける必要があるのね。
本文
誤差の正体を分けると、数値計算の見通しがよくなる。
1) 数値誤差とは何か
数値計算では、本来の連続な数学をコンピュータの有限な世界に写して扱います。その過程で、理論上の真の値と計算結果の間にずれが生じます。これが数値誤差です。
重要なのは、誤差があること自体を特別視しすぎないことです。数値計算は本質的に近似を含むので、誤差が入ることは自然です。大事なのは、誤差の種類と大きさを理解し、制御できることです。
誤差の見方
誤差があること自体よりも、どの種類の誤差が支配的かを見分けることが重要です。
代表的な基本分類が、丸め誤差と打ち切り誤差です。
2) 丸め誤差とは何か
丸め誤差は、コンピュータが実数を有限桁でしか保存できないことから生じます。
たとえば $0.1$ でさえ、2進数では有限桁で正確に表せないことがあります。そのため、内部ではごくわずかにずれた値として保存されます。こうした小さなずれが、加算や減算や反復計算の中で蓄積することがあります。
つまり丸め誤差は、式が正しくても、計算手順が正しくても、有限精度で表現する以上避けきれない誤差です。
丸め誤差の特徴
原因:有限桁の数値表現
典型例:$1/3$ や $0.1$ の有限桁表現
対策:倍精度の利用、計算順序の工夫、桁落ち回避
3) 打ち切り誤差とは何か
打ち切り誤差は、連続な数式を有限個の操作で近似したときに生じます。
たとえば微分を差分で近似するとき、時間微分 $\frac{du}{dt}$ を $ \frac{u^{n+1}-u^n}{\Delta t} $ と書けば、これは本来の微分そのものではなく近似です。この置き換えで入るずれが打ち切り誤差です。
同じように、関数をテイラー展開して有限項で止めたとき、積分を有限区間の和で近似したときにも打ち切り誤差が生じます。
つまり打ち切り誤差は、無限の数学を有限の計算へ切り詰めたことから生まれます。
打ち切り誤差の特徴
原因:微分・積分・級数の近似
典型例:差分近似、有限項で止めた展開
対策:刻み幅を小さくする、高次精度法を使う
4) 丸め誤差と打ち切り誤差の違い
この2つは、発生源がまったく違います。
丸め誤差
数を有限桁でしか持てないことによる誤差。
打ち切り誤差
連続な式を有限の近似で置き換えたことによる誤差。
見分け方の感覚
桁数や計算順序で効くなら丸め誤差寄り、刻み幅や近似次数で効くなら打ち切り誤差寄りです。
つまり、丸め誤差は「コンピュータの器の限界」で、打ち切り誤差は「こちらが近似したことの代償」って感じかしら。
その理解でかなり近かたい。前者は表現の限界、後者は近似の設計たい。
5) 打ち切り誤差の最小例
たとえば前進差分で微分を近似すると、$ \frac{u(t+\Delta t)-u(t)}{\Delta t} $ は $\frac{du}{dt}$ の近似です。
テイラー展開を使うと、$u(t+\Delta t)=u(t)+\Delta t\,u'(t)+\frac{\Delta t^2}{2}u”(t)+\cdots$ なので、前進差分は $u'(t)$ に一致するわけではなく、誤差項として $O(\Delta t)$ が残ります。
これが打ち切り誤差です。だから $\Delta t$ を小さくすれば、この誤差は一般に小さくなります。
6) 丸め誤差の最小例
丸め誤差の典型的な例は、ほぼ等しい2つの数の差を取るときです。たとえば $1.234567$ と $1.234566$ の差はとても小さいですが、元の数の有効桁が限られていると、差を取ったあとに有効な桁が急に少なくなります。
これを桁落ちと呼びます。丸め誤差が目立ちやすい場面の一つです。とくに減算、繰り返し加算、大きな数と小さな数の混在では注意が必要です。
丸め誤差が目立つ場面
ほぼ等しい数の減算
非常に多い反復計算
極端に大きい数と小さい数の混在
精度の高い型を使うだけでなく、計算式の形を変える工夫も重要です。
7) どちらを小さくすればいいのか
ここで少し面白いのは、打ち切り誤差を減らそうとして刻み幅をどんどん小さくすると、今度は反復回数が増え、丸め誤差の影響が相対的に目立つことがある点です。
つまり、刻みを細かくすれば無条件によくなるとは限りません。実際には、打ち切り誤差と丸め誤差のバランスを見る必要があります。
工学計算では、十分小さい打ち切り誤差を確保しつつ、丸め誤差が目立ちすぎない条件を探す、という感覚が大切です。
8) 計算例
たとえば数値微分で $f'(x)\approx \frac{f(x+h)-f(x)}{h}$ を使うとします。$h$ が大きいと、差分近似そのものが粗く、打ち切り誤差が大きくなります。
一方で $h$ を極端に小さくすると、$f(x+h)$ と $f(x)$ が非常に近くなり、差を取るときに丸め誤差が目立ちやすくなります。
つまりこの近似では、$h$ を適度に小さくしたところで全体誤差が最も小さくなることがあります。ここに、2種類の誤差を分けて考える意味があります。
誤差バランスの見方
$h$ が大きい → 打ち切り誤差が大きい
$h$ が小さすぎる → 丸め誤差が目立ちやすい
数値計算では、片方だけを見ると全体の誤差を読み違えることがあります。
9) よくあるつまずき
つまずき1:誤差を全部同じだと思う
発生源が違えば、対処法も違います。
つまずき2:刻み幅を小さくすれば必ずよくなると思う
打ち切り誤差は減っても、丸め誤差が目立つことがあります。
つまずき3:丸め誤差は無視できると決めつける
桁落ちや長い反復では、かなり効くことがあります。
テンプレ
誤差を見るときの最小の型。
数値誤差の理解テンプレ
(1)まず誤差の発生源を分ける
(2)表現の限界なら丸め誤差を疑う
(3)近似の粗さなら打ち切り誤差を疑う
(4)刻み幅・精度・計算式の形を見直す
(5)どちらが支配的かを確認する
落とし穴
誤差を「ただ小さくすればいいもの」と思う。
落とし穴は、誤差を一種類だと思い込んで、とにかく刻みを細かくすればよいと考えることです。
実際には、打ち切り誤差を減らす操作が、丸め誤差を目立たせることがあります。だから数値計算では、誤差を消すというより、どの誤差が支配的かを見て調整することが大切です。
つまり誤差との付き合い方は、「なくす」より「見分ける」が先です。
締め
数値誤差は、原因を分けると対策が見える。
今日の芯は、丸め誤差が「表現の限界」、打ち切り誤差が「近似の代償」ってところたい。同じ誤差でも、出どころが違えば見方も変わるとよ。
分かった。誤差があることを怖がるより、まず「これはどっちの誤差なのか」を分けて考えるのが大事なのね。
そうたい。数値計算は、誤差があるから難しいんやなくて、誤差の正体を見分けるところが面白かとよ。