Data Analysis Mathematics Linear Algebra Statistics
New Version 7.0!  QuickStart Samples

# Newton-Raphson Equation Solver QuickStart Sample (Visual Basic)

Illustrates the use of the NewtonRaphsonSolver class for solving equations in one variable and related functions for numerical differentiation in Visual Basic.

```Option Infer On

' The NewtonRaphsonSolver class resides in the
' Extreme.Mathematics.EquationSolvers namespace.
Imports Extreme.Mathematics.EquationSolvers
' Function delegates reside in the Extreme.Mathematics
' namespace.
Imports Extreme.Mathematics

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 NewtonEquationSolver

Sub Main()
' The Newton-Raphson solver is used to solve
' non-linear equations in one variable.
'
' The algorithm starts with one starting value,
' and uses the target function and its derivative
' to iteratively find a closer approximation to
' the root of the target function.
'
' 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
' Functions QuickStart sample.
Dim f As Func(Of Double, Double) = AddressOf Math.Sin
' The Newton-Raphson method also requires knowledge
' of the derivative:
Dim df As Func(Of Double, Double) = AddressOf Math.Cos
' Now let's create the NewtonRaphsonSolver object.
Dim solver As NewtonRaphsonSolver = New NewtonRaphsonSolver
' Set the target function and its derivative:
solver.TargetFunction = f
solver.DerivativeOfTargetFunction = df
' Set the initial guess:
solver.InitialGuess = 4
' These values can also be passed in a constructor:
Dim solver2 As New NewtonRaphsonSolver(f, df, 4)

Console.WriteLine("Newton-Raphson Solver: sin(x) = 0")
Console.WriteLine("  Initial guess: 4")
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: {0}", 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)

'
' When you don't have the derivative...
'
' You can still use this class if you don't have
' the derivative of the target function. In this
' case, use the static CreateDelegate method of the
' NumericalDifferentiation class (Extreme.Mathematics.Calculus
' namespace) to create a Func(Of Double, Double)
' that represents the numerical derivative of the
' target function:
solver.TargetFunction = f
solver.DerivativeOfTargetFunction = _
FunctionMath.GetNumericalDifferentiator(f)
solver.InitialGuess = 5
Console.WriteLine("Zero of Bessel function near x=5:")
result = solver.Solve()
Console.WriteLine("  Result: {0}", solver.Status)
Console.WriteLine("  Solution: {0}", 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 = 10
' 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.00000000000001
' In this example, the absolute tolerance will be
' ignored.
solver.AbsoluteTolerance = 0.0001
solver.InitialGuess = 5
result = solver.Solve()
Console.WriteLine("  Result: {0}", solver.Status)
Console.WriteLine("  Solution: {0}", solver.Result)
' The estimated error will be less than 5e-14
Console.WriteLine("  Estimated error: {0}", solver.EstimatedError)
Console.WriteLine("  # iterations: {0}", solver.IterationsNeeded)

Console.Write("Press Enter key to exit...")