はじめに
シミュレーションなどを行う時には、「誤差(精度)」の問題がよく話題になります。ただ、一口に誤差と言っても、「測定値の誤差」や「数値計算の誤差」など種類が様々あります。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{t}$は$t$の標準誤差です。また、式中の偏微分(感度係数)を計算すると、
\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回往復した時間を測って10で割る」などすれば、自由落下の時間より長い時間を測りやすく、ストップウォッチを押す際の誤差の影響などを減らせると考えられます。ただし注意点として、上の振り子の周期の計算式は、「振れ幅が十分小さい」ことを前提として導出された式になります。そのため実験を行う際に、大きく振り子を振ってしまうと近似が成り立たなくなるので、求めた値が真の値からずれやすくなります。これはモデル要因の誤差で、理論誤差ともいい、系統誤差の一種になります(あえて説明を省きましたが、元々の自由落下の式$x = \frac{1}{2}g t^2$も空気抵抗などは無視しているので、少なからず理論誤差があります)。
数値計算の誤差
数値計算の誤差の基本
数値計算などをする場合には、更にコンピュータ特有の誤差が生まれることがあります。一言で言えば「浮動小数点の桁落ち」で原因を説明できるかと思うのですが、個別の有名な誤差の種類では、下のようなものがあります。
- 丸め誤差:浮動小数点表示をすることによって出てしまう。
- 打ち切り誤差:無限小数を途中で打ち切って表現する時の誤差。
- 情報落ち誤差:絶対値の大きな値と絶対値の小さな値の足し算や引き算を行った時、小さい数が計算結果に反映されないため生じる誤差。
特に、小さい数字を多くの回数で足し合わせるような場合には、誤差が累積して結果がずれやすくなります(この場合は、丸め誤差や情報落ち誤差の影響)。計算機は実は、正確な足し算が苦手なのです。例えば、「単精度実数で0.01を10000回足すと、結果が100.003になる」という話があります。
このように、演算を沢山行う変数があれば、その変数で誤差が累積する可能性を疑った方がいいかもしれません。数値計算の誤差の計算方法を自分はよく知らないのですが、「精度保証付き数値計算」という研究分野があるらしく、解く問題によっては符号も合わないようなことがあるそうです(特殊な例の気もしなくはないですが)。
微分方程式の解析における誤差
丸め誤差などはコンピュータで一般に気を付けないといけない点ですが、CAEなどでよく見られる現象としては、数値の「発散」や「振動」があるかと思います。
例えば、微分方程式を数値的に解くための単純な方法として、時間微分項に陽解法、空間微分項に中心差分を利用する「FTCS法」というものがありますが、割と有名な話として、「比較的単純な形の移流方程式をまともに解くことができない(計算が不安定で振動などしてしまう)」という問題があります。
移流の問題を安定して解く手法の検討は様々ありますが、簡単には書ききれないほど多くの情報があります。不安定性の問題は移流に限った話でもないのですが、最低限「数値計算では問題によって計算が不安定化することがある」という理解は持っておくべきでしょう。
その他の誤差要因
ヒューマンエラー
間接測定量や数値計算の誤差の話をしてきましたが、実務的には「条件の入力間違い」や「プログラムのバグ」なども、頻繁に遭遇する問題かと思います。「そんなミスなどは注意して減らすべきだ」のような考えが大勢な気はするのですが、CAEソフトなどを使っているとバグの対応とかに追われることもよくあり、ソフトベンダーに相談してもすぐに対処法が分かる保証もなく、そのような中でシミュレーションの使いこなしを考えなければいけない、といったことも珍しくないかと思います。
一般的に、ヒューマンエラーを無くすための方法としては、「システムを分かりやすくする」や「フェイルセーフを設ける」といったものがありますが、入力データをチェックしたり、操作性がいいソフトを選んだり、なるべく単純な計算から検証を始める、といった工夫ができると良いのではと思っています。お金や時間をかけて難しい検証をしようとしても、条件設定を間違えたりソフトのバグに当たりやすくなったりして、現実的にも運用が難しくなる経験をしたことがある人は、少なくないのではないでしょうか。『人月の神話』という本もありますが、単に人を増やしても工数が減る訳ではないし、妥当な目標に向かえる訳でもないので(認識合わせの時間が増える、責任の所在が曖昧になるなど)、なるべく少人数で開発や運用が回るようにできるといいかと思います。
関連した話として、特定のツールに依存すると、何か問題が起きた時に移行先が無くなるので、複数のツールで行える作業に留めた範囲でツールを使う(1つのツールに特有の機能に依存しすぎないようにして、いざという時には他のツールに移れるようにする)、という発想をしても良いのではないかな、と考えています。
パラメータ(入力)と数理モデル(処理)の再現性
様々な誤差の要因を乗り越えて、妥当そうな計算結果を得たとしましょう。大抵の場合、単に計算結果を求めて終わりなのではなく、他の計算や予測などに使うことが多いかと思います。しかし、ある時に求めた計算結果が、他の場面でも同じ値を取るかというと、実際には異なる可能性があります。
例えば重力加速度$g$の場合、地球は自転をしているので、赤道に近いほど遠心力が大きく働きます。そのため、北極や南極よりも赤道付近の方が、重力加速度は小さく計算されます。また、地球は完全な球体ではなく凹凸があるので、同じ緯度でも場所によって重力差があります(重力の等高線はジオイドで表されます)。このように、一度計算で求めた重力加速度が、他の場面でも同様に成り立つかと言うと、厳密には当てはまらなくなる要因が様々あります。体重計などは物体にかかる重力から質量を求めているので、場所によって重力加速度が異なると、計測上の質量にも多少のバラつきが出るはずです。
重力加速度の誤差くらいなら無視できることが多いかもしれませんが、流体の乱流のようなランダム性がある現象とか、小さなモデルの計算値を大きく複雑なモデルに適用するような場合には、よく注意すべきと思われます。哲学の用語で、「自然は、同一条件下では同一原因から同一結果を生みだすような斉一性を持っている」という考え方を、「自然の斉一性」と呼ぶそうなのですが、無条件に脳内で前提している斉一性が本当に成り立つと言えるか、条件や原因などを気にすべき時が多々あるように思っています(分かりやすく顕著な例として、心理学や経済学などの数理モデルでは、時期や地域によって測定されるパラメータが変わりやすい、ということも挙げられるかと思います)。
おわりに
測定値の誤差論や、数値計算の誤差論などは、別々に語られがちな印象があるのですが、簡単ながら並列に論じてみました。数値計算を中心に行っている方は、測定値や数値計算の誤差を気にしない方も多いかもしれませんが、それなりに考察すべきものなのではないかな、と私は思っています。より専門的な話や、実務上の注意点などご存知の方がいましたら、この手の記事が増えると嬉しいです。
参考資料