61 const std::function<
double(
double)>&
f) noexcept :
75 const uint32 maxNumIterations,
76 const std::function<
double(
double)>&
f) noexcept :
95 double solve(
double a,
double b)
102 checkAndFixAlgorithmCriteria(a, b, fa, fb);
109 const double s = calculateSecant(b, fb, lastB, lastFb);
110 const double m = calculateBisection(a, b);
114 b = useSecantMethod(b, s, m) ? s : m;
119 if (fa * fb > 0 && fb * lastFb < 0)
125 checkAndFixAlgorithmCriteria(a, b, fa, fb);
135 const std::function<double(
double)> f_;
146 void checkAndFixAlgorithmCriteria(
double &a,
double &b,
double &fa,
double &fb) noexcept
149 if (std::fabs(fa) < std::fabs(fb))
166 double calculateSecant(
double b,
double fb,
double lastB,
double lastFb) noexcept
169 return b - fb * (b - lastB) / (fb - lastFb);
180 double calculateBisection(
double a,
double b) noexcept
182 return 0.5 * (a + b);
194 bool useSecantMethod(
double b,
double s,
double m) noexcept
197 return (b > m && s > m && s < b) ||
198 (b < m && s > b && s < m);