New Version 6.0!

Try it for free with our fully functional 60-day trial version.

Download now!

QuickStart Samples

Higher Dimensional Numerical Integration QuickStart Sample (Visual Basic)

Illustrates numerical integration of functions in higher dimensions using classes in the Extreme.Mathematics.Calculus namespace in Visual Basic.

C# code F# code IronPython code Back to QuickStart Samples

Option Infer On

' The numerical integration classes reside in the
' Extreme.Mathematics.Calculus namespace.
Imports Extreme.Mathematics.Calculus
' Function delegates reside in the Extreme.Mathematics
' namespace.
Imports Extreme.Mathematics
Imports Extreme.Mathematics.Algorithms

Namespace Extreme.Numerics.QuickStart.VB
    ' Illustrates numerical integration in higher dimensions using
    ' classes in the Extreme.Mathematics.Calculus namespace of the Extreme
    ' Optimization Numerical Libraries for .NET.
    Module NDIntegration

        Sub Main()
            '
            ' Two-dimensional integration
            '

            ' The function we are integrating must be
            ' provided as a Func(Of Double, Double, Double) delegate. 
            ' For more information about this delegate, see the
            ' FunctionDelegates QuickStart sample.
            '
            ' The functions used in this sample are defined at
            ' the end of this file.
            Dim f1 As Func(Of Double, Double, Double) = AddressOf Integrand1
            Dim f2 As Func(Of Double, Double, Double) = AddressOf Integrand2
            Dim f3 As Func(Of Double, Double, Double) = AddressOf Integrand3

            ' Variable to hold the result:
            Dim result As Double

            ' The AdaptiveIntegrator2D class is the most efficient
            ' 2D integrator in most cases. It uses an adaptive algorithm.

            ' Construct an instance of the integrator class:
            Dim integrator1 As New AdaptiveIntegrator2D()

            ' An example of setting the integrand and bounds through properties
            ' is given below. Here, we put the integrand and the bounds 
            ' of the integration region directly in the call to Integrate, 
            ' which performs the calculation:
            integrator1.Integrate(f1, 0, 1, 0, 1)
            Console.WriteLine("4 / (1 + 2x + 2y) on [0,1] * [0,1]")
            Console.WriteLine("  Value:       {0:F15}", integrator1.Result)
            Console.WriteLine("  Exact value: {0:F15} = Ln(3125 / 729)", Math.Log(3125.0 / 729.0))
            ' To see whether the algorithm ended normally,
            ' inspect the Status property:
            Console.WriteLine("  Status: {0}", _
                integrator1.Status)
            Console.WriteLine("  Estimated error: {0}", _
                integrator1.EstimatedError)
            Console.WriteLine("  Iterations: {0}", _
                integrator1.IterationsNeeded)
            Console.WriteLine("  Function evaluations: {0}", _
                integrator1.EvaluationsNeeded)

            ' Another integrator uses repeated 1-dimensional
            ' integration:
            Dim integrator2 As New Repeated1DIntegrator2D()

            ' You can set the order of integration, as well as
            ' the integration rules for the X and the Y direction:
            integrator2.InitialDirection = Repeated1DIntegratorDirection.X

            ' You can set the integrand and the bounds of the integration region
            ' by setting properties of the integrator object:
            integrator2.Integrand = f2
            integrator2.XLowerBound = 0.0
            integrator2.XUpperBound = 1.0
            integrator2.YLowerBound = 0.0
            integrator2.YUpperBound = 1.0

            result = integrator2.Integrate()
            Console.WriteLine("Pi^2 / 4 Sin(Pi x) Sin(Pi y)   on [0,1] * [0,1]")
            Console.WriteLine("  Value:       {0:F15}", integrator2.Result)
            Console.WriteLine("  Exact value: {0:F15}", 1.0)
            ' To see whether the algorithm ended normally,
            ' inspect the Status property:
            Console.WriteLine("  Status: {0}", _
                integrator2.Status)
            Console.WriteLine("  Estimated error: {0}", _
                integrator2.EstimatedError)
            Console.WriteLine("  Iterations: {0}", _
                integrator2.IterationsNeeded)
            Console.WriteLine("  Function evaluations: {0}", _
                integrator2.EvaluationsNeeded)

            '
            ' Integration over arbitrary regions
            '

            ' The repeated 1D integrator can also be used to compute
            ' integrals over arbitrary regions. To do this, you need to
            ' supply function that return the lower bound and upper bound 
            ' of the region as a function of x.

            ' Here, we integrate x^2 * y^2 over the unit disk.
            integrator2.LowerBoundFunction = AddressOf DiskLowerBound
            integrator2.UpperBoundFunction = AddressOf DiskUpperBound
            integrator2.XLowerBound = -1.0
            integrator2.XUpperBound = 1.0

            integrator2.Integrand = f3

            result = integrator2.Integrate()
            Console.WriteLine("x^2 * y^2 on the unit disk")
            Console.WriteLine("  Value:       {0:F15}", integrator2.Result)
            Console.WriteLine("  Exact value: {0:F15} = Pi / 24", Math.PI / 24)
            ' To see whether the algorithm ended normally,
            ' inspect the Status property:
            Console.WriteLine("  Status: {0}", _
                integrator2.Status)
            Console.WriteLine("  Estimated error: {0}", _
                integrator2.EstimatedError)
            Console.WriteLine("  Iterations: {0}", _
                integrator2.IterationsNeeded)
            Console.WriteLine("  Function evaluations: {0}", _
                integrator2.EvaluationsNeeded)

            Console.Write("Press Enter key to exit...")
            Console.ReadLine()
        End Sub

        ' <summary>
        ' Function to integrate over [0, 1] * [0, 1]
        ' </summary>
        Function Integrand1(ByVal x As Double, ByVal y As Double) As Double
            Return 4 / (1 + 2 * x + 2 * y)
        End Function

        ' <summary>
        ' Function to integrate over [0, 1] * [0, 1]
        ' </summary>
        Function Integrand2(ByVal x As Double, ByVal y As Double) As Double
            Return Math.PI * Math.PI / 4 * Math.Sin(Math.PI * x) * Math.Sin(Math.PI * y)
        End Function

        ' <summary>
        ' Lower bound of a unit disk as a function of x.
        ' </summary>
        Function DiskLowerBound(ByVal x As Double) As Double
            x = Math.Abs(x)
            If (x >= 1) Then
                Return 0
            End If
            Return -Math.Sqrt(1 - x * x)
        End Function

        ' <summary>
        ' Upper bound of a unit disk as a function of x.
        ' </summary>
        Function DiskUpperBound(ByVal x As Double) As Double
            x = Math.Abs(x)
            If (x >= 1) Then
                Return 0
            End If
            Return Math.Sqrt(1 - x * x)
        End Function

        ' <summary>
        ' Function to integrate over the unit disc.
        ' </summary>
        Function Integrand3(ByVal x As Double, ByVal y As Double) As Double
            Return x * x * y * y
        End Function

    End Module

End Namespace