第2章: 誤差の基礎
この章の目標
数値計算における誤差の測り方(絶対誤差・相対誤差)と発生原因(丸め誤差・打ち切り誤差・入力誤差)を理解し、有効数字と、誤差が計算を通じてどう伝わるか(誤差の伝播と桁落ち)の基本を学ぶ。
前提知識
- 四則演算の基礎
- 小数・分数の概念
- 無限級数と階乗(§4 の 1 つ目の例で使う)
- 微分の定義(極限)とテイラー展開の初歩(§4 の 2 つ目の例で使う)
§1 なぜ誤差が生じるのか
数値計算では、様々な原因で「誤差」が生じる。誤差を理解し、管理することは数値計算の基本である。
誤差の主な原因
- 数を有限の桁数で表現する(丸め誤差。10 進では有限の小数 $0.1$ も、2 進では無限小数になる)
- 無限の計算を有限回で打ち切る・極限を有限の値で置き換える(打ち切り誤差)
- 測定値や入力データの不正確さ(入力誤差。入力の誤差が計算を通じてどう伝わるかは §5 で見る)
§2 絶対誤差と相対誤差
定義:絶対誤差
真の値を $x$、近似値を $\tilde{x}$ とするとき、絶対誤差は
$$E = |x - \tilde{x}|$$定義:相対誤差
真の値 $x \neq 0$ に対する相対誤差は
$$E_r = \dfrac{|x - \tilde{x}|}{|x|}$$パーセントで表すこともある:$E_r \times 100\%$
例:円周率の近似
$\pi = 3.14159265...$ を $\tilde{\pi} = 3.14$ で近似すると:
- 絶対誤差:$|3.14159... - 3.14| \approx 0.00159$
- 相対誤差:$\dfrac{0.00159...}{3.14159...} \approx 0.00051 = 0.051\%$
例:大きな数と小さな数
ケース1:$x = 1000000$、$\tilde{x} = 1000001$
- 絶対誤差:$1$
- 相対誤差:$10^{-6} = 0.0001\%$
ケース2:$x = 0.001$、$\tilde{x} = 0.002$
- 絶対誤差:$0.001$
- 相対誤差:$1 = 100\%$
絶対誤差は小さくても、相対誤差は大きい場合がある。
§3 丸め誤差
丸め誤差(rounding error)は、数値を有限の桁数で表現するときに生じる誤差である。
例:小数の丸め
$\dfrac{1}{3} = 0.33333...$ を4桁で表すと $0.3333$
絶対誤差:$\dfrac{1}{3} - 0.3333 = 0.00003...$
丸めの方法
- 切り捨て:$3.146 \to 3.14$
- 切り上げ:$3.141 \to 3.15$
- 四捨五入:$3.145 \to 3.15$、$3.144 \to 3.14$
- 偶数丸め:$3.145 \to 3.14$、$3.155 \to 3.16$(銀行丸め)
コンピュータは通常、2進数で計算するため、10進数の小数でも丸め誤差が生じることがある。
例:$0.1$ の2進数表現
10進数の $0.1$ は、2進数では無限小数になる:
$$0.1_{10} = 0.0001100110011..._{2}$$そのため、一般的な2進浮動小数点では $0.1$ を正確に表現できず、小さな誤差が生じる。
§4 打ち切り誤差
打ち切り誤差(truncation error)は、無限の計算(級数の和など)を有限回で打ち切ったり、極限($h \to 0$ など)を有限の値で置き換えたりすることで生じる誤差である。
例:$e$ のテイラー展開
$e$ は無限級数で表される:
$$e = \displaystyle\sum_{n=0}^{\infty} \dfrac{1}{n!} = 1 + 1 + \dfrac{1}{2} + \dfrac{1}{6} + \dfrac{1}{24} + \cdots$$最初の5項で打ち切ると:
$$e \approx 1 + 1 + \dfrac{1}{2} + \dfrac{1}{6} + \dfrac{1}{24} = \dfrac{65}{24} = 2.70833\ldots$$真の値 $e = 2.71828...$ との差 $e - \dfrac{65}{24} \approx 0.00995$ が打ち切り誤差である。
例:微分の近似
導関数の定義 $\displaystyle f'(x) = \lim_{h \to 0} \dfrac{f(x+h) - f(x)}{h}$ を有限の $h$ で近似すると:
$$f'(x) \approx \dfrac{f(x+h) - f(x)}{h}$$$f$ が 2 回微分可能なら、これはテイラー展開 $f(x+h) = f(x) + hf'(x) + \dfrac{h^2}{2}f''(\xi)$($\xi$ は $x$ と $x+h$ の間の点)を 1 次の項で打ち切ったことにあたり、残りの項から $\dfrac{h}{2}f''(\xi)$ の誤差が残る。これが打ち切り誤差で、大きさは $O(h)$($h$ に比例)である。
ただし $h$ を極端に小さくすると、ほぼ等しい $f(x+h)$ と $f(x)$ の引き算で桁落ち(§5)が起き、両者の値がもともと含む丸め誤差が、差に対して相対的に大きくなる。さらにその差を $h$ で割るので、丸め誤差の影響は $h$ に反比例して増える。打ち切り誤差は $h$ に比例して減るので、この前進差分では両者がバランスする最適な $h$ が存在する($f$ が滑らかで、その値の計算に丸め誤差があるとき)。
§5 誤差の伝播
計算を繰り返すと、誤差が蓄積・拡大することがある。
例:足し算での誤差伝播
$\tilde{x} = x + \epsilon_1$、$\tilde{y} = y + \epsilon_2$ のとき($\epsilon_1, \epsilon_2$ は符号つきの誤差。§2 の絶対誤差とは $E = |\epsilon|$ の関係)
$$\tilde{x} + \tilde{y} = (x + y) + (\epsilon_1 + \epsilon_2)$$誤差はそのまま足し合わされる。ただし符号つきなので、符号が逆なら打ち消し合うこともある。大きさの上界は $|\epsilon_1 + \epsilon_2| \le |\epsilon_1| + |\epsilon_2|$ である。
例:掛け算での誤差伝播
相対誤差で表すと $\tilde{x} = x(1+\delta_1)$、$\tilde{y} = y(1+\delta_2)$ のとき($\delta_1, \delta_2$ は符号つきの相対誤差。上の $\epsilon$ とは別の量)
$$\tilde{x} \cdot \tilde{y} = xy\,(1 + \delta_1 + \delta_2 + \delta_1 \delta_2) \approx xy\,(1 + \delta_1 + \delta_2)$$$\delta_1 \delta_2$ は二次の微小量として無視すると、相対誤差はほぼ足し合わされる。
割り算では
$$\dfrac{\tilde{x}}{\tilde{y}} = \dfrac{x}{y}\cdot\dfrac{1+\delta_1}{1+\delta_2} \approx \dfrac{x}{y}\,(1 + \delta_1 - \delta_2)$$となり、相対誤差は引かれる($\delta_1 = \delta_2$ なら打ち消し合う)。掛け算・割り算とも、結果の相対誤差の大きさはおおよそ $|\delta_1| + |\delta_2|$ 以下である。
例:引き算での誤差拡大
$x$ と $y$ がそれぞれ誤差を含むとき、$x \approx y$ なら $x - y$ の相対誤差は非常に大きくなる(引き算そのものは誤差を作らず、入力の誤差の相対的な重みが増える)。
例:$x = 1.0001$、$y = 1.0000$(各5桁精度。有効数字の数え方は §6)
$x - y = 0.0001$ であるが、有効桁数は1桁に減少。各値の丸め誤差は最大 $0.00005$(相対誤差で約 $0.005\%$)なのに、差 $0.0001$ に対しては最大 $0.0001$、つまり相対誤差 $100\%$ にもなりうる。
これを桁落ち(cancellation)という。
§6 有効数字
有効数字は、測定や計算で信頼できる桁数のことである。
例:有効数字の数え方
- $123.45$ → 有効数字5桁
- $0.00123$ → 有効数字3桁(先頭のゼロは数えない)
- $1.23 \times 10^5$ → 有効数字3桁
有効数字と相対誤差の関係
$n$ 桁の有効数字を持つ数値の相対誤差は、おおよそ $10^{-n}$ のオーダーである。
§7 まとめ
- 絶対誤差 $= |x - \tilde{x}|$、相対誤差 $= \dfrac{|x - \tilde{x}|}{|x|}$($x \neq 0$)
- 丸め誤差:有限桁での表現による誤差
- 打ち切り誤差:無限の計算を有限回で止めたり、極限を有限の値で置き換えたりすることによる誤差
- 誤差は計算を通じて伝播・拡大する可能性がある
- 桁落ち:誤差を含むほぼ等しい数どうしの引き算で、誤差の相対的な重みが大きくなり有効桁数が減る
- 有効数字は信頼できる桁数を表す