|
3.9.2 数値解析の不確定性
Mathematicaにおいて,数値積分に代表される数値解析は代数計算的な解析とかなり違った手法に基づいて行われる.
代数的に積分するようにMathematicaに積分式を与えると,式は関数形式で取り込まれ,式には積分操作を表すための一連の厳密でシンボル的な変換規則が次々に適用される.そして,積分した結果を評価することで積分処理を終える.
一方,数値解析による積分では,積分式は直接関数としては扱われない代りに,積分式を特定の点で数値計算することで一連の数値が求められ,それらの値をもとに積分が近似される.
数値積分では,積分式に関してMathematicaが保持する情報は上記の一連の点における積分式の数値のみである.それでも,実際に数値的に積分を決定するには,積分式の滑らかさや他の特性が判明していなければならない.このため,Mathematicaではこれらの特性に関して特定の仮定がなされている.このことは,裏を返せば,積分式が仮定していない形のものだと,Mathematicaで求まる積分の値は必ずしも正しくない,ということを暗示している.
例えば,積分しようとする関数が特定の位置にスパイク状の幅の狭い突起部を持つとする.Mathematicaは特定の点で積分式をサンプリングし,それらのサンプリング区間において式が滑らかであるとみなす.ここで,もしサンプリング点が上記の突起部を外れたなら,突起部はないと同然になり,求まる積分には反映されなくなってしまう.
関数 をプロットする.
In[1]:= Plot[Exp[-x^2], {x, -10, 10}, PlotRange->All]

Out[1]= 
NIntegrateは から+10の範囲でならこの積分を正確に求めることができる.
In[2]:= NIntegrate[Exp[-x^2], {x, -10, 10}]
Out[2]= 
範囲を から +1000に拡大する.今度は, 近傍にあるピークを逃してしまうため,不正確な答になってしまう.
In[3]:= NIntegrate[Exp[-x^2], {x, -1000, 1000}]

Out[3]= 
NIntegrateの数値積分では原則的に積分式の取る数値だけに基づいて解析が行われるが,その際には,同時に得られる付加情報を活用し解析をより正確なものにしている.例えば,特定の領域内で積分誤差が大きいと予測されるときは,その領域のサンプリング数を増やしている.このように積分式に応じた解析ができるように解析手順の「適応化」が行われている.
NIntegrateの適応化は,少なくともその考え方において,滑らかな曲線を描画するために使う Plotの手順に似ている.いずれの場合も,特定の領域で滑らかな近似が得られるまでサンプリング点を増加させるという考え方に基づいている.
この種の数値積分で遭遇する問題は,他の数値計算でも見られる.
例えば,無限級数の和を近似するとき,まず,Mathematicaは一定の項までサンプリングし,そのサンプリング値に基づいた外挿処理により残りの項の寄与量を推定しようとする.このため,級数の後の方に大きな項を入れると,その項は検知されずに間違った和が求まってしまうという問題が起る.
関数の最小を近似値で求める場合も同様な問題が起る.つまり,関数が有限数の点においてサンプリングされ,サンプリング区間では関数が滑らかで補間可能なものとみなされる.しかし,特定の領域に急な窪みが存在するとそれは検知されずに間違った最小値が求まってしまうかもしれない.
関数の値を純粋に数値計算手法のみで求めようとする限り,上記の問題は常につきまとう.シンボル的な手法を使い厳密な代数計算をしなければこの問題は回避できない.
したがって,場合によっては,まずシンボル的に問題を解いておき,そうして求まった代数式を数値解析する,という手順が有効にもなり得る.そのような手順を使えば,数値解析だけだと起るような問題が回避できるかもしれない.
|