00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <qvmath/qvfunctionminimizer.h>
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
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
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
00052 gsl_min_fminimizer_free (s);
00053
00054
00055 return (status == GSL_SUCCESS);
00056 }
00057