# Root Bracketing Solvers in IronPython QuickStart Sample

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

View this sample in: C# Visual Basic F#

```Python import numerics from math import * # The RootBracketingSolver and derived classes reside in the # Extreme.Mathematics.EquationSolvers namespace. from Extreme.Mathematics.EquationSolvers import * # Function delegates reside in the Extreme.Mathematics # namespace. from Extreme.Mathematics import * from Extreme.Mathematics.Algorithms import * # Illustrates the use of the root bracketing solvers # in the Extreme.Mathematics.EquationSolvers namespace of the Extreme # Optimization Mathematics Library for .NET. # 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<double, double>. For more # information about this delegate, see the # FunctionDelegates QuickStart sample. f = cos # All root bracketing solvers inherit from # RootBracketingSolver, an abstract base class. # # Bisection method # # The bisection method halves the interval during # each iteration. It is implemented by the # BisectionSolver class. print "BisectionSolver: cos(x) = 0 over [1,2]" solver = BisectionSolver() solver.LowerBound = 1 solver.UpperBound = 2 # The target function is a Func<double, double>. # See above. solver.TargetFunction = f 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 # # 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: print "RegulaFalsiSolver: cos(x) = 0 over [1,2]" solver = RegulaFalsiSolver() solver.LowerBound = 1 solver.UpperBound = 2 solver.MaxIterations = 1000 solver.TargetFunction = f result = solver.Solve() print " Result:", solver.Status print " Solution:", solver.Result print " Estimated error:", solver.EstimatedError print " # iterations:", solver.IterationsNeeded # However, for sin(x) = 0, everything is fine: print "RegulaFalsiSolver: sin(x) = 0 over [-0.5,1]" solver = RegulaFalsiSolver() solver.LowerBound = -0.5 solver.UpperBound = 1 solver.TargetFunction = sin result = solver.Solve() print " Result:", solver.Status print " Solution:", solver.Result print " Estimated error:", solver.EstimatedError print " # iterations:", 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. print "DekkerBrentSolver: cos(x) = 0 over [1,2]" solver = DekkerBrentSolver() solver.LowerBound = 1 solver.UpperBound = 2 solver.TargetFunction = f 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 = 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 = 1e-6 # In this example, the absolute tolerance will be # ignored. solver.AbsoluteTolerance = 1e-24 solver.LowerBound = 157081 solver.UpperBound = 157082 solver.TargetFunction = f result = solver.Solve() print " Result:", solver.Status print " Solution:", solver.Result # The estimated error will be less than 0.157 print " Estimated error:", solver.EstimatedError print " # iterations:", solver.IterationsNeeded ```