Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


73853 / 76732 ←次へ | 前へ→

【7352】Re:関数を引数として用いるには?
回答  森イチロー  - 03/9/3(水) 1:30 -

引用なし
パスワード
     自己レスですが、今回覚えたものを使って、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

0 hits

【7301】関数を引数として用いるには? 森イチロー 03/9/2(火) 0:38 質問
【7304】Re:関数を引数として用いるには? こうしろう 03/9/2(火) 9:51 回答
【7326】Re:関数を引数として用いるには? 森イチロー 03/9/2(火) 16:35 発言
【7331】Re:関数を引数として用いるには? こうしろう 03/9/2(火) 16:54 発言
【7344】Re:関数を引数として用いるには? 森イチロー 03/9/2(火) 21:36 お礼
【7352】Re:関数を引数として用いるには? 森イチロー 03/9/3(水) 1:30 回答

73853 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free