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.h>
00029 #include <QVVector>
00030
00031 #include <gsl/gsl_errno.h>
00032 #include <gsl/gsl_math.h>
00033 #include <gsl/gsl_multimin.h>
00034
00035 #ifndef DOXYGEN_IGNORE_THIS
00036
00044 class QVMultidimensionalMinimizer
00045 {
00046 private:
00047 int iterations, vectorSize;
00048 QVVector actual, step;
00049 double minimumValue;
00050
00051 static double static_function (const gsl_vector *v, void *multidimensionalOptimizerPtr);
00052
00053 public:
00054 virtual double function (const QVVector &v) = 0;
00055
00056 QVMultidimensionalMinimizer(const int vectorSize, const double stepSize):
00057 iterations(0), vectorSize(vectorSize), actual(vectorSize,0), step(vectorSize, stepSize) { }
00058
00059 virtual ~QVMultidimensionalMinimizer() { }
00060
00061 void setStartingVector(const QVVector &vector) { actual = vector; }
00062 void setStepVector(const QVVector &vector) { step = vector; }
00063 void setMinimum(const QVVector &vector) { actual = vector; }
00064 void setMinimumValue(const double value) { minimumValue = value; }
00065
00066 const QVVector & getMinimum() const { return actual; }
00067 const double & getMinimumValue() const { return minimumValue; }
00068 const int & getIterations() const { return iterations; }
00069
00070 const QList<QVVector> gridIterate(const QVVector &firstVertex, const QVVector &secondVertex, const int divisions = 5, const int maxIterations = 100, const double maxError = 1e-5);
00071 bool iterate(const int maxIterations = 100, const double maxError = 1e-5);
00072 };
00073
00074 #endif
00075 #endif
00076