[VBA] 台形公式による数値積分のアルゴリズム

 

台形公式 Trapzoidal Formula

 台形公式 は関数のグラフと $x$ 軸に囲まれた部分(定積分の値)を台形で埋めて近似計算する方法です。極端に単純化した例として、区間 $[a,\:b]$ において、ある関数 $y=f(x)$ と $x$ 軸に囲まれた面積を次のように 3 つの台形で近似することを考えてみます。

 VBA台形公式3分割による定積分

 すなわち積分公式で表すと
 
\[\int_{a}^{b}f(x)dx\simeq S_1+S_2+S_3\]
という近似計算をしようという試みです。区間 $[a,\:b]$ は 3 等分され、1 区分の長さは
 
\[\Delta x=\frac{b-a}{3}\]
となります。台形は上底と下底の和に高さを掛けて 2 で割ると面積が求められます。左端にある台形の面積 $S_1$ は、$f(a)$ を上底、$f(a+\Delta x)$ を下底として
 
\[S_1=\frac{1}{2}\left\{ f(a)+f(a+\Delta x) \right\} \Delta x\]
となります。$S_2,\:S_3$ も同様にして
 
\[\begin{align*}S_2&=\frac{1}{2}\left\{ f(a+\Delta x)+f(a+2\Delta x) \right\} \Delta x\\[6pt]
S_3&=\frac{1}{2}\left\{ f(a+2\Delta x)+f(b) \right\} \Delta x\end{align*}\]
 これらを全て加えると
 
\[\begin{align*}S=\:&S_1+S_2+S_3\\[6pt]
=\:&\frac{1}{2}\left\{ f(a+\Delta x)+f(b) \right\} \Delta x\\[6pt]
&+\left\{ f(a+\Delta x)+f(a+2\Delta x) \right\} \Delta x\\[6pt]\end{align*}\]
のように表すことができます。一般的に $n$ 分割した場合を考えてみます。

VBA台形公式n分割による定積分の計算

 1 区分の長さは
 
\[\Delta x=\frac{b-a}{n}\]
となり、台形公式による定積分の近似式は

\[\int_{a}^{b}f(x)dx=\frac{b-a}{n}\left\{ \frac{f(a)+f(b)}{2}+\sum_{k=1}^{n-1}f \left( a+k\frac{b-a}{n} \right) \right\}\]

と表されます。
 

対数関数の定積分を台形公式で計算するマクロ

 対数関数 $f(x)=\log x$ を任意の区間 $[a,\:b]$ で積分する Function マクロです。
 あとで真値と比較してその精度も確認しておきます。

 Function SUMLOG(a As Double, b As Double) As Variant

 Dim n As Integer, k As Integer
 Dim delta As Double, sedge As Double, smid As Double

 '真数条件および b > a を満たしているかチェックします
 If a > 0 And b > 0 And b > a Then

 '区間の分割数を指定します
 n = 100

 '区分の長さを計算します
 delta = (b - a) / n

 '端点における寄与を計算します
 sedge = (Log(a) + Log(b)) / 2

 '端点以外の寄与を計算します
 For k = 1 To n - 1
  smid = smid + Log(a + k * delta)
 Next k

 '積分の近似値を得ます
 SUMLOG = (sedge + smid) * delta

 Else

 SUMLOG = CVErr(xlErrNA)

 End If

 SUMLOG 関数を使うときはセルに

=SUMLOG(a,b)

と入力します。a, b は非負かつ a < b となるように指定しないとエラーが表示されます。

近似計算の精度を調べます

 上のマクロで a, b にそれぞれ 1, 10 を指定したとき、すなわち定積分
 
\[\int_{1}^{10}\log xdx\]
を計算させたときの戻り値と真値を比較すると

 戻り値:14.025  真値:14.026

となって 4 桁まで一致する精度があります。この精度は分割数 n を大きくすることによって高めることができます。上のマクロで n = 1000 と書き換えてみると

 戻り値:14.0258  真値:14.0259

というように 5 桁の精度となります。 ≫ VBA 数学マクロ

スポンサーリンク
末尾広告
末尾広告

コメントをどうぞ

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください