|
こちらのページも参考になるかと思います。
http://www2.cc.niigata-u.ac.jp/~takeuchi/tbasic/Intro2Basic/Simpson.html
自分でやる気になっているようなので、邪魔かもしれませんがサンプルの提示です。
Option Explicit
Sub simpTest()
Dim fx As Variant
fx = Array(655,705,780,830,870,890,870,800,725,670,640,620,610)
MsgBox "∫f(x)dx[0<x<120] ≒" & Simpson(fx, 0#, 120#)
End Sub
Function Simpson(fx As Variant, a#, b#)
'∫f(x)dx≒d(f(0)+f(2m)+2(f(2)+...+f(2m-2))+4(f(1)+...+f(2m-1)))/3
Dim ∫Fx#
Dim M% 'M = 2m
Dim d%
Dim i%
M = UBound(fx) - LBound(fx)
If M Mod 2 <> 0 Or M <= 0 Then
Simpson = "!INPUT FUNCTION INVARID"
Exit Function
End If
If a >= b Then
Simpson = "!DEFINITION RANGE INVARID"
Exit Function
End If
d = ((b - a) / M)
∫Fx = fx(LBound(fx)) + fx(UBound(fx))
For i = LBound(fx) + 1 To UBound(fx) - 1
If i Mod 2 = 0 Then
∫Fx = ∫Fx + 2 * fx(i)
Else
∫Fx = ∫Fx + 4 * fx(i)
End If
Next
Simpson = ∫Fx * d / 3#
End Function
今回は関数の形が今一つ汎用性がありませんが、一般の関数でも動くようにいろいろと工夫すると、プログラムがよく理解できると思います。
お試しください。
|
|