61 Brent(
const double epsilon, std::function<
double(
double)>
f) noexcept :
75 Brent(
const double epsilon,
const uint32 maxNumIterations, std::function<
double(
double)>
f) noexcept :
95 double solve(
double a,
double b)
102 checkAndFixAlgorithmCriteria(a, b, fa, fb);
108 double penultimateB = a;
110 bool bisection =
true;
113 if (useInverseQuadraticInterpolation(fa, fb, lastFb))
115 s = calculateInverseQuadraticInterpolation(a, b, lastB, fa, fb, lastFb);
119 s = calculateSecant(a, b, fa, fb);
122 if (useBisection(bisection, b, lastB, penultimateB, s))
124 s = calculateBisection(a, b);
133 penultimateB = lastB;
148 checkAndFixAlgorithmCriteria(a, b, fa, fb);
153 return fb < fs ? b : s;
158 const std::function<double(
double)> f_;
168 static double calculateBisection(
const double a,
const double b) noexcept
170 return 0.5 * (a + b);
183 static double calculateSecant(
const double a,
const double b,
const double fa,
const double fb) noexcept
187 return b - fb * (b - a) / (fb - fa);
202 static double calculateInverseQuadraticInterpolation(
const double a,
207 const double lastFb) noexcept
209 return a * fb * lastFb / ((fa - fb) * (fa - lastFb)) + b * fa * lastFb / ((fb - fa) * (fb - lastFb)) +
210 lastB * fa * fb / ((lastFb - fa) * (lastFb - fb));
222 static bool useInverseQuadraticInterpolation(
const double fa,
const double fb,
const double lastFb) noexcept
224 return fa != lastFb && fb != lastFb;
236 static void checkAndFixAlgorithmCriteria(
double &a,
double &b,
double &fa,
double &fb) noexcept
239 if (std::fabs(fa) < std::fabs(fb))
257 bool useBisection(
const bool bisection,
260 const double penultimateB,
261 const double s)
const noexcept
268 std::fabs(b - lastB)) ||
272 0.5 * std::fabs(lastB - penultimateB)) ||
276 std::fabs(b - lastB) < DELTA) ||
278 (!bisection && std::fabs(lastB - penultimateB) <
static constexpr dtype max() noexcept
Definition: DtypeInfo.hpp:110
Brent(const double epsilon, const uint32 maxNumIterations, std::function< double(double)> f) noexcept
Definition: Brent.hpp:75
double solve(double a, double b)
Definition: Brent.hpp:95
~Brent() override=default
Brent(const double epsilon, std::function< double(double)> f) noexcept
Definition: Brent.hpp:61
ABC for iteration classes to derive from.
Definition: Iteration.hpp:48
Iteration(double epsilon) noexcept
Definition: Iteration.hpp:56
const double epsilon_
Definition: Iteration.hpp:118
void resetNumberOfIterations() noexcept
Definition: Iteration.hpp:96
void incrementNumberOfIterations()
Definition: Iteration.hpp:107
dtype f(GeneratorType &generator, dtype inDofN, dtype inDofD)
Definition: f.hpp:58
Definition: Coordinate.hpp:45
void swap(NdArray< dtype > &inArray1, NdArray< dtype > &inArray2) noexcept
Definition: swap.hpp:42
NdArray< dtype > min(const NdArray< dtype > &inArray, Axis inAxis=Axis::NONE)
Definition: min.hpp:44
std::uint32_t uint32
Definition: Types.hpp:40