|
3.9.3 積分の数値解析

数値積分の関数
積分 を数値近似する.
In[1]:= NIntegrate[Exp[-x^3], {x, 0, Infinity}]
Out[1]= 
2重積分 を数値近似する.
In[2]:= NIntegrate[x^2 + y^2, {x, -1, 1}, {y, -1, 1}]
Out[2]= 
NIntegrateの重要な機能の1つに,既知の点で発散するような関数に対処できることがある.積分領域の両端についてこのような問題が起らないか自動的に判定が行われるようになっている.
関数 は の点で発散してしまう. それでも, NIntegrateを使うと,正確に積分してくれる.
In[3]:= NIntegrate[1/Sqrt[x], {x, 0, 1}]
Out[3]= 
の積分は厳密に求めることも可能である.
In[4]:= Integrate[1/Sqrt[x], {x, 0, 1}]
Out[4]= 
において が特異点を持つことを NIntegrateは検知し,積分不能なことが判明する.
In[5]:= NIntegrate[1/x, {x, 0, 1}]


Out[5]= 
積分領域の両端以外に特異点があっても, NIntegrateはそれらについて自動検知する設定には なっていない.したがって,両端以外に特異点が存在する場合, NIntegrateの返す答は正しいとは限らない.それでも,適応化の中で NIntegrateが特異点を検出できるときがある.そのようなときは,Mathematicaから警告が発せられる.
NIntegrateで を積分すると,積分区間にある特異点を厳密には扱ってくれない.それでも,問題があることを警告してくれる.もっともこの場合,求まる答は数値的に極めて正解に近い.
In[6]:= NIntegrate[1/Sqrt[Abs[x]], {x, -1, 2}]


Out[6]= 
もし,積分する関数がどこで特異点を持つかあらかじめ判明していれば, NIntegrateにそのことを伝え,適切な処置を取るように指示することができる. NIntegrate[expr, x, xmin, , , ... , xmax ]とすると, xminから xmaxの区間にある各中間点 において特異点が存在する可能性があるとして式 exprの積分が行われる.
を再度計算する.今度は, に特異点があることを指示してあるので,正しい答が求まる.
In[7]:= NIntegrate[1/Sqrt[Abs[x]], {x, -1, 0, 2}]
Out[7]= 
また, NIntegrateに複素平面上の積分路を表す中間点 のリストを与えることもできる.この場合,積分路は xminから始まり を通って xmaxで終る折れ線区間からなるとみなされる.
を始点とし と1と を順に通り,そして を終点とした複素平面上の閉じた積分路において を積分する.
In[8]:= NIntegrate[1/x, {x, -1, -I, 1, I, -1}]
Out[8]= 
コーシーの定理から分かるように,この積分は になる.
In[9]:= N[ 2 Pi I ]
Out[9]= 

NIntegrateの特別オプション
NIntegrateで数値積分すると,積分式が一連の点でサンプリングされる.その際に特定の領域で積分式に急激な変化が認められると,その領域は細分化され,サンプリングが再帰的に行われ,それと同時にサンプリング点数が増やされる.パラメータ MinRecursionと MaxRecursionを使い,再帰的細分化の最大と最小区画数が指定できる. MinRecursionの値を増やせば, NIntegrateにおけるサンプリング点数が必ず増えるようになる.パラメータ MaxRecursionは, NIntegrateが使うサンプリング点数の上限を決定する. MinRecursion,または, MaxRecursionの値を高く取ると, NIntegrateの計算時間が余計にかかるようになる. SingularityDepthは,端点において積分式が発散してしまい,そのために変数の変更をする必要があると決定するまでに再帰的な細分化をいくつの区画数まで進めるかを指定するのに使う.
NIntegrateのオプション設定はすべてデフォルト値のままに残しておき, を数値積分する. 近傍の ピークが見逃され,答は間違いになってしまう.
In[10]:= NIntegrate[Exp[-x^2], {x, -1000, 1000}]

Out[10]= 
MinRecursion->3のオプション設定をして再度積分してみる.今度は,十分な数のサンプリングが行われ,ピークが検出される.しかし, MaxRecursionがデフォルト値なので,サンプリングが足りず正確な答が得られない.
In[11]:= NIntegrate[Exp[-x^2], {x, -1000, 1000}, MinRecursion->3]

Out[11]= 
MaxRecursionをこのように設定すると,十分な精度で積分が求まる.
In[12]:= NIntegrate[Exp[-x^2], {x, -1000, 1000}, MinRecursion->3, MaxRecursion->10]
Out[12]= 
別の解き方として,特にピーク近傍が細分化するように積分領域を分割してから NIntegrateする,という方法もある.
In[13]:= NIntegrate[Exp[-x^2], {x, -1000, -10, 10, 1000}]
Out[13]= 
多次元の積分を NIntegrateで計算すると,非常に長い時間がかかるときがよくある.そのようなときは,オプション MaxPointsを小さい値に設定し限られたサンプリングを行うようにすることで,推定的な積分値を求めるようにしたらよいだろう.
3次元における単位球の体積がおよそいくらか調べる.
In[14]:= NIntegrate[If[x^2 + y^2 + z^2 < 1, 1, 0], {x, -1, 1}, {y, -1, 1}, {z, -1, 1}, MaxPoints->10000]
Out[14]= 
正確な答はこうなる.
In[15]:= N[4/3 Pi]
Out[15]= 
|