Newton-Raphson Equation Solver in IronPython QuickStart Sample

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

View this sample in: C# Visual Basic F#

```Python
import numerics

from math import sin, cos

# The NewtonRaphsonSolver class resides in the 
# Extreme.Mathematics.EquationSolvers namespace.
from Extreme.Mathematics.EquationSolvers import *
# Function delegates reside in the Extreme.Mathematics
# namespace.
from Extreme.Mathematics import *
# The FunctionMath class resides in the
# Extreme.Mathematics.Calculus namespace.
from Extreme.Mathematics.Calculus import *
from Extreme.Mathematics.Algorithms import *

# Illustrates the use of the Newton-Raphson equation solver 
# in the Extreme.Mathematics.EquationSolvers namespace of the Extreme
# Optimization Mathematics Library for .NET.

# 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<double, double>. For more
# information about this delegate, see the
# FunctionDelegates QuickStart sample.
f = sin
# The Newton-Raphson method also requires knowledge
# of the derivative:
df = cos

# Now let's create the NewtonRaphsonSolver object.
solver = 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:
solver2 = NewtonRaphsonSolver(f, df, 4)

print "Newton-Raphson Solver: sin(x) = 0"
print "  Initial guess: 4"
result = solver.Solve()
# The Status property indicates
# the result of running the algorithm.
print "  Result:", solver.Status
# The result is also available through the
# Result property.
print "  Solution:", solver.Result
# You can find out the estimated error of the result
# through the EstimatedError property:
print "  Estimated error:", solver.EstimatedError
print "  # iterations:", solver.IterationsNeeded

# When you want just the zero without any additional information, # and you don't need to set any parameters (see below), then
# you can call the FindZero extension method on the delegate
# that defines your function:
result = FunctionMath.FindZero(f, df, 4)
print "  Solution:", result

#
# 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
# FunctionMath class (Extreme.Mathematics.Calculus
# namespace) to create a Func<double, double>
# that represents the numerical derivative of the
# target function:
solver.TargetFunction = Special.BesselJ0
solver.DerivativeOfTargetFunction = FunctionMath.GetNumericalDifferentiator(Special.BesselJ0)
solver.InitialGuess = 5
print "Zero of Bessel function near x=5:"
result = solver.Solve()
print "  Result:", solver.Status
print "  Solution:", solver.Result
print "  Estimated error:", solver.EstimatedError
print "  # iterations:", solver.IterationsNeeded

#
# Controlling the process
#
print "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 = 1e-14
# In this example, the absolute tolerance will be 
# ignored.
solver.AbsoluteTolerance = 1e-4
solver.InitialGuess = 5
result = solver.Solve()
print "  Result:", solver.Status
print "  Solution:", solver.Result
# The estimated error will be less than 5e-14
print "  Estimated error:", solver.EstimatedError
print "  # iterations:", solver.IterationsNeeded
```