2011-10-12 41 views
6

我想要一個數值積分方法,它接受一個分析函數並將其整合到一個特定的時間間隔內。對於數值積分程序,我想使用nr.com中的一些程序。問題在於這些是用C++編程的,他們使用函數來將函數傳遞給集成方法。我如何在VB 2010中做到這一點?如何將函數傳遞給函數?是VB2010中可用的函子/函數對象嗎?

我想初始化函數(即對函數y(x)= a * x + b設置a = 1,b = 0),然後將函數傳遞給積分方法。然後,當積分方法調用函數時,它只調用帶有一個參數的函數(即x,因爲a,b已經設置)

在VB2010中執行此操作的最佳方法是什麼? 我想做一個通用的集成方法,我可以通過任何單值函數和集成限制。

我剛開始使用VB,從我發現到目前爲止,好像你有工具是 - 給我們的功能 的委託 - 使用lambda表達式功能 - 發送pointer/adressOf - 創建函數類/結構並將其提交給函數

至於現在我最傾向於創建一個函數類。但我不確定如何。 F.ex. F.ex.我爲每個要集成的「uniqe函數」創建不同的類,但是當我需要在集成函數調用中指定參數類型時,如何將它們傳遞給集成函數?

這似乎是一個適用於許多數學運算的基本問題,所以我認爲這將是非常有用的澄清這一點。

回答

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 

您也應該檢查出LambdasAnonymous functions作爲定義函數調用,而不必專門命名功能的另一種方式。

9

對不起,代碼塊越長,但我想用lambda表達式和匿名函數來演示可用的不同選項。

首先,我們將創建一些基本的功能一起玩......

'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需要一個只帶一個參數的函數,因此我不能簡單地使用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),所以你可以創建一個可以採取兩個參數並使用它的功能。

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 

希望幫助!