数値積分

数値積分（すうちせきぶん、英: numerical integration）とは、狭義には与えられる関数の定積分の値を、解析的にではなく数値的に求める求積法のことであり、広義には与えられる導関数から原関数を求める手法、また微分方程式を数値的に解く手法 (常微分方程式の数値解法、偏微分方程式の数値解法) を含む。数値解析の一分野である。 狭義の数値積分（関数の定積分の値を求める方法）は有限要素法などで応用されている。 以下では、狭義の数値積分について述べる。 1変数の定積分の数値積分としては乱数を使わない方法として、 ニュートン・コーツの公式 中点則：区分求積法の定義で用いられる、シンプルな長方形近似 それについでシンプルな台形公式 簡便な割に高精度なシンプソンの公式 ロンバーグ積分 (台形公式と数列の加速法を組み合わせた公式) 積分点を適応的に取るガウス求積、ガウス＝クロンロッド求積法、クレンショー・カーティス法（英語版） などがある。 ニュートン・コーツの公式の場合、誤差項は中点則と台形公式は同じ2階導関数、シンプソンの公式とシンプソンの3/8公式は同じ4階導関数なので、同じ誤差のグループ同士は滑らかな関数の場合は大きな差はなく、基本的にはシンプソンの公式の方が誤差が小さいが、場合によってはそうならない場合もある。 二重指数関数型数値積分公式、IMT積分などの変数変換を用いた公式を適用すれば、被積分関数の端点に特異性がある場合でも、積分値を計算することが可能な場合もある。 2変数以上の多重積分の場合は、外側から積分し、外の変数を定数として内側の積分を数値積分すれば良い。ただし一般に、変数が増えると、モンテカルロ法や準モンテカルロ法の方が計算効率が良くなる。 なお、1983年当時における多重積分の理論、アルゴリズムの状況は次元に応じて次のように分類されている。 Range O（2次元）：満足できる状況． Range I（3−7次元）：プロダクトルールがその変形でなんとかなる． Range II（7−15次元）：Ranges I と IIIの 境界領域． Range III（15次元以上）：モンテカルロ法, 準モンテカルロ法が必要になる． 高次元空間での数値積分は金融工学などで必要とされているため、活発に研究されている。 定積分の精度保証付き数値計算は、被積分関数の多項式近似と多項式の値を精度保証付き数値計算する技術の組み合わせで実現される。多項式の値を計算する際はホーナー法が使われ、多項式近似にはテイラー展開や多項式補間が使われる。 ガウス求積は直交多項式の零点を活用する積分公式である。ベッセル関数の零点を活用する積分公式も開発されており、被積分関数がベッセル関数を含む場合に有効とされている。 特異点を持つ積分の場合、佐藤超函数を経由して複素数値積分に持ち込むことで特異点を避け、誤差を抑えられる手法が提案されている。 振動積分に対しては部分積分を組み合わせた数値積分が提案されている。 被積分関数の定義域が高次元であったりして近似公式がうまく計算できないような場合(次元の呪いが発生する場合)、モンテカルロ法が上手く行く場合もある。 単純なモンテカルロ積分 加重サンプリングを行う VEGAS 法 層化抽出法を行うよう改良を加えた MISER 法 などがあり、このような数値積分法はモンテカルロ積分とよばれる。 一様乱数の代わりに超一様分布列（英語版）を使うと準モンテカルロ法（英語版）になり、より速く収束する場合がある。 確率論やランダム行列理論などを用いて上記の近似公式とモンテカルロ積分を融合させたアルゴリズムも提案されている。 積分範囲が無限区間の場合は、下記の方法で置換積分で変換して数値積分する方法がある。ただし関数によっては違う方法を利用した方が良い場合もある。無限大に近づくときに急激に0に収束することが解析的に分かっている場合は、積分範囲を有界で区切ってしまえば良い場合もある。 ∫ − ∞ ∞ f ( x ) d x = ∫ − 1 1 f ( t 1 − t 2 ) 1 + t 2 ( 1 − t 2 ) 2 d t {\displaystyle \int _{-\infty }^{\infty }f(x)\,dx=\int _{-1}^{1}f\left({\frac {t}{1-t^{2}}}\right){\frac {1+t^{2}}{(1-t^{2})^{2}}}\,dt} ∫ − ∞ ∞ f ( x ) d x = ∫ 0 1 ( f ( 1 − t t ) + f ( − 1 − t t ) ) 1 t 2 d t {\displaystyle \int _{-\infty }^{\infty }f(x)\,dx=\int _{0}^{1}\left(f\left({\frac {1-t}{t}}\right)+f\left(-{\frac {1-t}{t}}\right)\right){\frac {1}{t^{2}}}\,dt} ∫ a ∞ f ( x ) d x = ∫ 0 1 f ( a + 1 − t t ) 1 t 2 d t {\displaystyle \int _{a}^{\infty }f(x)\,dx=\int _{0}^{1}f\left(a+{\frac {1-t}{t}}\right){\frac {1}{t^{2}}}\,dt} ∫ − ∞ b f ( x ) d x = ∫ 0 1 f ( b − 1 − t t ) 1 t 2 d t {\displaystyle \int _{-\infty }^{b}f(x)\,dx=\int _{0}^{1}f\left(b-{\frac {1-t}{t}}\right){\frac {1}{t^{2}}}\,dt} 数値積分のアルゴリズムは、滑らかである、連続である、特異点の数や場所が限られている、など、それぞれアルゴリズムが何らかの前提条件を関数にかけていて、それに沿った物が正常に積分できる。例えば、無数に不連続点がある関数は、基本的に数値積分が困難である。更に、広義積分可能であることも通常は前提条件に入っていて、コーシーの主値積分としては積分可能であっても、広義積分不可能な関数は、前提が崩れるためおかしな結果になる場合がある。 例えば ∫ − 1 1 1 x d x {\displaystyle \int _{-1}^{1}{\frac {1}{x}}\,dx} はコーシーの主値積分では 0 であるが、広義積分不可能であり、これを数値積分すると（そもそも正しい結果が無いが）おかしな結果が返ってくることがある。定積分が広義積分可能であるかどうかは簡単には判断が付かない場合もあるため注意が必要である。 QUADPACK - 乱数を使わない1変数の定積分が FORTRAN 77 で実装されている。 GNU Scientific Library ではこれをC言語に移植している。モンテカルロ積分や超一様分布列も実装されている。 SciPy、R言語、GNU Octave、NAG数値計算ライブラリ、IMSL などが QUADPACK を使用している。 Boost Math Toolkit Apache Commons Math では Java で実装されている。 Cuba - 主にモンテカルロ積分が実装されている Mathematica・Maple・MATLAB などの数式処理システムおよび数値解析ソフトウェア INTLAB - 精度保証を伴う数値積分が可能な区間演算ライブラリ kv - GitHub - 精度保証を伴う数値積分が可能な区間演算ライブラリ arb - GitHub - 精度保証を伴う数値積分が可能な区間演算ライブラリ