Root Bracketing Solvers in Visual Basic QuickStart Sample

Illustrates the use of the root bracketing solvers for solving equations in one variable in Visual Basic.

View this sample in: C# F# IronPython

Option Infer On

' The RootBracketingSolver and derived classes reside in the 
' Numerics.NET.EquationSolvers namespace.
Imports Numerics.NET.EquationSolvers
' Function delegates reside in the Numerics.NET
' namespace.
Imports Numerics.NET.Algorithms
Imports Numerics.NET

    ' Illustrates the use of the root bracketing solvers 
    ' in the Numerics.NET.EquationSolvers namespace of Numerics.NET.
    Module RootBracketingSolvers

        Sub Main()
        ' The license is verified at runtime. We're using
        ' a 30 day trial key here. For more information, see
        '     https://numerics.net/trial-key
        Numerics.NET.License.Verify("64542-18980-57619-62268")

        ' Root bracketing solvers are used to solve 
        ' non-linear equations in one variable.
        '
        ' Root bracketing solvers start with an interval
        ' which is known to contain a root. This interval
        ' is made smaller and smaller in successive 
        ' iterations until a certain tolerance is reached,
        ' or the maximum number of iterations has been
        ' exceeded.
        '
        ' The properties and methods that give you control
        ' over the iteration are shared by all classes
        ' that implement iterative algorithms.

        '
        ' Target function
        '
        ' The function we are trying to solve 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.Cos
        ' All root bracketing solvers inherit from
        ' RootBracketingSolver, an abstract base class.
        Dim solver As RootBracketingSolver

        '
        ' Bisection method
        '

        ' The bisection method halves the interval during
        ' each iteration. It is implemented by the
        ' BisectionSolver class.
        Console.WriteLine("BisectionSolver: cos(x) = 0 over [1,2]")
        solver = New BisectionSolver()
        solver.LowerBound = 1
        solver.UpperBound = 2
        solver.TargetFunction = f
        Dim result As Double = solver.Solve()
        ' The Status property indicates
        ' the result of running the algorithm.
        Console.WriteLine("  Result: {0}",
                solver.Status)
        ' The result is also available through the
        ' Result property.
        Console.WriteLine($"  Solution: {solver.Result}")
        ' You can find out the estimated error of the result
        ' through the EstimatedError property:
        Console.WriteLine("  Estimated error: {0}",
                solver.EstimatedError)
        Console.WriteLine("  # iterations: {0}",
                solver.IterationsNeeded)

        '
        ' Regula Falsi method
        '
        ' The Regula Falsi method optimizes the selection
        ' of the next interval. Unfortunately, the 
        ' optimization breaks down in some cases.
        ' Here is an example:
        Console.WriteLine("RegulaFalsiSolver: cos(x) = 0 over [1,2]")
        solver = New RegulaFalsiSolver()
        solver.LowerBound = 1
        solver.UpperBound = 2
        solver.MaxIterations = 1000
        solver.TargetFunction = f
        result = solver.Solve()
        Console.WriteLine("  Result: {0}",
                solver.Status)
        Console.WriteLine($"  Solution: {solver.Result}")
        Console.WriteLine("  Estimated error: {0}",
                solver.EstimatedError)
        Console.WriteLine("  # iterations: {0}",
                solver.IterationsNeeded)

        ' However, for sin(x) = 0, everything is fine:
        Console.WriteLine("RegulaFalsiSolver: sin(x) = 0 over [-0.5,1]")
        solver = New RegulaFalsiSolver()
        solver.LowerBound = -0.5
        solver.UpperBound = 1
        solver.TargetFunction = AddressOf Math.Sin
        result = solver.Solve()
        Console.WriteLine("  Result: {0}",
                solver.Status)
        Console.WriteLine($"  Solution: {solver.Result}")
        Console.WriteLine("  Estimated error: {0}",
                solver.EstimatedError)
        Console.WriteLine("  # iterations: {0}",
                solver.IterationsNeeded)

        '
        ' Dekker-Brent method
        '
        ' The Dekker-Brent method combines the best of
        ' both worlds. It is the most robust and, on average,
        ' the fastest method.
        Console.WriteLine("DekkerBrentSolver: cos(x) = 0 over [1,2]")
        solver = New DekkerBrentSolver()
        solver.LowerBound = 1
        solver.UpperBound = 2
        solver.TargetFunction = f
        result = solver.Solve()
        Console.WriteLine("  Result: {0}",
                solver.Status)
        Console.WriteLine($"  Solution: {solver.Result}")
        Console.WriteLine("  Estimated error: {0}",
                solver.EstimatedError)
        Console.WriteLine("  # iterations: {0}",
                solver.IterationsNeeded)

        '
        ' Controlling the process
        '
        Console.WriteLine("Same with modified parameters:")
        ' You can set the maximum # of iterations:
        ' If the solution cannot be found in time, the
        ' Status will return a value of
        ' IterationStatus.IterationLimitExceeded
        solver.MaxIterations = 20
        ' You can specify how convergence is to be tested
        ' through the ConvergenceCriterion property:
        solver.ConvergenceCriterion =
                         ConvergenceCriterion.WithinRelativeTolerance
        ' And, of course, you can set the absolute or
        ' relative tolerance.
        solver.RelativeTolerance = 0.00001
        ' In this example, the absolute tolerance will be 
        ' ignored.
        solver.AbsoluteTolerance = 1.0E-24
        solver.LowerBound = 157081
        solver.UpperBound = 157082
        solver.TargetFunction = f
        result = solver.Solve()
        Console.WriteLine("  Result: {0}",
                solver.Status)
        Console.WriteLine($"  Solution: {solver.Result}")
        ' The estimated error will be less than 0.157
        Console.WriteLine("  Estimated error: {0}",
                solver.EstimatedError)
        Console.WriteLine("  # iterations: {0}",
                solver.IterationsNeeded)

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

End Module