2011-10-12 3 views
6

Voglio fare un metodo di integrazione numerica con una funzione analitica e integrarla in un intervallo specifico. Per la procedura di integrazione numerica, desidero utilizzare alcune procedure in nr.com. Il problema è che questi sono programmati in C++ e usano i funtori per passare una funzione al metodo di integrazione. Come posso farlo in VB 2010?Come passare una funzione a una funzione? i funtori/oggetti funzione sono disponibili in VB2010?

Desidero inizializzare la funzione (ad esempio, impostare a = 1, b = 0 per la funzione y (x) = a * x + b) e quindi passare la funzione al metodo di integrazione. Quindi, quando il metodo di integrazione chiama la funzione, chiama la funzione con un solo parametro (ad esempio, poiché a, b è già impostato)

Qual è il modo migliore per farlo in VB2010? Voglio fare un metodo di integrazione generale dove posso passare qualsiasi funzione a valore singolo e limiti di integrazione.

Ho appena iniziato a utilizzare VB, e da quello che ho trovato finora sembra che gli strumenti che si hanno è - a noi un delegato per la funzione - per usare un'espressione lambda per la funzione - inviare un pointer/adressOf - per creare una classe/struttura di funzione e inviarlo alla funzione

Per ora sono più propenso a creare una classe di funzione. Ma non sono davvero sicuro di come. F.ex. Creo classi diverse per ogni "funzione uniqe" che voglio integrare, ma come posso passarle alla funzione di integrazione quando devo specificare il tipo di argomento nell'integration-function-call?

Questo sembra un problema di base che si applica a molte operazioni matematiche, quindi penso che sarebbe molto utile chiarirlo.

risposta

3

Check out delegates.

È necessario definire un delegato con la firma della funzione che si desidera chiamare. La funzione "che accetta un'altra funzione" dovrebbe avere un parametro del tipo di delegato definito. È quindi possibile creare un'istanza del delegato, passando addressof la funzione effettiva e passare l'istanza del delegato alla funzione tramite il parametro.

Un esempio rapido e sporco.

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 

Si dovrebbe anche controllare Lambdas o Anonymous functions come un modo alternativo di definire la chiamata di funzione senza avere una funzione denominata dedicato.

9

Ci scusiamo per i blocchi di codice più lunghi, ma volevo dimostrare le diverse opzioni disponibili con lambdas e funzioni anonime.

Per prima cosa creiamo alcune funzioni di base per giocare con ...

'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 

e una funzione che prende una funzione.

'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 

E, infine, lo useremo!

'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 

Ma AddressOf ha alcune limitazioni ... EvalEquationForX si aspetta una funzione che richiede solo un parametro, quindi non posso semplicemente usare AddressOf, dato che non posso passare i parametri extra. Tuttavia, posso creare dinamicamente una funzione che può farlo per me.

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 

Vorrei sottolineare che è possibile definire un Func(Of T1, T2, T3, T4,... TResult), in modo da poter creare una funzione che potrebbe prendere due parametri e l'uso che, invece.

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 

e usarlo in questo modo:

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

Speranza che aiuta!