[VBA] 定積分を計算するユーザー定義関数

 今回は下の図のように、$x$ と $y$ のデータをまとめて指定して 定積分 を計算する INTEGRAL関数を作ってみます(マクロは記事の一番下に載せてあります)。

2 次関数の積分

 下の図は 2 次関数 $y=x^2$ を $x=-1$ から $x=1$ まで積分しています。

 VBA定積分FunctionMacro

 台形近似を使用しますが、通常の台形近似公式とは少し異なり、セルに入力された区間ごとに近似を行ないます。上の例では $x$ は一定間隔で入力されていますが、所々で刻み幅が変わってもかまいません。具体的には一番左端の台形は
 
\[S(1)=\frac{1}{2}(1^2+0.64^2)\{-0.8-(-1)\}=0.164\]
と計算されます。同様に全ての行について台形の面積を求めて、それを全部足し合わせて積分の近似値とします。具体的に $y=f(x)$ の形に表せないようなデータが入っていても積分を計算してくれます。この関数を使うときはセルに

=INTEGRAL(範囲)

と入力します。範囲は 2 列まとめて指定してください。3 列以上指定することもできますが、3 列目以降のセルの内容は無視されます。上の例では

=INTEGRAL(B3:C13)

と入力して 0.68 という値が返ります。実際の値は 0.67 です。刻み幅を細かくするほど精度は上がります。上の例では $x$ を 0.2 刻みとしていますが、0.1 刻みでデータを入力すると、0.67 という値が返ります。
 

y = 1/x の積分

 もう1つ計算例を載せておきます。
 今度は $y=1/x$ を $x=1$ から $x=2$ まで積分してみます。

 VBA定積分プロシージャ

 上のようなシートを作って、F3 セルに

=INTEGRAL(B3:C13)

と入力すると 0.694 の値が返ります。真値は $\ln2=0.693$ なので、かなり良い精度だと思います。
 

INTEGRAL関数のコード

 INTEGRAL関数は配列を使ったユーザー定義関数です。

 '定積分を計算します
 Function INTEGRAL(xy As Range) As Double

 Dim i As Integer, u As Integer
 Dim a As Double, b As Double
 Dim h As Double, s As Double
 Dim mydata As Variant

 'xyを2次元配列変数に変換します
 mydata = xy

 '配列の要素数を入れます
 u = UBound(mydata, 1)

 台形で近似します
 For i = 1 To u - 1
  h = mydata(i + 1, 1) - mydata(i, 1)
  s = s + (mydata(i, 2) + mydata(i + 1, 2)) * h / 2
 Next i

 INTEGRAL = s

 End Function

 Variant型変数 mydata に Range型変数 xx を放り込んで 2 次元配列変数に変換しています。配列を使った計算なので処理速度はかなり速いはずです。大きなデータで試してみてください。 ≫ VBA 数学マクロ

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

コメントをどうぞ

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