| 
    
     |  | 自己レスですが、今回覚えたものを使って、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
 
 |  |