我想制作一个数值积分方法,其中包含分析函数并将其整合到特定的时间间隔内。对于数值积分过程,我想在nr.com中使用一些过程。问题是它们是用C ++编程的,它们使用函子将函数传递给集成方法。我怎么能在VB 2010中做到这一点?
我想初始化函数(即为函数y(x)= a * x + b设置a = 1,b = 0)然后将函数传递给积分方法。然后当积分方法调用函数时,它只用一个参数调用函数(即x,因为a,b已经设置)
在VB2010中执行此操作的最佳方法是什么? 我想制作一个通用的集成方法,我可以传递任何单值函数和积分限制。
我刚开始使用VB,到目前为止,我发现它似乎是你拥有的工具 - 给我们一个功能的代表 - 为函数使用lambda表达式 - 发送指针/地址 - 创建一个函数类/结构并将其提交给函数
至于现在,我最倾向于创建一个功能类。但我不确定如何。 F.ex.我为每个想要集成的“uniqe函数”创建不同的类,但是当我需要在integration-function-call中指定参数类型时,如何将它们传递给集成函数?
这似乎是一个适用于许多数学运算的基本问题,因此我认为澄清这一点非常有用。
答案 0 :(得分:11)
很抱歉代码块较长,但我想展示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
希望有所帮助!
答案 1 :(得分:4)
结帐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
作为定义函数调用的替代方法,而无需专用的命名函数。