New Version 6.0!

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

Download now!

QuickStart Samples

Basic Integration QuickStart Sample (Visual Basic)

Illustrates the basic numerical integration classes 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 the use of the Newton-Raphson equation solver 
    ' in the Extreme.Mathematics.EquationSolvers namespace of the Extreme
    ' Optimization Numerical Libraries for .NET.
    Module BasicIntegration

        Sub Main()
            ' Numerical integration algorithms fall into two
            ' main categories: adaptive and non-adaptive.
            ' This QuickStart Sample illustrates the use of
            ' the non-adaptive numerical integrators.
            '
            ' All numerical integration classes derive from
            ' NumericalIntegrator. This abstract base class
            ' defines properties and methods that are shared
            ' by all numerical integration classes.

            '
            ' The integrand
            '
            ' The function we are integrating must be
            ' provided as a Func(Of Double, Double). For more
            ' information about this delegate, see the
            ' Functions QuickStart sample.
            Dim f As Func(Of Double, Double) = AddressOf Math.Sin
            ' Variable to hold the result:
            Dim result As Double

            '
            ' SimpsonIntegrator
            ' 

            ' The simplest numerical integration algorithm
            ' is Simpson's rule. 
            Dim simpson As New SimpsonIntegrator()
            ' You can set the relative or absolute tolerance
            ' to which to evaluate the integral.
            simpson.RelativeTolerance = 0.00001
            ' You can select the type of tolerance using the
            ' ConvergenceCriterion property:
            simpson.ConvergenceCriterion = ConvergenceCriterion.WithinRelativeTolerance
            ' The Integrate method performs the actual 
            ' integration:
            result = simpson.Integrate(f, 0, 5)
            Console.WriteLine("sin(x) on [0,2]")
            Console.WriteLine("Simpson integrator:")
            ' The result is also available in the Result 
            ' property:
            Console.WriteLine("  Value: {0}", simpson.Result)
            ' To see whether the algorithm ended normally,
            ' inspect the Status property:
            Console.WriteLine("  Status: {0}", simpson.Status)
            ' You can find out the estimated error of the result
            ' through the EstimatedError property:
            Console.WriteLine("  Estimated error: {0}", simpson.EstimatedError)
            ' The number of iterations to achieve the result
            ' is available through the IterationsNeeded property.
            Console.WriteLine("  Iterations: {0}", simpson.IterationsNeeded)
            ' The number of function evaluations is available 
            ' through the EvaluationsNeeded property.
            Console.WriteLine("  Function evaluations: {0}", simpson.EvaluationsNeeded)

            '
            ' Gauss-Kronrod Integration
            '

            ' Gauss-Kronrod integrators also use a fixed point 
            ' scheme, but with certain optimizations in the 
            ' choice of points where the integrand is evaluated.

            ' The NonAdaptiveGaussKronrodIntegrator uses a
            ' succession of 10, 21, 43, and 87 point rules
            ' to approximate the integral.
            Dim nagk As New NonAdaptiveGaussKronrodIntegrator()
            nagk.Integrate(f, 0, 5)
            Console.WriteLine("Non-adaptive Gauss-Kronrod rule:")
            Console.WriteLine("  Value: {0}", nagk.Result)
            Console.WriteLine("  Status: {0}", nagk.Status)
            Console.WriteLine("  Estimated error: {0}", nagk.EstimatedError)
            Console.WriteLine("  Iterations: {0}", nagk.IterationsNeeded)
            Console.WriteLine("  Function evaluations: {0}", nagk.EvaluationsNeeded)

            '
            ' Romberg Integration
            '

            ' Romberg integration combines Simpson's Rule
            ' with a scheme to accelerate convergence.
            ' This algorithm is useful for smooth integrands.
            Dim romberg As New RombergIntegrator()
            result = romberg.Integrate(f, 0, 5)
            Console.WriteLine("Romberg integration:")
            Console.WriteLine("  Value: {0}", romberg.Result)
            Console.WriteLine("  Status: {0}", romberg.Status)
            Console.WriteLine("  Estimated error: {0}", romberg.EstimatedError)
            Console.WriteLine("  Iterations: {0}", romberg.IterationsNeeded)
            Console.WriteLine("  Function evaluations: {0}", romberg.EvaluationsNeeded)

            ' However, it breaks down if the integration
            ' algorithm contains singularities or 
            ' discontinuities.
            f = AddressOf HardIntegrand
            result = romberg.Integrate(f, 0, 1)
            Console.WriteLine("Romberg on hard integrand:")
            Console.WriteLine("  Value: {0}", romberg.Result)
            Console.WriteLine("  Actual value: 100")
            Console.WriteLine("  Status: {0}", romberg.Status)
            Console.WriteLine("  Estimated error: {0}", romberg.EstimatedError)
            Console.WriteLine("  Iterations: {0}", romberg.IterationsNeeded)
            Console.WriteLine("  Function evaluations: {0}", romberg.EvaluationsNeeded)

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

        ' Function that will cause difficulties to the
        ' simplistic integration algorithms.
        Private Function HardIntegrand(ByVal x As Double) As Double
            ' This is put in because some integration rules
            ' evaluate the function at x=0.
            If (x <= 0) Then
                Return 0
            End If
            Return Math.Pow(x, -0.9) * Math.Log(1 / x)
        End Function

    End Module

End Namespace