Interval centeredFormEval(const Function& function, const IntervalVector& arg) { /*Interval natural_extension = function.eval(arg); Interval centered_form = function.eval(arg.mid()) + function.gradient(arg) * (arg - arg.mid());*/ IntervalVector new_arg_ub(arg); IntervalVector new_arg_lb(arg); IntervalVector grad = function.gradient(arg); for(int i = 0; i < arg.size(); ++i) { if(grad[i].lb() > 0) { new_arg_ub[i] = arg[i].ub(); new_arg_lb[i] = arg[i].lb(); } else if(grad[i].ub() < 0) { new_arg_ub[i] = arg[i].lb(); new_arg_lb[i] = arg[i].ub(); } } Interval natural_extension = function.eval(arg); Interval centered_form = function.eval(arg.mid()) + grad * (arg - arg.mid()); Interval ub_form = function.eval(arg.ub()) + grad * (arg - arg.ub()); Interval lb_form = function.eval(arg.lb()) + grad * (arg - arg.lb()); Interval res = natural_extension & centered_form & ub_form & lb_form; res &= Interval(function.eval(new_arg_lb).lb(), function.eval(new_arg_ub).ub()); return res; }