誤差(数値解析)
$\newcommand{\N}{\mathbb{N}}$ $\newcommand{\Z}{\mathbb{Z}}$ $\newcommand{\Q}{\mathbb{Q}}$ $\newcommand{\R}{\mathbb{R}}$ $\newcommand{\C}{\mathbb{C}}$ $\newcommand{\K}{\mathbb{K}}$ $\newcommand{\abs}[1]{\left\lvert#1\right\rvert}$ $\newcommand{\wenvert}[1]{\left\lvert\left\lvert#1\right\rvert\right\rvert}$ $\newcommand{\floor}[1]{\left\lfloor#1\right\rfloor}$ $\newcommand{\mathmod}[1]{\ \left(\mathrm{mod}\ #1\right)}$
[math] \newcommand\eps\varepsilon{} [/math]
誤差
誤差(ごさ、error)とは一般に、取り扱いたい数の真の値と、観測ないし計算によって実際に得られた値との差のことをいう。数値解析においては、扱いたい数が一般の実数である一方で、コンピュータには有限桁の小数の有限回の計算しか扱えない以上、誤差の存在を無視するわけにはいかない。
一般的な定義
$a$が真の値$x$の近似値であるとき、$e = x - a$を$a$の誤差という。誤差の大きさ$|e|$を$a$の絶対誤差、$|e|\leq \eps$をみたす$\eps$を誤差$e$の限界という。また、絶対誤差と真の値の比 $$ e_R = \frac{|x-a|}{x} $$ を$a$の相対誤差という。
丸め誤差と打ち切り誤差
数値計算における誤差は、実数値を有限桁の小数で表現せざるをえないがために生じる丸め誤差と、極限を有限値で打ち切ったり近似式を用いたりすることによって生じる打ち切り誤差の2つにおおよそ分類される。
丸め誤差
コンピュータにおいて、実数$x$はそれに近い浮動小数点数$x_f$によって近似される。これを丸めといい、丸めによって生じる誤差を丸め誤差とよぶ。また、浮動小数点数の絶対値の最大値を$F_{\text{max}}$、最小値を$F_{\text{min}}$とおくとき、実数$x$が $$F_{\text{min}} \leq x \leq F_{\text{max}}$$ と表される場合、浮動小数点数体系と丸めの方法によって定まる数$\eps_M$によって、 $$x_f = x(1 + \eps_x),\ |\eps_x| \leq \eps_M$$ が成立する。この$\eps_M$はマシンイプシロン、計算機イプシロンなどとよばれ、浮動小数点数による$x$の近似値$x_f$の相対誤差の限界を表す指標である。 実数$x$が$F_{\text{min}} \leq x \leq F_{\text{max}}$の範囲外にある場合は、$x$を近似する浮動小数点数が存在しないと考えるのが自然である。$|x|>F_{\text{max}}$のときオーバーフロー、$|x|<F_{\text{min}}$のときアンダーフローという。
打ち切り誤差
関数 $$f(x) = e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots$$ の(有限回の四則演算で実行できる)近似式として、 $$f_n(x) = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots + \frac{x^n}{n!}$$ を用いた場合、関数$f(x)$に現れる無限級数を$n+1$個の和で打ち切ったことになる。このときに生じる誤差 $$e_T(x) = f(x) - f_n(x) = \frac{x^{n+1}e^c}{(n+1)!}\ (0 < c < x)$$ を打ち切り誤差という。
一般に関数$f$の計算に無限回の四則演算が必要である場合は、有限回の四則演算で値を求められる近似関数$f_a$を用いなければならない。また、実数$x$における値ではなく、浮動小数点による$x$の近似値$x_f$における値を求めるしかない。したがって、$f(x)$の近似値として$f_a(x_f)$を計算するしかない。さらに計算結果$f_a(x_f)$も丸められた結果、我々は$f_a(x_f)$の近似値$\tilde f_a(x_f)$を得ることになる。誤差を3つに分解して、 $$f(x) - \tilde f_a(x_f) = \{ f(x) - f(x_f) \} + \{ f(x_f) - f_a(x_f) \} + \{ f_a(x_f) - \tilde f_a(x_f) \}$$ と書くとき、右辺第一項を代入誤差もしくは伝播誤差という。第二項は打ち切り誤差である。第三項は生成された誤差という。
誤差によって生じる問題
桁落ち
差のきわめて小さい2つの数$x_1,x_2$の差を計算するとき、浮動小数点数による近似値を$a_1,a_2$とすると相対誤差$e_R$の大きさは $$|e_R|=\frac{|(x_1-x_2)-(a_1-a_2)|}{|x_1-x_2|} \leq \frac{|x_1-a_1|+|x_2-a_2|}{|x_1-x_2|}$$ と見積もられるが、$x_1,x_2$が近いのでこの上からの評価は$a_1,a_2$の相対誤差の限界よりも大きい。つまり計算の精度が著しく低下してしまう。この現象を桁落ちという。
例 1
$h=10^{-16}$のとき、$\sqrt{1+h} - 1$を素朴に計算すると$0$を得てしまう。あらかじめ、分子の有理化 $$\sqrt{1+h} - 1 = \frac{h}{\sqrt{1+h} + 1}$$ を行ってから計算することで、正しい値の近似値$5 \times 10^{-17}$を得る。
情報落ち
絶対値の大きな浮動小数点数$x_f$に絶対値の小さな浮動小数点数$y_f$を足すとき、$x_f+y_f$を丸めた結果が$x_f$に等しくなり、$y_f$の情報が反映されないことがある。この現象を情報落ちまたは積み残しなどとよぶ。
例 2
無限級数 $$S = \frac{1}{1^2} + \frac{1}{2^2} + \frac{1}{3^2} + \cdots = \frac{\pi^2}{6} = 1.6449340668 \dots$$ の項を最初の$n$項の和で打ち切って計算する。2進24桁の浮動小数点数で素朴に $$\frac{1}{1^2} + \frac{1}{2^2} + \frac{1}{3^2} + \cdots + \frac{1}{n^2}$$ を左から計算すると、項数が$2^{12}=4096$を超えると情報落ちが生じ、項数を増やしても和が増加せず$1.6447253227 \dots$程度で打ち止めになってしまう。しかし和の順序を逆にして $$\frac{1}{n^2} + \frac{1}{(n-1)^2} + \frac{1}{(n-2)^2} + \cdots + \frac{1}{1^2}$$ を計算すれば、小さい数同士の和から始まるので情報落ちが起きず、精度の良い近似値を得ることができる。
補足
このように、数値計算において誤差はつきものであり、根本的に回避することは困難である。しかし、コンピュータを用いて計算結果を得たとき、せめてどのくらいの誤差の範囲に収まっているのか? 何桁までが正しい値なのか? くらいは知りたいであろう。これを数値解の精度保証問題という。厳密に誤差の限界が得られるような数値計算は精度保証付き数値計算と呼ばれる。