NMath User's Guide

TOC |  Previous |  Next |  Index

25.2 Minimizing Derivable Functions (.NET, C#, CSharp, Visual Basic, VB.NET)

NMath provides two classes that implement the IMultiVariableDMinimizer interface, and minimize a MultiVariableFunction using function evaluations and derivative calculations:

Like all NMath minimizers, instances of ConjugateGradientMinimizer and VariableMetricMinimizer are constructed by specifying an error tolerance and a maximum number of iterations, or by accepting the defaults for these values. For example, this code constructs a VariableMetricMinimizer using a tolerance or 10-5 and a maximum of 20 iterations:

double tol = 1e-5;
int maxIter = 20;
VariableMetricMinimizer minimizer =
  new VariableMetricMinimizer( tol, maxIter );

Class ConjugateGradientMinimizer and VariableMetricMinimizer implement the IMultiVariableDMinimizer interface, which provides a single Minimize() method with the following signature:

DoubleVector Minimize( MultiVariableFunction f, 
                       MultiVariableFunction[] df,
                       DoubleVector x ); 

where f is the function to minimize, df is an array of partial derivatives, and x is the start point.

For instance, given the following function and partial derivatives:

protected static double MyFunction( DoubleVector v )
{
  return ( ( v[0] - 5.0 ) * ( v[0] - 5.0 ) ) +
         ( ( v[1] + 3.0 ) * ( v[1] + 3.0 ) );
}

protected static double MyFunctionDx( DoubleVector v )
{
  return ( 2 * v[0] ) - 10;
}

protected static double MyFunctionDy( DoubleVector v )
{
  return ( 2 * v[1] ) + 6;
}

This code computes the minimum using a ConjugateGradientMinimizer, starting at the origin:

MultiVariableFunction function = new MultiVariableFunction(
    new NMathFunctions.DoubleVectorDoubleFunction( MyFunction ) );

MultivariableFunction partialx = new MultiVariableFunction(
  new NMathFunctions.DoubleVectorDoubleFunction( MyFunctionDx ) );
MultivariableFunction partialy = new MultiVariableFunction(
  new NMathFunctions.DoubleVectorDoubleFunction( MyFunctionDy ) );
MultiVariableFunction[] df =
  new MultiVariableFunction[] { partialx, partialy };

ConjugateGradientMinimizer minimizer = 
  new ConjugateGradientMinimizer();
DoubleVector start = new DoubleVector( 2, 0 );
DoubleVector min = minimizer.Minimize( f, df, start );

TOC |  Previous |  Next |  Index