ガウス求積

ガウス求積（ガウスきゅうせき、英: Gaussian quadrature）またはガウスの数値積分公式とは、カール・フリードリヒ・ガウスに因んで名づけられた数値解析における数値積分法の一種であり、実数のある閉区間(慣例的に [−1, 1] に標準化される)で定義された実数値関数のその閉区間に渡る定積分値を、比較的少ない演算で精度良く求めることができるアルゴリズムである。 n を正の整数とし、f(x) を 任意の多項式関数とする。f(x) の [−1, 1] に渡る定積分値 I を、 I = ∫ − 1 1 f ( x ) d x = ∑ i = 1 n w i f ( x i ) {\displaystyle I=\int _{-1}^{1}f(x)\,dx=\sum _{i=1}^{n}w_{i}f(x_{i})} の形でなるべく正確に近似する公式を考える。ここで、xi は積分点またはガウス点 (ガウスノード)と呼ばれる [−1, 1] 内の n 個の点であり、wi は重みと呼ばれるn個の実数である。 実は、n 次のルジャンドル多項式の n 個の零点（これらは全て [−1, 1] 内にある）を積分点として選び、wi を適切に選ぶと、f(x) が 2n − 1 次以下の多項式であれば上記の式が厳密に成立することが示せる。この場合、wi は f(x) によらず一意的に定まる。この方法を n 次のガウス・ルジャンドル (Gauss–Legendre) 公式と呼び、通常はガウス求積またはガウスの数値積分公式と言えばこの方法を指している。 f(x) が 2n − 1次を超える多項式関数の場合、または多項式関数でない場合には、上記の公式は厳密には成立しないが、f(x) が 2n − 1 次以下の多項式関数で精度よく近似できる場合には、上記の公式を f(x) に対して適用することにより、その [−1, 1] における定積分値を精度よく得ることが期待できる。それ以外のたとえば、特異点のある関数の積分にはこの公式をそのまま適用することはできないが、被積分関数を f(x) = W(x) g(x) と表すことができて、g(x) が多項式で近似できて、W(x) が既知の関数（重み関数、通常は正値関数）であれば、それに対応する適切な離散的重み wi を使って次のように表せる。 ∫ − 1 1 f ( x ) d x = ∫ − 1 1 W ( x ) g ( x ) d x ≈ ∑ i = 1 n w i g ( x i ) . {\displaystyle \int _{-1}^{1}f(x)\,dx=\int _{-1}^{1}W(x)g(x)\,dx\approx \sum _{i=1}^{n}w_{i}g(x_{i}).} 典型的な重み関数としては、 W ( x ) = ( 1 − x 2 ) − 1 / 2 {\displaystyle W(x)=(1-x^{2})^{-1/2}} （ガウス–チェビシェフ）や W ( x ) = exp ⁡ ( − x 2 ) {\displaystyle W(x)=\exp(-x^{2})} （ガウス–エルミート）がある。この場合の n 個の積分点 xi はルジャンドル多項式と同様に、ある直交多項式のクラスに属する n 次多項式の根である。 重み関数と指定区間に付随するn次の直交多項式を考え、それの区間内にあるn個の零点を分点にとして被積分関数f(x)をHermite補間公式で近似したものを考えると、直交多項式の重み関数に対する直交性から、f(x)に重み関数を掛けて積分したものは、直交関数のn個の零点に於けるf(x)の関数値それぞれに重みをかけたものの和で近似される（結果的にf(x)の各分点における導関数値は積分の近似値には寄与しない）。このようにして重み関数に対応するガウス型の数値積分公式を導くことができて、分点がnであるときには被積分関数が2n−1次以下の任意の多項式に対して正確な積分値を与えるということが示せる. 上述のように n 次のこの方法には、n 次のルジャンドル多項式 Pn(x) が対応している。このときの n 次多項式は Pn(1) = 1 となるよう正規化され、i 番目のガウスノード xi は i 番目の Pn の根である。重みは次の式で与えられる。 w i = 2 ( 1 − x i 2 ) [ P n ′ ( x i ) ] 2 . {\displaystyle w_{i}={\frac {2}{\left(1-x_{i}^{2}\right)[P'_{n}(x_{i})]^{2}}}.} 低次の求積法は次のようになる。 一般的な区間 [a, b] についての積分は、ガウス求積法を適用する前にその区間を標準区間 [−1, 1] に変更する必要がある。この区間変更は以下のように線型変換で行う。 ∫ a b f ( x ) d x = b − a 2 ∫ − 1 1 f ( b − a 2 x + a + b 2 ) d x . {\displaystyle \int _{a}^{b}f(x)\,dx={\frac {b-a}{2}}\int _{-1}^{1}f\left({\frac {b-a}{2}}x+{\frac {a+b}{2}}\right)\,dx.} ガウス求積法を適用すると、以下で積分の近似値が得られる。 b − a 2 ∑ i = 1 n w i f ( b − a 2 x i + a + b 2 ) . {\displaystyle {\frac {b-a}{2}}\sum _{i=1}^{n}w_{i}f\left({\frac {b-a}{2}}x_{i}+{\frac {a+b}{2}}\right).} 正の重み関数 ω を導入することで、より汎用的な積分問題の表現も可能であり、区間 [−1, 1] 以外にも適用可能である。すなわち、次の形式の問題である。 ∫ a b ω ( x ) f ( x ) d x . {\displaystyle \int _{a}^{b}\omega (x)\,f(x)\,dx.} a, b, ω は適当に選択する。a = −1, b = 1, ω(x) = 1 のとき、前述の問題と同じ形式になる。それ以外の選択では、別の求積法になる。そのうちの一部を下記の表に示す。"A & S" という欄は、Abramowitz and Stegunにある式番号である。 pn が自明でない n 次の多項式で、次のように表されるとする。 ∫ a b ω ( x ) x k p n ( x ) d x = 0 , for all  k = 0 , 1 , … , n − 1. {\displaystyle \int _{a}^{b}\omega (x)\,x^{k}p_{n}(x)\,dx=0,\quad {\text{for all }}k=0,1,\ldots ,n-1.} pn のn個の零点をノード（分点）として選ぶと、次数が 2n − 1 以下の任意の多項式について正確な積分値を与えるn個の重み wi を選ぶことができる。さらに、それらのノードには重複がなくすべて開区間 (a, b) にある。 この多項式 pn は、ω(x) を重み関数とする次数 n の直交多項式である。 ガウス求積法のノード xi と重み wi を計算するための基本的ツールは、直交多項式群と対応する重み関数が満たす3項漸化式である。 例えば、pn がモニックな n 次直交多項式（最高次の項の係数が 1 の n 次直交多項式）なら、次のような漸化式で関係を表すことができる。 p n + 1 ( x ) + ( B n − x ) p n ( x ) + A n p n − 1 ( x ) = 0 , n = 1 , 2 , … . {\displaystyle p_{n+1}(x)+(B_{n}-x)p_{n}(x)+A_{n}p_{n-1}(x)=0,\qquad n=1,2,\ldots .} このことから、対応する行列の固有値および固有ベクトルからノードと重みを計算することができる。これを一般に Golub–Welsch アルゴリズムと呼ぶ。 xi が直交多項式 pn の根であるとき、前掲の漸化式を k = 0 , 1 , … , n − 1 {\displaystyle k=0,1,\ldots ,n-1} について用い、 p n ( x j ) = 0 {\displaystyle p_{n}(x_{j})=0} であることを踏まえると、次が成り立つことがわかる。 J P ~ = x j P ~ . {\displaystyle J{\tilde {P}}=x_{j}{\tilde {P}}.} ここで P ~ = t [ p 0 ( x j ) , p 1 ( x j ) , . . . , p n − 1 ( x j ) ] {\displaystyle {\tilde {P}}={}^{t}[p_{0}(x_{j}),p_{1}(x_{j}),...,p_{n-1}(x_{j})]} である。そして、J はいわゆるヤコビ行列である。 J = ( B 0 1 0 … … … A 1 B 1 1 0 … … 0 A 2 B 2 1 0 … … … … … … … … … … A n − 2 B n − 2 1 … … … … A n − 1 B n − 1 ) . {\displaystyle {\boldsymbol {J}}={\begin{pmatrix}B_{0}&1&0&\ldots &\ldots &\ldots \\A_{1}&B_{1}&1&0&\ldots &\ldots \\0&A_{2}&B_{2}&1&0&\ldots \\\ldots &\ldots &\ldots &\ldots &\ldots &\ldots \\\ldots &\ldots &\ldots &A_{n-2}&B_{n-2}&1\\\ldots &\ldots &\ldots &\ldots &A_{n-1}&B_{n-1}\end{pmatrix}}.} したがって、ガウス求積法のノードは三重対角行列の固有値として計算できる。 重みとノードを求めるには、要素が J i , i = J i , i {\displaystyle {\mathcal {J}}_{i,i}=J_{i,i}} , i = 1 , … , n {\displaystyle i=1,\ldots ,n} と J i − 1 , i = J i , i − 1 = J i , i − 1 J i − 1 , i , i = 2 , … , n {\displaystyle {\mathcal {J}}_{i-1,i}={\mathcal {J}}_{i,i-1}={\sqrt {J_{i,i-1}J_{i-1,i}}},\,i=2,\ldots ,n} から成る対称な三重対角行列 J {\displaystyle {\mathcal {J}}} の方が好ましい。 J {\displaystyle \mathbf {J} } と J {\displaystyle {\mathcal {J}}} は相似なので、固有値（ノード）も同じになる。重みは、行列 J から計算できる。 ϕ ( j ) {\displaystyle \phi ^{(j)}} が固有値 xj に対応する正規化固有ベクトル（すなわち、ユークリッドノルムが1の固有ベクトル）であるとき、固有ベクトルの第一成分から次のように重みが計算できる。 w j = μ 0 ( ϕ 1 ( j ) ) 2 . {\displaystyle w_{j}=\mu _{0}\left(\phi _{1}^{(j)}\right)^{2}.} ここで μ 0 {\displaystyle \mu _{0}} は重み関数の積分である。 μ 0 = ∫ a b w ( x ) d x . {\displaystyle \mu _{0}=\int _{a}^{b}w(x)dx.} 詳しくは Gil, Segura & Temme 2007 を参照されたい。 ガウス求積法の誤差は次のように定式化される。被積分関数が連続な 2n 次の導関数を持つときには、 ∫ a b ω ( x ) f ( x ) d x − ∑ i = 1 n w i f ( x i ) = f ( 2 n ) ( ξ ) ( 2 n ) ! ( p n , p n ) {\displaystyle \int _{a}^{b}\omega (x)\,f(x)\,dx-\sum _{i=1}^{n}w_{i}\,f(x_{i})={\frac {f^{(2n)}(\xi )}{(2n)!}}\,(p_{n},p_{n})} となる。ここで ξ は区間 (a, b) にあり、pn は n 次の直交多項式であり、さらに ( f , g ) = ∫ a b ω ( x ) f ( x ) g ( x ) d x {\displaystyle (f,g)=\int _{a}^{b}\omega (x)f(x)g(x)\,dx\,\!} である。重要な特別な場合 ω(x) = 1 については、次のような誤差見積もりがある。 ( b − a ) 2 n + 1 ( n ! ) 4 ( 2 n + 1 ) [ ( 2 n ) ! ] 3 f ( 2 n ) ( ξ ) , a < ξ < b . {\displaystyle {\frac {(b-a)^{2n+1}(n!)^{4}}{(2n+1)[(2n)!]^{3}}}f^{(2n)}(\xi ),\qquad a<\xi <b.\,\!} Stoer and Bulirsch によれば、この誤差見積もりは2n 次の導関数を見積もるのが難しいので実用には不向きであり、さらに言うと実際の誤差はこの見積もりの与える上界よりもずっと小さい。別の手法として、次数の異なるガウス求積法を使って、2つの結果の違いから誤差を見積もる方法もある。それにはガウス＝クロンロッド求積法が便利である。 区間 [a, b] を分割すると、各部分区間のガウス評価点は元の区間での評価点とは一致せず（奇数の場合の0を除く）、従って、新たに評価点を求める必要がある。ガウス＝クロンロッド求積法は、ガウス求積法の n 個の点に n + 1 個の点を追加し、求積法としての次数を 2n + 1 にするものである。これにより、低次の近似で使う関数値を高次の近似の計算に再利用できる。通常のガウス求積法とクロンロッドの拡張による近似の差分が誤差の見積もりによく利用される。