手帳と試行

学んだことをアウトプットしていきます。 日々、ノートあるのみ。

台形法と中点法

数値積分法の基本である台形法と中点法を取り上げる。

数値積分法

ある関数 f(x)f(x) の定積分を数値計算によって求めることを考える。このとき、素朴には積分範囲 [a,b][a, b] に対してN個の入力点 {xi}i=0N\{x_i\}_{i=0}^N を与え、それぞれに対して曲線 y=f(xi)y=f(x_i) と直線 y=0y=0 に挟まれた箇所の微小面積 dF(xi)dF(x_i) を計算し、それらを足し合わせるような方法が考えられる。

abf(x)dx=i=1NdF(xi)\begin{aligned} \int_a^b f(x) dx = \sum_{i=1}^N dF(x_i) \end{aligned}

このような考察に基づく数値計算方法を数値積分と呼ぶ。ここでは、特にシンプルなものである台形積分法と中点積分法を導入する。

台形積分法

台形積分法では、まず入力点を NN 個与える。ただし、それらの集合 {xi}i=0N\{x_i\}_{i=0}^N は順番に並んでいるものと仮定する。

x0<x1<<xNN inputs\begin{aligned} \underbrace{x_0 \lt x_1 \lt \dots \lt x_N}_{N \text{ inputs}} \end{aligned}

そして xix_ixi+1x_{i+1} に対して、関数の出力値 f(xi),f(xi+1)f(x_i), f(x_{i+1}) をそれぞれ上側底辺、下側底辺の長さとし、入力値の差分x_{i+1} - x_{i}を高さとするような台形を考える。その台形の面積を微小面積dF_iとする。

dFi12(f(xi)+f(xi+1))上底 + 下底(xi+1xi)高さ\begin{aligned} dF_i \coloneqq \frac{1}{2} \underbrace{(f(x_i) + f(x_{i+1}))}_{\text{上底 + 下底}} \underbrace{(x_{i+1} - x_i)}_{\text{高さ}} \end{aligned}

これを i=0,1,,N1i=0, 1, \dots, N-1 に対して足し合わせることで定積分を計算する。

abf(x)dxi=0N1f(xi)+f(xi+1)2(xi+1xi)\begin{aligned} \int_a^b f(x) dx \simeq \sum_{i=0}^{N-1} \frac{f(x_i) + f(x_{i+1})}{2} (x_{i+1} - x_i) \end{aligned}

特に積分区間 [a,b][a, b]NN 等分する場合、各 xix_i

x0=ax1=a+1N(ba)x2=a+2N(ba)xi=a+iN(ba)\begin{aligned} x_0 &= a \\ x_1 &= a + \frac{1}{N}(b-a) \\ x_2 &= a + \frac{2}{N}(b-a) \\ &\quad \vdots \\ x_i &= a + \frac{i}{N}(b-a) \\ \end{aligned}

および

xi+1xi=baN\begin{aligned} x_{i+1} - x_i = \frac{b-a}{N} \end{aligned}

と書けるから、次のように積分できる。

abf(x)dxi=0N1f(xi)+f(xi+1)2dx\begin{aligned} \int_a^b f(x) dx \simeq \sum_{i=0}^{N-1} \frac{f(x_i) + f(x_{i+1})}{2} dx \end{aligned}
wherexi=a+idxdx=baN\begin{aligned} &\text{where}& x_i &= a + idx \\ && dx &= \frac{b-a}{N} \end{aligned}

アルゴリズムは次の通り。

Algorithm 2: Trapezoidal integrals.
1.dxbaN2.x0a3.f0f(x0)4.F005.for i{0,1,2,,N1} do:6.xi+1xi+dx7.fi+1f(xi+1)8.Fi+1Fi+fi+fi+129.return FN×dx\begin{darray}{rl} 1. & dx \gets \dfrac{b-a}{N} \\ 2. & x_0 \gets a \\ 3. & f_0 \gets f(x_0) \\ 4. & F_0 \gets 0 \\ 5. & \text{for } i \in \{0, 1, 2, \dots, N-1\} \text{ do}: \\ 6. & \quad x_{i+1} \gets x_i + dx \\ 7. & \quad f_{i+1} \gets f(x_{i+1}) \\ 8. & \quad F_{i+1} \gets F_i + \dfrac{f_i + f_{i+1}}{2} \\ 9. & \text{return } F_N \times dx \end{darray}

中点積分法

中点積分法では2点 xi,xi+1x_i, x_{i+1} の中点における関数値 f(xi+xi+12)f\left(\dfrac{x_i + x_{i+1}}{2}\right) を幅、入力値の差分xi+1xix_{i+1} - x_{i} を高さとするような長方形を考え、その面積を微小面積 dFidF_i とする。

dFif(xi+xi+12)(xi+1xi)\begin{aligned} dF_i \coloneqq f\left(\dfrac{x_i + x_{i+1}}{2}\right) (x_{i+1} - x_i) \end{aligned}

そしてこれを i=0,1,,N1i=0, 1, \dots, N-1 に対して足し合わせることで積分を近似計算する。

abf(x)dxi=0N1f(xi+xi+12)(xi+1xi)\begin{aligned} \int_a^b f(x) dx \simeq \sum_{i=0}^{N-1} f\left(\dfrac{x_i + x_{i+1}}{2}\right) (x_{i+1} - x_i) \end{aligned}

台形法の場合と同様に、積分区間 [a,b][a, b]NN 等分する場合には、以下のような書き換えが可能である。

abf(x)dxi=0N1f(xi+xi+12)dx\begin{aligned} \int_a^b f(x) dx \simeq \sum_{i=0}^{N-1} f\left(\dfrac{x_i + x_{i+1}}{2}\right) dx \end{aligned}
wherexi=a+idxdx=baN\begin{aligned} &\text{where}& x_i &= a + idx \\ && dx &= \frac{b-a}{N} \end{aligned}

アルゴリズムは次の通り。

Algorithm 2: Midpoint integrals.
1.dxbaN2.x0a+12dx3.f0f(x0)4.F005.for i{0,1,2,,N1} do: 6.xi+1xi+dx7.fi+1f(xi)8.Fi+1Fi+fi29.return FN×dx\begin{darray}{rl} 1. & dx \gets \dfrac{b-a}{N} \\ 2. & x_0 \gets a + \dfrac{1}{2} dx \\ 3. & f_0 \gets f(x_0) \\ 4. & F_0 \gets 0 \\ 5. & \text{for } i \in \{0, 1, 2, \dots, N-1\} \text{ do: } \\ 6. & \quad x_{i+1} \gets x_i + dx \\ 7. & \quad f_{i+1} \gets f(x_{i}) \\ 8. & \quad F_{i+1} \gets F_i + \dfrac{f_i}{2} \\ 9. & \text{return } F_N \times dx \\ \end{darray}

数式の比較

台形積分法と中点積分法を並べて書いてみる。

Trapezoidalabf(x)dxi=0N1f(xi)+f(xi+1)2dxMidpointabf(x)dxi=0N1f(xi+xi+12)dx\begin{aligned} & \text{Trapezoidal} & \int_a^b f(x) dx &\simeq \sum_{i=0}^{N-1} \frac{f(x_{i}) + f(x_{i+1})}{2} dx \\ & \text{Midpoint} & \int_a^b f(x) dx &\simeq \sum_{i=0}^{N-1} f\left(\dfrac{x_{i} + x_{i+1}}{2}\right) dx \end{aligned}
wherexi=a+idxdx=baN\begin{aligned} &\text{where}& x_i &= a + idx \\ && dx &= \frac{b-a}{N} \end{aligned}

こうしてみると、両者はいずれも相加平均を用いているものの、それをどのタイミングでとるかという点で違いが現れている。

どちらを使うにせよ、それなりに NN を大きくしないと使い物にならないので注意しよう。