Optimization In One Dimension in IronPython QuickStart Sample

Illustrates the use of the Brent and Golden Section optimizer classes in the Extreme.Mathematics.Optimization namespace for one-dimensional optimization in IronPython.

View this sample in: C# Visual Basic F#

```Python
import numerics

from math import exp, sqrt

# The optimization classes resides in the 
# Extreme.Mathematics.EquationSolvers namespace.
from Extreme.Mathematics.Optimization import *
# Function delegates reside in the Extreme.Mathematics
# namespace.
from Extreme.Mathematics import *

# Illustrates the use of the Brent and Golden Section optimizers
# in the Extreme.Mathematics.Optimization namespace of Extreme Numerics.NET.

# Several algorithms exist for optimizing functions
# in one variable. The most common one is
# Brent's algorithm.

# The function we are trying to minimize is called the
# objective function and must be provided as a Func<double, double>. 
# For more information about this delegate, see the
# FunctionDelegates QuickStart sample.

#
# Brent's algorithm
#

# Now let's create the BrentOptimizer object.
optimizer = BrentOptimizer()
			
# Set the objective function:
optimizer.ObjectiveFunction = lambda x: x ** 3 - 2 * x - 5

# Optimizers can find either a minimum or a maximum.
# Which of the two is specified by the ExtremumType
# property
optimizer.ExtremumType = ExtremumType.Minimum

# The first phase is to find an interval that contains
# a local minimum. This is done by the FindBracket method.
optimizer.FindBracket(0, 3)
# You can verify that an interval was found from the
# IsBracketValid property:
if not optimizer.IsBracketValid:
	raise Exception("An interval containing a minimum was not found.")

# Finally, we can run the optimizer by calling the FindExtremum method:
optimizer.FindExtremum()

print "Function 1: x^3 - 2x - 5"
# The Status property indicates
# the result of running the algorithm.
print "  Status:", optimizer.Status
# The result is available through the
# Result property.
print "  Minimum:", optimizer.Result
exactResult = sqrt(2/3.0)
result = optimizer.Extremum
print "  Exact minimum:", exactResult

# You can find out the estimated error of the result
# through the EstimatedError property:
print "  Estimated error:", optimizer.EstimatedError
print "  Actual error:", result - exactResult
print "  # iterations:", optimizer.IterationsNeeded

print "Function 2: 1/Exp(x*x - 0.7*x +0.2)"
f2 = lambda x: 1/exp(x**2 - 0.7*x +0.2)
# You can also perform these calculations more directly 
# using the FindMinimum or FindMaximum methods. This implicitly
# calls the FindBracket method.
result = optimizer.FindMaximum(f2, 0)
print "  Maximum:", result
print "  Actual maximum:", 0.35
print "  Estimated error:", optimizer.EstimatedError
print "  Actual error:", result - 0.35
print "  # iterations:", optimizer.IterationsNeeded

#
# Golden section search
#

# A slower but simpler algorithm for finding an extremum
# is the golden section search. It is implemented by the
# GoldenSectionMinimizer class:
optimizer2 = GoldenSectionOptimizer()

# Maximum at x = 0.35
print "Using Golden Section optimizer:"
result = optimizer2.FindMaximum(f2, 0)
print "  Maximum:", result
print "  Actual maximum:", 0.35
print "  Estimated error:", optimizer2.EstimatedError
print "  Actual error:", result - 0.35
print "  # iterations:", optimizer2.IterationsNeeded
```