60 std::function<
double(
double)>
f) noexcept :
74 const uint32 maxNumIterations,
75 std::function<
double(
double)>
f) noexcept :
94 double solve(
double a,
double b)
101 checkAndFixAlgorithmCriteria(a, b, fa, fb);
108 const double s = calculateSecant(b, fb, lastB, lastFb);
109 const double m = calculateBisection(a, b);
113 b = useSecantMethod(b, s, m) ? s : m;
118 if (fa * fb > 0 && fb * lastFb < 0)
124 checkAndFixAlgorithmCriteria(a, b, fa, fb);
134 const std::function<double(
double)> f_;
145 static void checkAndFixAlgorithmCriteria(
double &a,
double &b,
double &fa,
double &fb) noexcept
148 if (std::fabs(fa) < std::fabs(fb))
165 static double calculateSecant(
double b,
double fb,
double lastB,
double lastFb) noexcept
168 return b - fb * (b - lastB) / (fb - lastFb);
179 static double calculateBisection(
double a,
double b) noexcept
181 return 0.5 * (a + b);
193 static bool useSecantMethod(
double b,
double s,
double m) noexcept
196 return (b > m && s > m && s < b) ||
197 (b < m && s > b && s < m);