9 real fa = f(a), fb = f(b);
11 throw std::invalid_argument(
12 "bisection: f(a) and f(b) must have opposite signs");
14 for (
idx i = 0; i < max_iter; ++i) {
15 real mid = 0.5 * (a + b);
17 if (std::abs(fm) < tol || 0.5 * (b - a) < tol)
18 return {mid, i + 1, std::abs(fm),
true};
27 real mid = 0.5 * (a + b);
28 return {mid, max_iter, std::abs(f(mid)),
false};
33 for (
idx i = 0; i < max_iter; ++i) {
35 if (std::abs(fx) < tol)
36 return {x, i + 1, std::abs(fx),
true};
38 if (std::abs(dfx) < 1
e-14)
39 return {x, i + 1, std::abs(fx),
false};
42 return {x, max_iter, std::abs(f(x)),
false};
46 real f0 = f(x0), f1 = f(x1);
47 for (
idx i = 0; i < max_iter; ++i) {
48 if (std::abs(f1) < tol)
49 return {x1, i + 1, std::abs(f1),
true};
51 if (std::abs(df) < 1
e-14)
52 return {x1, i + 1, std::abs(f1),
false};
53 real x2 = x1 - f1 * (x1 - x0) / df;
59 return {x1, max_iter, std::abs(f1),
false};
63 real fa = f(a), fb = f(b);
65 throw std::invalid_argument(
66 "brent: f(a) and f(b) must have opposite signs");
70 real d = b - a,
e = d;
72 for (
idx i = 0; i < max_iter; ++i) {
79 if (std::abs(fc) < std::abs(fb)) {
88 real tol1 = 2.0 * 1
e-15 * std::abs(b) + 0.5 * tol;
89 real mid = 0.5 * (c - b);
91 if (std::abs(mid) <= tol1 || std::abs(fb) < tol)
92 return {b, i + 1, std::abs(fb),
true};
94 if (std::abs(
e) >= tol1 && std::abs(fa) > std::abs(fb)) {
106 p = s * (2.0 * mid * t * (t - r) - (b - a) * (r - 1.0));
107 q = (t - 1.0) * (r - 1.0) * (s - 1.0);
116 if (2.0 * p < std::min(3.0 * mid * q - std::abs(tol1 * q),
117 std::abs(e_prev * q))) {
131 b += (std::abs(d) > tol1) ? d : (mid > 0.0 ? tol1 : -tol1);
134 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.