Class mmin_simp2 (o2scl)¶
-
template<class func_t = multi_funct, class vec_t = boost::numeric::ublas::vector<double>>
class mmin_simp2 : public o2scl::mmin_base<multi_funct, multi_funct, boost::numeric::ublas::vector<double>>¶ Multidimensional minimization by the Simplex method (v2) (GSL)
This class mins a function using Nelder and Mead’s Simplex algorithm. A simplex in a N-dimensional space is defined as a set of N+1 points which describe an N-dimensional volume surrounding the minimum. The algorithm proceeds by shifting the simplex points until the simplex is sufficiently small and thus the minimum is known with sufficient accuracy.
This class has a high-level interface using mmin(), mmin_twovec() or mmin_simplex() which automatically performs the memory allocation and minimization, or a GSL-like interface using allocate(), free(), interate() and set() or set_simplex().
The simplex can be completely specified by the user (see mmin_simplex() and set_simplex()). Alternatively, the simplex is automatically specified given initial guess \( x_j \) and a step size vector \( s_k \) for \( 0\leq k<n_s \). The simplex \( p_{ij} \) with \( 0\leq i\leq n \) and \( 0\leq j<n \) is chosen with \( p_{0j} = x_j \) and
\[\begin{split}\begin{eqnarray*} p_{i+1,j} &=& x_j\quad\mathrm{for}\quad i\neq j \\ p_{i+1,j} &=& x_j+s_{j~\mathrm{mod}~n_s}\quad\mathrm{for}\quad i=j \end{eqnarray*}\end{split}\]for \( 0<i<n \). The step size vector \( s \) is set by the set_step() member function. The prsence of \( \mathrm{mod} \) in the recipe above just indicates that elements of the step size vector are automatically re-used if there are less step sizes than dimensions in the minimization problem.See an example for the usage of this class in Multidimensional minimizer example.
Default template arguments
param_t
- no defaultfunc_t
- multi_functvec_t
- boost::numeric::ublas::vector < double >
Based on [Nelder65].
A variable
count
originally defined in the GSL simplex state is not present here, because it was unused.- Idea for Future:
Double check that the updates in gsl-1.13 are included here, and also add support for the nmsimplex2rand algorithm in GSL.
Note
It is important that the initial simplex contains sufficient variation in every direction of the parameter space over which one is minimizing. For example, if all three points in a simplex for minimizing over a two-dimensional space contain nearly the same value for the second parameter, then the minimizer may only minimize the function with respect to the first parameter.
Note
The algorithm used to estimate the simplex size does not work well any of the parameters in the minimization problem has a scale which is not close to 1.
Public Types
-
typedef boost::numeric::ublas::vector<double> ubvector¶
Public Functions
-
inline mmin_simp2()¶
-
inline virtual ~mmin_simp2()¶
-
template<class vec2_t>
inline int set_step(size_t nv, vec2_t &step)¶ Set the step sizes for each independent variable.
-
inline virtual int mmin(size_t nn, vec_t &xx, double &fmin, func_t &ufunc)¶
Calculate the minimum
min
offunc
w.r.t the arrayx
of sizenvar
.
-
inline virtual int mmin_twovec(size_t nn, vec_t &xx, vec_t &xx2, double &fmin, func_t &ufunc)¶
Calculate the minimum
min
offunc
w.r.t the arrayx
of sizenvar
, usingxx
andxx2
to specify the simplex.
-
template<class mat_t>
inline int mmin_simplex(size_t nn, mat_t &sx, double &fmin, func_t &ufunc)¶ Calculate the minimum
min
offunc
w.r.t the arrayx
of sizenvar
, given an initial simplex.The matrix
sx
should have thedim+1
initial points arranged in rows so that there aredim+1
rows and each row hasdim
columns.
-
inline virtual int allocate(size_t n)¶
Allocate the memory.
-
inline virtual int set(func_t &ufunc, size_t n, vec_t &ax, vec_t &step_size)¶
Set the function and initial guess.
-
template<class mat_t>
inline int set_simplex(func_t &ufunc, mat_t &sx)¶ Set the function and initial simplex.
The matrix
sx
should have thedim+1
initial points arranged in rows so that there aredim+1
rows and each row hasdim
columns.
-
inline virtual int iterate()¶
Perform an iteration.
-
inline virtual int print_iter(size_t nv, vec_t &xx, vec_t *simp, double y, int iter, double value, double limit, std::string comment)¶
Print out iteration information.
Depending on the value of the variable verbose, this prints out the iteration information. If verbose=0, then no information is printed, while if verbose>1, then after each iteration, the present values of x and y are output to std::cout along with the iteration number. If verbose>=2 then each iteration waits for a character.
-
inline virtual const char *type()¶
Return string denoting type(“mmin_simp2”)
Public Members
-
int print_simplex¶
Print simplex information in print_iter() (default 0)
If this is 1 and verbose is greater than 0, then print_iter() will print the function values at all the simplex points. If this is 2 and verbose is greater than 0, then print_iter() will print the simplex coordinates in addition to the function values.
Protected Functions
-
inline int compute_center()¶
Compute the center of the simplex.
-
inline double compute_size()¶
Compute the size of the simplex.
Calculates simplex size as average sum of length of vectors from simplex center to corner points:
\( (1/n) \sum || y - y_{\mathrm{center}} || \)
-
inline virtual int try_corner_move(const double coeff, size_t corner, vec_t &xc, func_t &f, size_t nvar, double &newval)¶
Move a corner of a simplex.
Moves a simplex corner scaled by coeff (negative value represents mirroring by the middle point of the “other” corner points) and gives new corner in xc and function value at xc in
newval
.
Protected Attributes
-
double S2¶
Squared simplex size.
-
size_t dim¶
Number of variables to be mind over.
-
bool avoid_nonzero¶
If true, try to automatically avoid regions where the function returns a non-zero value (default false)
Note
This option doesn’t work yet, so I’ve made the variable protected to prevent the casual user from changing it.
Private Functions
-
mmin_simp2(const mmin_simp2<func_t, vec_t>&)¶
-
mmin_simp2<func_t, vec_t> &operator=(const mmin_simp2<func_t, vec_t>&)¶