13#ifndef OPTIMIST_ROOTFINDER_CHANDRUPATLA_HH
14#define OPTIMIST_ROOTFINDER_CHANDRUPATLA_HH
41 template <
typename Real>
60 std::string
name_impl()
const {
return "Chandrupatla";}
69 template <
typename FunctionLambda>
72 #define CMD "Optimist::ScalarRootfinder::Chandrupatla::find_root_impl(...): "
83 this->
m_e = QUIET_NAN;
84 this->
m_fe = QUIET_NAN;
87 while (!(std::isfinite(this->
m_fa) && std::isfinite(this->
m_fb))) {
92 CMD "function evaluation failed at iteration " << this->
m_iterations <<
".");
104 Real abs_fa{std::abs(this->
m_fa)};
105 Real abs_fb{std::abs(this->
m_fb)};
107 abs_fa < tolerance_function ||abs_fb < tolerance_function;
115 Real direction{this->
m_b - this->
m_a};
116 Real
tolerance{tolerance_step/(2.0*std::abs(direction))};
120 Real abs_fa{std::abs(this->
m_fa)};
121 Real abs_fb{std::abs(this->
m_fb)};
122 this->
m_converged = abs_fa < tolerance_function || abs_fb < tolerance_function;
128 Real c{this->
m_a + t * direction};
130 success = this->
evaluate_function(std::forward<FunctionLambda>(function), c, fc);
132 CMD "function evaluation failed at iteration " << this->
m_iterations <<
".");
145 if ((0.0 < fc) == (0.0 < this->
m_fa)) {
147 d = this->
m_a; fd = this->
m_fa;
150 d = this->
m_b; fd = this->
m_fb;
154 this->
m_a = c; this->
m_fa = fc;
157 Real ba{this->
m_b - this->
m_a};
159 Real bd{this->
m_b - d};
160 Real fbd{this->
m_fb - fd};
164 Real fl{1.0 - std::sqrt(1.0 - xi)};
165 Real fh{std::sqrt(xi)};
167 if (fl < ph && ph < fh) {
168 Real da{d - this->
m_a};
169 Real fda{fd - this->
m_fa};
170 t = (this->
m_fa/fba) * (fd/fbd) - (this->
m_fa/fda) * (this->
m_fb/fbd) * (da/ba);
175 if (this->
m_a > this->
m_b) {std::swap(this->
m_a, this->
m_b); std::swap(this->
m_fa, this->
m_fb);}
176 return std::abs(this->
m_fa) < std::abs(this->
m_fb) ? this->
m_a : this->
m_b;;
#define OPTIMIST_ASSERT_WARNING(COND, MSG)
Definition Optimist.hh:61
#define OPTIMIST_BASIC_CONSTANTS(Real)
Definition Optimist.hh:71
#define OPTIMIST_ASSERT(COND, MSG)
Definition Optimist.hh:44
Real m_b
Definition Bracketing.hh:51
Real m_e
Definition Bracketing.hh:54
Real m_a
Definition Bracketing.hh:50
Bracketing()
Definition Bracketing.hh:60
Real m_fe
Definition Bracketing.hh:54
Real m_fa
Definition Bracketing.hh:50
Real m_tolerance_bracketing
Definition Bracketing.hh:46
Real m_fc
Definition Bracketing.hh:52
Real m_fb
Definition Bracketing.hh:51
Real m_c
Definition Bracketing.hh:52
static constexpr bool requires_second_derivative
Definition Chandrupatla.hh:47
static constexpr bool requires_first_derivative
Definition Chandrupatla.hh:46
Real find_root_impl(FunctionLambda &&function)
Definition Chandrupatla.hh:70
static constexpr bool requires_function
Definition Chandrupatla.hh:45
std::string name_impl() const
Definition Chandrupatla.hh:60
Chandrupatla()
Definition Chandrupatla.hh:54
void info(Real residuals, std::string const ¬es="-")
Definition SolverBase.hh:924
Integer m_iterations
Definition SolverBase.hh:84
Integer m_max_iterations
Definition SolverBase.hh:85
Real tolerance() const
Definition SolverBase.hh:392
bool m_verbose
Definition SolverBase.hh:92
bool m_converged
Definition SolverBase.hh:98
bool evaluate_function(FunctionLambda &&function, InputType const &x, OutputType &out)
Definition SolverBase.hh:768
Namespace for the Optimist library.
Definition Optimist.hh:88