MATHEMATICAチュートリアル

数値解析の不確定性

Mathematica において,数値積分に代表される数値解析は代数計算的な解析とかなり違った手法に基づいて行われる.

代数的に積分するように Mathematica に積分式を与えると,式は関数形式で取り込まれ,式には積分操作を表すための一連の厳密でシンボル的な変換規則が次々に適用される.そして,積分した結果を評価することで積分処理を終える.

しかしながら,Mathematica が数値積分を行う場合,若干の最初の記号的な前処理を除き,積分式に関して Mathematica が保持する情報は一連の積分式の数値のみである.実際に数値的に積分を決定するために,Mathematica は積分式の滑らかさや他の特性に関して事実上ある種の仮定を行わなければならない.十分に病的な被積分関数を与えると,この仮定が有効ではなくなるかも可能性があり,結果として Mathematica がこの積分の間違った答を返すこともある.

例えば,積分しようとする関数が特定の位置にスパイク状の幅の狭い突起部を持つとする.Mathematica は特定の点で積分式をサンプリングし,それらのサンプリング区間において式が滑らかであるとみなす.ここで,もしサンプリング点が上記の突起部を外れたなら,突起部はないと同然になり,求まる積分には反映されなくなってしまう.

関数をプロットする.
In[1]:=
Click for copyable input
Out[1]=
NIntegrateからの範囲でならこの積分を正確に求めることができる.
In[2]:=
Click for copyable input
Out[2]=
範囲をからに拡大する.デフォルト設定のNIntegrateは,近傍にあるピークを逃してしまうため,不正確な答になってしまう.
In[3]:=
Click for copyable input
Out[3]=

NIntegrateは,被積分関数の数値に関して得られるだけの情報を最大限に利用する.そのため,例えば,特定の領域内で積分誤差が大きいと予測されるときは,NIntegrateはその領域のサンプリング数を増やしている.このようにNIntegrateでは積分式に応じた解析ができるように解析手順の「適応化」が行われている.

NIntegrateの適応化は,少なくともその考え方において,滑らかな曲線を描画するために使うPlotの手順に似ている.いずれの場合も,特定の領域で滑らかな近似が得られるまでサンプリング点を増加させるという考え方に基づいている.

この種の数値積分で遭遇する問題は,他の数値計算でも見られる.

例えば,無限級数の和を近似するとき,まず,Mathematica は一定の項までサンプリングし,そのサンプリング値に基づいた外挿処理により残りの項の寄与量を推定しようとする.このため,級数の後の方に大きな項を入れると,その項は検知されずに間違った和が求まってしまうという問題が起る.

関数の最小を近似値で求める場合も同様な問題が起る.つまり,関数が有限数の点においてサンプリングされ,サンプリング区間では関数が滑らかで補間可能なものとみなされる.しかし,特定の領域に急な窪みが存在するとそれは検知されずに間違った最小値が求まってしまうかもしれない.

関数の値を純粋に数値計算手法のみで求めようとする限り,上記の問題は常につきまとう.シンボル的な手法を使い厳密な代数計算をしなければこの問題は回避できない.

したがって,場合によっては,まずシンボル的に問題を解いておき,そうして求まった代数式を数値解析する,という手順が有効にもなり得る.そのような手順を使えば,数値解析だけだと起るような問題が回避できるかもしれない.

New to Mathematica? Find your learning path »
Have a question? Ask support »