はじめに
シミュレーションなどを行う時によく問題になるのが「誤差(精度)」の話題です。ただ、一口に誤差と言っても、「測定値の誤差」や「数値計算の誤差」など種類が様々あります。1つの誤差くらいなら注意することがあるかもしれませんが、誤差伝播などにより計算結果に与える影響などは考えている方が少ないように思ったので、記事を考えてみました。
測定量の誤差の考え方
いくつかの測定量を組み合わせて、何か別の測定量を求めたいことがあります。例えば、長方形の縦横の長さを測って、それぞれを掛け算して面積を計算することがあります。この時、長方形の縦横の長さは「直接測定量」、長方形の面積は「間接測定量」と言います。
しかし、測定には必ず誤差が含まれています。計算式が正しくても直接測定量に誤差があれば、間接測定量も真の値からは外れます。そのため、直接測定量にどのくらい誤差があるのか、さらには間接測定量にもどのくらいの誤差が発生しているか、知りたいことがあります。
2つの直接測定量$x,y$から間接測定量$u$を計算する場合、$u$は$x,y$の関数と考えて$u=u(x,y)$のように書けます。誤差解析では、$x,y$自体の誤差や、その誤差が$u(x,y)$に与える影響などを考えます。
直接測定量から間接測定量を計算する
長方形の面積よりもう少し難しい例として、一定の高さから物体を自由落下させてデータを取り、自由落下運動の式から重力加速度$g[m/s^2]$を求める場合を考えてみます。
\begin{align}
x = \frac{1}{2}g t^2
\end{align}
\begin{align}
\therefore g = \frac{2x}{t^2}
\end{align}
自由落下の実験を4回行い、次のデータを得たとします($x$は、同じ落下高さを4回測ったと解釈します)。
| x[m] | t[s] |
|---|---|
| 4.91 | 1.10 |
| 4.91 | 0.90 |
| 4.89 | 1.10 |
| 4.89 | 0.90 |
落下高さの平均$\bar{x}[m]$と落下時間の平均$\bar{t}[s]$は、次のように計算します。
\begin{align}
\bar{x} &= \frac{1}{n} \sum^n_{i=1} x_i = \frac{4.91 +4.91 +4.89 +4.89}{4} = 4.90[m]
\\
\bar{t} &= \frac{1}{n} \sum^n_{i=1} t_i = \frac{1.10 +0.90 +1.10 +0.90}{4} = 1.0[s]
\end{align}
これより、重力加速度$g[m/s^2]$は、下のように求められます。
g = \frac{2 \bar{x}}{\bar{t}^2} = \frac{9.80}{1.0} = 9.80[m/s^2]
直接測定量の誤差
まず、標準偏差を計算します。
\begin{align}
\sigma_x &= \sqrt{\frac{1}{n} \sum^n_{i=1} (x_i -\bar{x})^2} = \sqrt{ \frac{(0.01)^2 +(0.01)^2 +(-0.01)^2 +(-0.01)^2}{4} }
\\
&= \sqrt{\frac{0.0004}{4}} = \frac{0.02}{2} = 0.01
\end{align}
\begin{align}
\sigma_{t} &= \sqrt{\frac{1}{n} \sum^n_{i=1} (t_i -\bar{t})^2} = \sqrt{ \frac{(0.1)^2 +(-0.1)^2 +(0.1)^2 +(-0.1)^2}{4} }
\\
&= \sqrt{\frac{0.04}{4}} = \frac{0.2}{2} = 0.1
\end{align}
標準誤差(直接測定量の誤差)は、次のように求められます。
\begin{align}
\sigma_{\bar{x}} &= \frac{\sigma_{x}}{\sqrt{n}} = \frac{0.01}{2} = 0.005
\\
\sigma_{\bar{t}} &= \frac{\sigma_{t}}{\sqrt{n}} = \frac{0.1}{2} = 0.05
\end{align}
標準誤差を単純に比較すると、$\sigma_{\bar{t}}$の誤差は$\sigma_{\bar{x}}$の10倍あることになります。
間接測定量の誤差
全ての直接測定量の誤差は偶然誤差(独立で、正規分布に従う)と仮定すると、間接測定量の標準誤差$\sigma_u$は、直接測定量の誤差の二乗の期待値として計算されます。
\sigma_\bar{g} = \sqrt{ \left( \frac{\partial g}{\partial x} \sigma_\bar{x} \right)^2 +\left( \frac{\partial g}{\partial t} \sigma_\bar{t} \right)^2 }
ここで、$\sigma_\bar{x}$は$x$の標準誤差、$\sigma_\bar{y}$は$y$の標準誤差です。また、式中の偏微分(感度係数)を計算すると、
\begin{align}
&\frac{\partial g}{\partial x} = \frac{\partial}{\partial x} \frac{2x}{t^2} = \frac{2}{t^2}
\\
&\frac{\partial g}{\partial t} = \frac{\partial}{\partial t} \frac{2x}{t^2} = -\frac{4x}{t^3}
\end{align}
これを、間接測定量の標準誤差$\sigma_u$の式に代入すると、下のようになります。
\sigma_\bar{g} = \sqrt{ \left( \frac{2}{t^2} \sigma_\bar{x} \right)^2 +\left( -\frac{4x}{t^3} \sigma_\bar{t} \right)^2 }
このように流れを追うと、間接測定量の誤差は、直接測定量の誤差だけに依存するのではなく、間接測定量の計算式の形(数理モデル)にも依存することが分かります。
各直接測定量の寄与の大きさ
間接測定量の標準誤差$\sigma_u$の式にある、二乗の中の項の大きさを比較すると、各測定量($x,t$)の寄与の大きさが分かります。
\begin{align}
&\left| \frac{2}{t^2} \sigma_\bar{x} \right| = \frac{2}{1.0^2} 0.005 = 0.01
\\
&\left| -\frac{4x}{t^3} \sigma_\bar{t} \right| = \frac{4 \times 4.90}{1.0^3} 0.05 = 0.98
\end{align}
間接測定量の標準誤差への影響を比較すると、$0.98/0.01=98$倍あることが分かります。このように見ていくと、「落下高さ」の測定誤差はほとんど無視してよく、「時間」をもっと正確に測る方法や、時間の誤差の影響を受けにくい実験方法などを考えることに繋がるかと思います。
誤差を減らす工夫の検討
時間の誤差の影響を受けにくい実験方法としては、例えば単振り子の周期$T$の式を使って、重力加速度$g$を求める方法があるかと思います。
\begin{align}
T = 2 \pi \sqrt{\frac{l}{g}}
\end{align}
\begin{align}
\therefore g = \frac{4 \pi^2 l}{T^2}
\end{align}
例えば、「振り子が10回往復した時間」を測ってあげれば、自由落下の時間よりは長い時間を測りやすいので、誤差を小さくできると考えられます。ただし注意点として、上の振り子の周期の計算式は、「振れ幅が十分小さい」ことを前提として導出された式になります。そのため実験を行う際に、大きく振り子を振ってしまうと、近似が成り立たなくなるので、求めた値が真の値からずれることになります。これはモデル要因の誤差で、理論誤差ともいい、系統誤差の一種になります。
数値計算時の誤差
数値計算などをする場合には、更にコンピュータ特有の誤差が生まれることがあります。一言で言えば「浮動小数点の桁落ち」で原因を説明できるかと思うのですが、個別の有名な誤差の種類では、下のようなものがあります。
- 丸め誤差:浮動小数点表示をすることによって出てしまう。
- 打ち切り誤差:無限小数を途中で打ち切って表現する時の誤差。
- 情報落ち誤差:絶対値の大きな値と絶対値の小さな値の足し算や引き算を行った時、小さい数が計算結果に反映されないため生じる誤差。
特に、小さい数字を多くの回数で足し合わせるような場合には、誤差が累積して結果がずれやすくなります(この場合は、丸め誤差や情報落ち誤差の影響)。計算機は実は、正確な足し算が苦手なのです。例えば、「単精度実数で0.01を10000回足すと、結果が100.003になる」という話があります。
このように、演算を沢山行う変数があれば、その変数で誤差が累積する可能性を疑った方がいいかもしれません。数値計算の誤差の計算方法を自分はよく知らないのですが、「精度保証付き数値計算」という研究分野があるらしく、解く問題によっては符号も合わないようなことがあるそうです(特殊な例の気もしなくはないですが)。
その他:ヒューマンエラーによる誤差
間接測定量や数値計算の誤差の話をしてきましたが、実務的には「プログラムのバグ」や「条件の入力間違い」などが、よくある問題としてあるかと思います。「そんなミスはしなくて当然」という考えが大勢かとは思いますが、ヒューマンエラーを無くすためのよくある方法としては、「システムを明確にする」や「フェイルセーフを設ける」といったものがありますが、操作性がいいソフトを選んだり、なるべく単純な計算から検証を始める、といった工夫ができると良いのではと思っています。
おわりに
測定値の誤差論と、数値計算の誤差論は、別々に語られがちな印象があるのですが、簡単ながら並列に論じてみました。数値計算を中心に行っている方は、測定値や数値計算の誤差を気にしない方も多いかもしれませんが、それなりに考察すべきものなのではないかな、と私は思っています。より専門的な話や、実務上の注意点などご存知の方がいましたら、この手の記事が増えると嬉しいです。
参考資料