|
自己レスですが、今回覚えたものを使って、2種類のVBA用積分関数を
作ってみました。両方ともシンプソンの公式を使った比較的高精度のもの
で、片方は用いる関数の引数は一つだけに限定されていますが、もう片方
は引数を配列化することで最大10(いくつでも変更可)までの引数を使
用できます。我流なので見苦しい点はお許しください。
使い方はtest()にありますが、MyFuncのarg(1)が自動的に積分変数にな
り、積分変数以外のパラメータを配列cに放り込む形にしてみました。
なので、積分変数を変更したい場合は、y_bの中のarg(1)の場所を変える
だけでOKです。これで結構使いやすくなったと思うんですが。
ちなみにtest()のIntegralはx^2の0から10までの積分なので答えは1000/3、
Integral2は数字を放り込んでみると結局x^2+3の0から10までの積分なので
答えは1000/3+30になります。
>>>
実は元々は積分じゃなくて他の関数を作りたかったんですが、これで
何とかできそうです(^^)。こうしろうさん、どうもありがとうございました。
>>>
Function Integral(MyFunc As String, a As Double, b As Double, N As Integer)
Dim i As Integer
Dim result As Double, dx As Double
result = Application.Run(MyFunc, a)
dx = (b - a) / (2 * N)
For i = 1 To 2 * N - 1
If (i Mod 2) = 1 Then result = result + 4 * Application.Run(MyFunc, a + CDbl(i) * dx)
If (i Mod 2) = 0 Then result = result + 2 * Application.Run(MyFunc, a + CDbl(i) * dx)
Next
result = result + Application.Run(MyFunc, b)
Integral = result * dx / 3
End Function
Function Integral2(MyFunc As String, a As Double, b As Double, c() As Double, N As Integer)
Dim i As Integer
Dim arg(10) As Double
Dim result As Double, dx As Double
For i = LBound(c) To UBound(c)
arg(i + 1) = c(i)
Next
arg(1) = a
result = Application.Run(MyFunc, arg)
dx = (b - a) / (2 * N)
For i = 1 To 2 * N - 1
arg(1) = a + CDbl(i) * dx
If (i Mod 2) = 1 Then result = result + 4 * Application.Run(MyFunc, arg)
If (i Mod 2) = 0 Then result = result + 2 * Application.Run(MyFunc, arg)
Next
arg(1) = b
result = result + Application.Run(MyFunc, arg)
Integral2 = result * dx / 3
End Function
Function y_a(ByVal x As Double) As Double
y_a = x * x
End Function
Function y_b(arg() As Double) As Double
y_b = (2 * arg(1) ^ 2) ^ arg(2) / arg(3) + arg(4)
End Function
Sub test()
Dim c(4) As Double
Dim i As Integer
For i = 1 To 3
c(i) = i
Next
Debug.Print Integral("y_a", 0, 10, 100)
Debug.Print Integral2("y_b", 0, 10, c, 100)
End Sub
|
|