diff --git a/include/gradient.h b/include/gradient.h index 28ac290af8f158efb87429ec614b05cbcedec3ae..df93c2c718bc71cf52d61e7aa23904cc8d06b918 100644 --- a/include/gradient.h +++ b/include/gradient.h @@ -28,7 +28,7 @@ class CGradient void get_coord_constraints(double &max,double &min); void set_function(boost::function<double (double)> p_function); void set_function_der(boost::function<double (double)> p_function); - bool compute(double max_func_error,unsigned int max_iter,double start_point,bool max=true); + bool compute(double max_func_error,unsigned int max_iter,double start_point,bool &beyond_limits,bool max=true); double get_value(void); double get_coordinate(void); ~CGradient(); diff --git a/src/gradient.cpp b/src/gradient.cpp index 3301bb41f45e15b9b240899469620be08f75360a..dd2e5cd07152866b03d514f96758d21b6a6a45a6 100644 --- a/src/gradient.cpp +++ b/src/gradient.cpp @@ -47,13 +47,13 @@ void CGradient::set_function_der(boost::function<double (double)> p_function) this->p_function_der=p_function; } -bool CGradient::compute(double max_func_error,unsigned int max_iter,double start_point,bool max) +bool CGradient::compute(double max_func_error,unsigned int max_iter,double start_point,bool &beyond_limits,bool max) { unsigned int iteration=0; double gamma=1.0,func_value,func_der_value,prev_func_value,prev_func_der_value; double coord,prev_coord,coord_inc; - bool beyond_limits=false; + beyond_limits=false; coord=start_point; func_value=this->p_function(coord); func_der_value=this->p_function_der(coord); @@ -68,7 +68,7 @@ bool CGradient::compute(double max_func_error,unsigned int max_iter,double start coord+=coord_inc; else coord-=coord_inc; - if(coord>this->max_coord) + if((coord-this->max_coord)>max_func_error) { coord=this->max_coord; this->coordinate=coord; @@ -76,7 +76,7 @@ bool CGradient::compute(double max_func_error,unsigned int max_iter,double start beyond_limits=true; break; } - else if(coord<this->min_coord) + else if((coord-this->min_coord)<-max_func_error) { coord=this->min_coord; this->coordinate=coord; @@ -93,7 +93,7 @@ bool CGradient::compute(double max_func_error,unsigned int max_iter,double start }while((fabs(func_value-prev_func_value)>max_func_error || fabs(coord-prev_coord)>0.001) && iteration<max_iter); this->coordinate=coord; this->value=func_value; - if(iteration==max_iter || beyond_limits) + if(iteration==max_iter) return false; else return true;