9 real fa = f(a), fb = f(b);
11 throw std::invalid_argument(
"bisection: f(a) and f(b) must have opposite signs");
13 for (
idx i = 0; i < max_iter; ++i) {
14 real mid = 0.5 * (a + b);
16 if (std::abs(fm) < tol || 0.5 * (b - a) < tol)
17 return {mid, i + 1, std::abs(fm),
true};
26 real mid = 0.5 * (a + b);
27 return {mid, max_iter, std::abs(f(mid)),
false};
32 for (
idx i = 0; i < max_iter; ++i) {
34 if (std::abs(fx) < tol)
35 return {x, i + 1, std::abs(fx),
true};
37 if (std::abs(dfx) < 1
e-14)
38 return {x, i + 1, std::abs(fx),
false};
41 return {x, max_iter, std::abs(f(x)),
false};
45 real f0 = f(x0), f1 = f(x1);
46 for (
idx i = 0; i < max_iter; ++i) {
47 if (std::abs(f1) < tol)
48 return {x1, i + 1, std::abs(f1),
true};
50 if (std::abs(df) < 1
e-14)
51 return {x1, i + 1, std::abs(f1),
false};
52 real x2 = x1 - f1 * (x1 - x0) / df;
58 return {x1, max_iter, std::abs(f1),
false};
62 real fa = f(a), fb = f(b);
64 throw std::invalid_argument(
"brent: f(a) and f(b) must have opposite signs");
68 real d = b - a,
e = d;
70 for (
idx i = 0; i < max_iter; ++i) {
77 if (std::abs(fc) < std::abs(fb)) {
86 real tol1 = 2.0 * 1
e-15 * std::abs(b) + 0.5 * tol;
87 real mid = 0.5 * (c - b);
89 if (std::abs(mid) <= tol1 || std::abs(fb) < tol)
90 return {b, i + 1, std::abs(fb),
true};
92 if (std::abs(
e) >= tol1 && std::abs(fa) > std::abs(fb)) {
104 p = s * (2.0 * mid * t * (t - r) - (b - a) * (r - 1.0));
105 q = (t - 1.0) * (r - 1.0) * (s - 1.0);
115 < std::min(3.0 * mid * q - std::abs(tol1 * q), std::abs(e_prev * q))) {
129 b += (std::abs(d) > tol1) ? d : (mid > 0.0 ? tol1 : -tol1);
132 return {b, max_iter, std::abs(fb),
false};
RootResult secant(ScalarFn f, real x0, real x1, real tol=1e-10, idx max_iter=1000)
Secant method (Newton without derivative)
RootResult bisection(ScalarFn f, real a, real b, real tol=1e-10, idx max_iter=1000)
Bisection method.
RootResult brent(ScalarFn f, real a, real b, real tol=1e-10, idx max_iter=1000)
Brent's method (bisection + secant + inverse quadratic interpolation)
RootResult newton(ScalarFn f, ScalarFn df, real x0, real tol=1e-10, idx max_iter=1000)
Newton-Raphson method.
std::function< real(real)> ScalarFn
Real-valued scalar function f(x)
Root-finding methods for scalar equations f(x) = 0.