2011-10-12 14 views
6

私は、解析関数のテイクと数値積分法を作り、それを特定の間隔で積分したいと考えています。数値積分手順については、nr.comでいくつかの手順を使用したいと考えています。問題は、これらがC++でプログラミングされており、ファンクタを使用して統合メソッドに関数を渡すことです。 VB 2010でこれを行うにはどうすればいいですか?関数を関数に渡すにはどうすればよいですか? VB2010で利用可能な関数/関数オブジェクトは?

関数を初期化したい(つまり、関数y(x)= a * x + bに対してa = 1、b = 0を設定して)関数を積分方法に渡したいとします。次に、統合メソッドが関数を呼び出すときには、1つのパラメータ(つまり、a、bは既に設定されているのでx)を持つ関数を呼び出すだけです。

VB2010でこれを行う最良の方法は何ですか? 私は、単一値の関数と積分の制限を渡すことができる一般的な統合方法を作りたいと思います。

私はVBを使用して開始している、と私が見つけたものはこれまでのところ、それはあなたが持っているツールのように思えるからで である - 私たちに機能 ためのデリゲート - 機能 のためのラムダ式を使用する - 送信pointer/adressOf - 関数クラス/構造体を作成して関数に提出する

今のところ、私は関数クラスを作成するのが最も意欲的です。しかし、私はどのように本当によく分かりません。 F.ex.統合したい "uniqe関数"ごとに異なるクラスを作成しますが、integrate-function-callで引数の型を指定する必要がある場合、それらをどのように統合関数に渡すことができますか?

これは多くの数学演算に適用される基本的な問題のようですので、これを明確にすることは非常に便利だと思います。

答えて

3

チェックアウトdelegates

呼び出す関数の署名付きデリゲートを定義する必要があります。関数 "別の関数を取ります"には、定義したデリゲートの型のパラメータが必要です。デリゲートのインスタンスを作成し、addressofを実際の関数に渡し、デリゲートインスタンスをパラメータ経由で関数に渡すことができます。

すばやく汚れた例。

Public Class Test 
    Public Delegate Function MyDelegate(Param1 As Integer) As Integer 

    Public Function DoSomethingWithParam1(Param1 As Integer) As Integer 
     Return Param1 + 1 
    End Function 

    Public Sub ThisFunctionTakesADelegate(f As MyDelegate) 
     Dim result As Integer = f.Invoke(2) 
    End Sub 

    Public Sub main() 
     Dim f As New MyDelegate(AddressOf DoSomethingWithParam1) 

     ThisFunctionTakesADelegate(f)'pass the function "DoSomethingWithParam1" as a parameter to "ThisFunctionTakesADelegate" 
    End Sub 

End Class 

また、専用という名前の関数を持たない関数呼び出しを定義する別の方法として、LambdasまたはAnonymous functionsをチェックアウトする必要があります。

9

申し訳ありませんが、コードチャンクは長いですが、ラムダと匿名機能で使用できるさまざまなオプションを示したいと思います。

まず、我々は...

'Solves a basic linear equation y(x) = ax + b, given a, b, and x. 
Function Linear(a As Double, b As Double, x As Double) As Double 
    Return a * x + b 
End Function 

'Return the inverse of a number (i.e. y(x) = -x) 
Function Inverse(x As Double) As Double 
    Return -x 
End Function 

と機能を取る関数と遊ぶためにいくつかの基本的な機能を作成します。

'To help differentiate the type of the parameter from the return type, 
'I'm being generic with the return type. This function takes any function 
'that takes a double and returns some generic type, T. 
Public Function EvalEquation(Of T)(x As Double, equation As Func(Of Double, T)) As T 
    Return equation(x) 
End Function 

最後に、これを使用します。

'The closest thing to a functor is probably the AddressOf keyword. 
For x = 0 To 10 
    Dim answer = EvalEquation(x, AddressOf Inverse) 
    'Do something 
Next 

しかし、AddressOfにはいくつかの制限があります。 EvalEquationForXはただ1つのパラメータをとる関数を必要とします。したがって、余分なパラメータを渡すことができないため、単にAddressOfを使用することはできません。しかし、私はそれを行うことができる機能を動的に作成することができます。

For x = 0 To 10 
    Dim answer = EvalEquation(x, Function(x) 
            Dim a = 1 
            Dim b = 0 
            Return Linear(a, b, x) 
           End Function) 
    'Do something 
Next 

私はあなたがFunc(Of T1, T2, T3, T4,... TResult)を定義できることに注意しなければならないので、あなたは、2つのパラメータと使用の代わりを取ることができる機能を作成することができます。

Public Function EvalEquationWithTwoParameters(Of T)(
    a As Double, b As Double, x As Double, 
    equation As Func(Of Double, Double, Double, T)) As T 

    Return equation(a, b, x) 
End Function 

そして、このようにそれを使用します。

For x = 0 To 10 
    Dim answer = EvalEquationWithTwoParameters(1, 0, x, AddressOf Linear) 
    'Do something 
Next 

希望に役立ちます!

関連する問題