00001 00029 #ifndef NEWTON_SEARCH_H 00030 #define NEWTON_SEARCH_H 00031 00032 #include <itpp/base/vec.h> 00033 #include <itpp/base/array.h> 00034 #include <limits> 00035 00036 00037 namespace itpp 00038 { 00039 00045 00046 00048 enum Newton_Search_Method {BFGS}; 00049 00071 class Newton_Search 00072 { 00073 public: 00075 Newton_Search(); 00077 ~Newton_Search() {}; 00078 00080 void set_function(double(*function)(const vec&)); 00082 void set_gradient(vec(*gradient)(const vec&)); 00084 void set_functions(double(*function)(const vec&), vec(*gradient)(const vec&)) { set_function(function); set_gradient(gradient); } 00085 00087 void set_start_point(const vec &x, const mat &D); 00088 00090 void set_start_point(const vec &x); 00091 00093 vec get_solution(); 00094 00096 bool search(); 00098 bool search(vec &xn); 00100 bool search(const vec &x0, vec &xn); 00101 00103 void set_stop_values(double epsilon_1, double epsilon_2); 00105 double get_epsilon_1() { return stop_epsilon_1; } 00107 double get_epsilon_2() { return stop_epsilon_2; } 00108 00110 void set_max_evaluations(int value); 00112 int get_max_evaluations() { return max_evaluations; } 00113 00115 void set_initial_stepsize(double value); 00117 double get_initial_stepsize() { return initial_stepsize; } 00118 00120 void set_method(const Newton_Search_Method &method); 00121 00123 double get_function_value(); 00125 double get_stop_1(); 00127 double get_stop_2(); 00129 int get_no_iterations(); 00131 int get_no_function_evaluations(); 00132 00134 void enable_trace() { trace = true; } 00136 void disable_trace() { trace = false; } 00137 00144 void get_trace(Array<vec> & xvalues, vec &Fvalues, vec &ngvalues, vec &dvalues); 00145 00146 private: 00147 int n; // dimension of problem, size(x) 00148 double(*f)(const vec&); // function to minimize 00149 vec(*df_dx)(const vec&); // df/dx, gradient of f 00150 00151 // start variables 00152 vec x_start; 00153 mat D_start; 00154 00155 // solution variables 00156 vec x_end; 00157 00158 // trace variables 00159 Array<vec> x_values; 00160 vec F_values, ng_values, Delta_values; 00161 00162 Newton_Search_Method method; 00163 00164 // Parameters 00165 double initial_stepsize; // opts(1) 00166 double stop_epsilon_1; // opts(2) 00167 double stop_epsilon_2; // opt(3) 00168 int max_evaluations; // opts(4) 00169 00170 // output parameters 00171 int no_feval; // number of function evaluations 00172 int no_iter; // number of iterations 00173 double F, ng, nh; // function value, stop_1, stop_2 values at solution point 00174 00175 bool init, finished, trace; 00176 }; 00177 00178 00179 00181 enum Line_Search_Method {Soft, Exact}; 00182 00222 class Line_Search 00223 { 00224 public: 00226 Line_Search(); 00228 ~Line_Search() {}; 00229 00231 void set_function(double(*function)(const vec&)); 00233 void set_gradient(vec(*gradient)(const vec&)); 00235 void set_functions(double(*function)(const vec&), vec(*gradient)(const vec&)) { set_function(function); set_gradient(gradient); } 00236 00238 void set_start_point(const vec &x, double F, const vec &g, const vec &h); 00239 00241 void get_solution(vec &xn, double &Fn, vec &gn); 00242 00244 bool search(); 00246 bool search(vec &xn, double &Fn, vec &gn); 00248 bool search(const vec &x, double F, const vec &g, const vec &h, vec &xn, 00249 double &Fn, vec &gn); 00250 00251 00253 double get_alpha(); 00255 double get_slope_ratio(); 00257 int get_no_function_evaluations(); 00258 00259 00261 void set_stop_values(double rho, double beta); 00263 double get_rho() { return stop_rho; } 00265 double get_beta() { return stop_beta; } 00266 00268 void set_max_iterations(int value); 00270 int get_max_iterations() { return max_iterations; } 00271 00273 void set_max_stepsize(double value); 00275 double get_max_stepsize() { return max_stepsize; } 00276 00278 void set_method(const Line_Search_Method &method); 00279 00281 void enable_trace() { trace = true; } 00283 void disable_trace() { trace = false; } 00284 00290 void get_trace(vec &alphavalues, vec &Fvalues, vec &dFvalues); 00291 00292 private: 00293 int n; // dimension of problem, size(x) 00294 double(*f)(const vec&); // function to minimize 00295 vec(*df_dx)(const vec&); // df/dx, gradient of f 00296 00297 // start variables 00298 vec x_start, g_start, h_start; 00299 double F_start; 00300 00301 // solution variables 00302 vec x_end, g_end; 00303 double F_end; 00304 00305 // trace variables 00306 vec alpha_values, F_values, dF_values; 00307 00308 bool init; // true if functions and starting points are set 00309 bool finished; // true if functions and starting points are set 00310 bool trace; // true if trace is enabled 00311 00312 // Parameters 00313 Line_Search_Method method; 00314 double stop_rho; // opts(2) 00315 double stop_beta; // opts(3) 00316 int max_iterations; // opts(4) 00317 double max_stepsize; // opts(5) 00318 00319 // output parameters 00320 double alpha; // end value of alpha, info(1) 00321 double slope_ratio; // slope ratio at xn, info(2) 00322 int no_feval; // info(3) 00323 }; 00324 00335 vec fminunc(double(*function)(const vec&), vec(*gradient)(const vec&), const vec &x0); 00336 00338 00339 } // namespace itpp 00340 00341 #endif // #ifndef NEWTON_SEARCH_H
Generated on Sat Jul 9 2011 15:21:32 for IT++ by Doxygen 1.7.4