26.3 Minimizing Derivable Functions (.NET, C#, CSharp, VB, Visual Basic, F#)
Class DBrentMinimizer implements the IOneVariableDMinimizer interface and minimizes a univariate function using Brent's Method in combination with evaluations of the first derivative. As described in Section 26.2, Brent's Method uses parabolic interpolation to fit a parabola through the current bracketing triplet, then uses the parabola to estimate the function's minimum. Class DBrentMinimizer uses the sign of the derivative at the central point of the bracketing triplet to decide which region should be used for the next test point.
Like GoldenMinimizer and BrentMinimizer (Section 26.2), instances of DBrentMinimizer are constructed by specifying an error tolerance and a maximum number of iterations, or by accepting the defaults for these values. This code constructs a DBrentMinimizer using the default error tolerance and maximum number of iterations:
Code Example – C# minimization
var minimizer = new DBrentMinimizer();
Code Example – VB minimization
Dim Minimizer As New DBrentMinimizer()
This code uses an error tolerance of 10-4 and a maximum of 50 iterations:
Code Example – C# minimization
double tol = 1e-4
int maxIter = 50;
var minimizer = new DBrentMinimizer( tol, maxIter );
Code Example – VB minimization
Dim Tol As Double = 0.0001
Dim MaxIter As Integer = 50
Dim Minimizer As New DBrentMinimizer(Tol, MaxIter)
Once you have constructed a DBrentMinimizer instance, you can use the Minimize() method to minimize a given function within a given interval. Overloads of Minimize() accept a bounding Interval, a Bracket, or a triplet of points satisfying the bracketing conditions (Section 26.1). Because DBrentMinimizer uses evaluations of the first derivative of the function, you must also supply a OneVariableFunction encapsulating the derivative. For example, the function:
has a minimum at 5.0. To compute the minimum, first encapsulate the function and its derivative:
Code Example – C# minimization
public static double MyFunction( double x )
{
return ( ( x - 5 ) * ( x - 5 ) );
}
public static double MyFunctionPrime( double x )
{
return ( 2 * x ) - 10;
}
var f = new OneVariableFunction(
new Func<double, double>( MyFunction ) );
var df = new OneVariableFunction(
new Func<double, double>( MyFunctionPrime ) );
Code Example – VB minimization
Public Shared Function MyFunction(X As Double) As Double
Return ((x - 5) * (x - 5))
End Function
Public Shared Function MyFunctionPrime(X As Double) As Double
Return (2 * X) - 10
End Function
Dim F As New OneVariableFunction(
New Func(Of Double, Double)(AddressOf MyFunction))
Dim DF As New OneVariableFunction(
New Func(Of Double, Double)(AddressOf MyFunctionPrime))
This code then constructs a Bracket starting from (1,2), and computes the minimum:
Code Example – C# minimization
var minimizer = new DBrentMinimizer();
var bracket = new Bracket( f, 1, 2 );
double min = minimizer.Minimize( bracket, df );
Code Example – VB minimization
Dim Minimizer As New DBrentMinimizer()
Dim Bracket As New Bracket(F, 1, 2)
Dim Min As Double = Minimizer.Minimize(Bracket, DF)