From 0516dd8dda2cf4d8863b9dbdd066da76c22f855f Mon Sep 17 00:00:00 2001 From: Sergi Hernandez Juan <shernand@iri.upc.edu> Date: Wed, 27 Jan 2021 09:18:35 +0100 Subject: [PATCH] Added a flag to indicate if the convergence went beyond the specified limits. --- include/gradient.h | 2 +- src/gradient.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/gradient.h b/include/gradient.h index 28ac290..df93c2c 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 3301bb4..dd2e5cd 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; -- GitLab