00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _UT_MinimumFinder_h_
00021 #define _UT_MinimumFinder_h_
00022
00023 #include "UT_API.h"
00024 #include "UT_Vector.h"
00025 class UT_Matrix;
00026
00027 class UT_API UT_MinimumFinder {
00028 public:
00029
00030
00031
00032
00033
00034
00035 int brent(void (*func)(float x, float &val, float &der, void *data),
00036 void *data,
00037 float ax, float bx, float cx,
00038 float tol, float &result, float &val, int maxIter=200) const;
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 int frprPCG(void (*func)(const UT_Vector &x, float &val, UT_Vector &grad,
00049 void *data), void *data,
00050 const UT_Vector &x1, const UT_Vector &x2,
00051 float tol,
00052 UT_Vector &result, int maxIter=200);
00053
00054 private:
00055
00056
00057
00058
00059 int lineMin(void (*func)(const UT_Vector &x, float &val, UT_Vector &grad,
00060 void *data), void *data,
00061 const UT_Vector &org, const UT_Vector &dir,
00062 const UT_Vector &x1, const UT_Vector &x2,
00063 float tol, UT_Vector &result, UT_Vector &displacement,
00064 float &val, int maxIter=200);
00065
00066
00067
00068
00069 void (*myFunc)(const UT_Vector &, float &, UT_Vector &, void *);
00070 UT_Vector *myOrg, *myDir, *myScratch, *myGrad;
00071 void *myData;
00072
00073
00074
00075 friend void evaluateLine(float x, float &val, float &der, void *data);
00076 };
00077
00078 #endif