PARP Research Group University of Murcia, Spain


src/qvmath/qvfunctionminimizer.cpp

Go to the documentation of this file.
00001 /*
00002  *      Copyright (C) 2007, 2008. PARP Research Group.
00003  *      <http://perception.inf.um.es>
00004  *      University of Murcia, Spain.
00005  *
00006  *      This file is part of the QVision library.
00007  *
00008  *      QVision is free software: you can redistribute it and/or modify
00009  *      it under the terms of the GNU Lesser General Public License as
00010  *      published by the Free Software Foundation, version 3 of the License.
00011  *
00012  *      QVision is distributed in the hope that it will be useful,
00013  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  *      GNU Lesser General Public License for more details.
00016  *
00017  *      You should have received a copy of the GNU Lesser General Public
00018  *      License along with QVision. If not, see <http://www.gnu.org/licenses/>.
00019  */
00020 
00024 
00025 #include <QVFunctionMinimizer>
00026 
00027 double QVFunctionMinimizer::static_function(const double v, void *functionMinimizerPtr)
00028         {
00029         QVFunctionMinimizer *functionMinimizer = (QVFunctionMinimizer *) functionMinimizerPtr;
00030         functionMinimizer->actual = v;
00031         return functionMinimizer->function(functionMinimizer->actual);
00032         }
00033 
00034 bool QVFunctionMinimizer::iterate(const int maxIterations, const double maxError)
00035         {
00036         // 1. Create GSL minimization structures.
00037         gsl_min_fminimizer *s =
00038                 gsl_min_fminimizer_alloc (useGoldenSection? gsl_min_fminimizer_goldensection : gsl_min_fminimizer_brent);
00039         gsl_function F = { &static_function, this };
00040         gsl_min_fminimizer_set (s, &F, actual, minimum, maximum);
00041 
00042         // 2. Proceed to iterate.
00043         iterations = 0;
00044         int status = GSL_CONTINUE;
00045         while (status == GSL_CONTINUE && iterations++ <= maxIterations)
00046                 if (status = gsl_min_fminimizer_iterate (s))
00047                         break;
00048                 else
00049                         status = gsl_min_test_interval (gsl_min_fminimizer_x_lower (s), gsl_min_fminimizer_x_upper (s), 0.0, maxError);
00050 
00051         // 3. Release GSL minimization structures.
00052         gsl_min_fminimizer_free (s);
00053 
00054         // 4. Return optimization status.
00055         return (status == GSL_SUCCESS);
00056         }
00057 



QVision framework. PARP research group, copyright 2007, 2008.