Illustrates the use of the NewtonRaphsonSolver class for solving equations in one variable and related functions for numerical differentiation in IronPython.
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