Basic Integration in Visual Basic QuickStart Sample

Illustrates the basic numerical integration classes in Visual Basic.

View this sample in: C# F# IronPython

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

' Illustrates the use of the Newton-Raphson equation solver 
' in the Extreme.Mathematics.EquationSolvers namespace of Extreme Numerics.NET.
Module BasicIntegration

    Sub Main()
        ' The license is verified at runtime. We're using
        ' a demo license here. For more information, see
        ' https://numerics.net/trial-key
        Extreme.License.Verify("Demo license")

        ' 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(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