エクセルVBAを用いた積分の計算(シンプソン法)

資料請求番号:SH43

Excel VBAマクロでシンプソン法を使い、積分計算を実行する。

シンプソン法は手軽に行えてかつ、精度の高い積分の計算アルゴリズムとして多くの工学系学生やエンジニアに支持されています。

本記事では、このシンプソン法をVBAマクロに実装し、積分計算を行いました。
その備忘録を、実際のソースコードと共に記します。

シンプソン法

シンプソン法は積分したい関数を二次関数の集合体と考え、二次関数の積分をm回行うことで、任意の関数の積分ができるようになる。
という思想のもと開発されました。

シママ

シンプソン法の詳細はこちら!
基本から詳しく説明しています!

シママ

今回は、ソースコードが主役なので、シンプソン法の理論に関する詳しい勉強は上のページでお願いします。

シンプソン法 例題

正規分布

ストーク
こないなオマエが説明してくれた、あのシンプソン法やけども、プログラム書いたことあるん?
シママ
もちろん!学生のころから、今も頻繁に使ってるよ!
ストーク
え?どんなん?
シママ
こんな感じのシートを使ってVBAプログラムを走らせるのよ。

ソースコード

シママ
初心者の方はこれを読みながら使ってみてね!
あと、Functionプロシージャが重要な役割を果たしているんで、それについての説明のリンクも貼っておきます!

/* —-Simpson Method———- */

Public mu, sigma, pi As Double

Sub simpson()

Dim a, b As Double
Dim m As Double
Dim h As Double
Dim S As Double
Dim k As Integer

‘Calculation properties
a = Cells(1, 3)
b = Cells(2, 3)
m = Cells(3, 3)
h = (b – a) / (2 * m)
Cells(4, 3) = h

‘Constants
mu = Cells(5, 3)
sigma = Cells(6, 3)
pi = Cells(7, 3)

‘ZeroSet
S = 0
Cells(2, 5) = a
Cells(2, 6) = F1(a)
Cells(2, 7) = S * h / 3

‘*********roop*********

For k = 1 To m

‘Simpson roop
S = S + F1(a + (2 * k – 2) * h) _
+ 4 * F1(a + (2 * k – 1) * h) _
+ F1(a + 2 * k * h)

‘Graphic roop
Cells(k + 2, 5) = a + 2 * k * h
Cells(k + 2, 6) = F1(a + 2 * k * h)
Cells(k + 2, 7) = S * h / 3

‘Calculation Condition
Cells(11, 2) = k
Cells(11, 4) = m

‘Result

Cells(13, 3) = S * h / 3

Next k

‘*********roop end*********

End Sub

Function F1(ByVal x As Double) As Double
F1 = (2 * pi * sigma) ^ (-0.5) * Exp(-(x – mu) ^ 2 / (2 * sigma))
End Function
/* —————————– */

ストーク
これは・・・正規分布やけんね。

シママ
そうそう!以前、ストークが偏差値の数学的理解について教えてくれたでしょ?得点分布が正規分布になるとして、
偏差値はσが1増えたら10増えるように規格化されているって話。
ストーク
ああ。
シママ
あれを聞いて作ってみたの。
ストーク
ほう。正規分布はな~。身近にある積分計算やけど、手計算で解くとメッチャめんどくさか問題の代表例たいね。そしたら、これがちゃんと計算できるはずやけんな。

シママ
うん!もちろん!この状態で実行してみてよ!
ストーク
平均0、分散1、つまり(μ2)= (0,1)としたとき、μ-2σ~μ+2σの範囲、つまり-2~2の範囲で積分しよったら・・・

ストーク
お~!確かに0.955になった。凄か~!
シママ
えへへ~。
ストーク
お、しかも同時にグラフができるようになってん、しかも、計算式んとこをそのままFuctionプロシージャに貼りつけよったら、自由自在に好きな式ば計算できると。
あと、試行回数の表示がされてバグがあったとき、わかりやすかね。

Function F1(ByVal x As Double) As Double
F1 = (2 * pi * sigma) ^ (-0.5) * Exp(-(x – mu) ^ 2 / (2 * sigma))
End Function

シママ
そうなの!気づいてくれて嬉しいなぁ~!
これで何計算しているかも一目でわかるから割といい「積分計算機」だと思うよ!
ストーク
このソースコードばもらってええん?
シママ
もちろん!ぜひ使って!
ストーク

いやぁ~。これは助かるよ!ありがとう!

シママ

いえいえ~!!

シママ

このVBAのソースコードを使って、関数の積分が解けると思うから、ぜひコピペして色々試してみてね!

おまけ① 三角関数

ストーク

なぁなぁ。この動画知りよるん?

出典:はなおさん 「東大生の店員に理系風に注文したら、賢すぎて返り討ちにされました。東大理三恐るべし、、、」

シママ
あ~阪大の積分サークル?知ってるよ!友蔵の頭の体積求めるやつとかでしょ?なんてったって、この積分サークル主催のイベントで名古屋大学のグループは優勝しましたからね。


積分サークル主催のイベントについて。3:45あたりから。
出典:はなおさん 「YouTubeバレて阪大に呼び出されました。。。」

ストーク
さも自分の功績のように言うなし。ここで東大理Ⅲの学生が即答した

ストーク
もできるんよな?
シママ

当たり前じゃない!このワタシがちょっと関数形変わっただけで使えなくなるプログラム書くと思う?

ストーク
そんなドヤ顔でいわれてもなぁ。
シママ
正規分布ができて三角関数ができないわけないじゃな~い。
ストーク
まぁな。
シママ
使用イメージとしてはこんな感じ。ちなみにVBAは「Alt+F11」で立ち上がるよ。
ストーク
ほー。便利。
シママ
やった!ストークの「便利。」いただきました!!
シママ
ところで、あの東大理Ⅲの学生はなんで即答できたのかな?やっぱ頭の中にグラフがあったのかなぁ?
ストーク
それな。俺もそれやと思う。おそらく思考回路としては

ストーク
とかやなくて

ストーク
これの面積は2。
ストーク
やと思うで。
シママ
やっぱ?
ストーク
まぁ、俺とオマエがそう思うとるだけやもしれんけどな。あるいは膨大な計算経験で記憶してしもうたか。
いずれにしろ、膨大な計算経験と積分の基礎基本がなってないとできんことやから、そこはさすが東大理Ⅲやと思うたいね。

おまけ② 友蔵の頭の体積


出典:はなおさん 「積分サークルの入部テストがヤバい。」

まとめ

今回はシンプソン法による積分の計算をVBAでやってみましたという内容の備忘録でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です