00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #ifndef QVMULTIDIMENSIONALFUNCTIONMINIMIZER_H
00026 #define QVMULTIDIMENSIONALFUNCTIONMINIMIZER_H
00027
00028 #include <qvmath/qvvector.h>
00029 #include <qvmath/qvmath.h>
00030 #include <gsl/gsl_errno.h>
00031 #include <gsl/gsl_math.h>
00032 #include <gsl/gsl_multimin.h>
00033
00034 #ifndef DOXYGEN_IGNORE_THIS
00035
00043 class QVMultidimensionalMinimizer
00044 {
00045 private:
00046 int iterations, vectorSize;
00047 QVVector actual, step;
00048 double minimumValue;
00049
00050 static double static_function (const gsl_vector *v, void *multidimensionalOptimizerPtr);
00051
00052 public:
00053 virtual double function (const QVVector &v) = 0;
00054
00055 QVMultidimensionalMinimizer(const int vectorSize, const double stepSize):
00056 iterations(0), vectorSize(vectorSize), actual(vectorSize,0), step(vectorSize, stepSize) { }
00057
00058 void setStartingVector(const QVVector &vector) { actual = vector; }
00059 void setStepVector(const QVVector &vector) { step = vector; }
00060 void setMinimum(const QVVector &vector) { actual = vector; }
00061 void setMinimumValue(const double value) { minimumValue = value; }
00062
00063 const QVVector & getMinimum() const { return actual; }
00064 const double & getMinimumValue() const { return minimumValue; }
00065 const int & getIterations() const { return iterations; }
00066
00067 const QList<QVVector> gridIterate(const QVVector &firstVertex, const QVVector &secondVertex, const int divisions = 5, const int maxIterations = 100, const double maxError = 1e-5);
00068 bool iterate(const int maxIterations = 100, const double maxError = 1e-5);
00069 };
00070
00071 #endif
00072 #endif
00073