38template<std::invocable<
double> T>
double ridders(
const T& func,
double x1,
double f1,
double x2,
double f2,
const double tolerance) {
45 const auto x3 = .5 * (x1 + x2);
46 const auto f3 = func(x3);
47 if(std::fabs(f3) < tolerance || std::fabs(x2 - x1) < tolerance) {
52 const auto dx = (x3 - x1) * f3 / std::sqrt(f3 * f3 - f1 * f2);
54 const auto x4 = f1 > f2 ? x3 + dx : x3 - dx;
55 const auto f4 = func(x4);
56 if(std::fabs(f4) < tolerance) {
63 if(std::signbit(f4) != std::signbit(f3)) {
67 else if(std::signbit(f4) != std::signbit(f2)) {
76 suanpan_debug(
"Ridders' method initial guess {:.5E} with {} iterations.\n", target, counter);
81template<std::invocable<
double> T>
double ridders(
const T& func,
double x1,
double x2,
const double tolerance) {
return ridders(func, x1, func(x1), x2, func(x2), tolerance); }
83template<std::invocable<
double> T>
double ridders_guess(
const T& func,
double x1,
double f1,
double x2,
double f2,
const double tolerance) {
84 while(std::signbit(f1) == std::signbit(f2)) {
90 return ridders(func, x1, f1, x2, f2, tolerance);
93template<std::invocable<
double> T>
double ridders_guess(
const T& func,
double x1,
double x2,
const double tolerance) {
return ridders_guess(func, x1, func(x1), x2, func(x2), tolerance); }
double ridders(const T &func, double x1, double f1, double x2, double f2, const double tolerance)
Implements Ridders' method for finding the root of a function.
Definition ridders.hpp:38
double ridders_guess(const T &func, double x1, double f1, double x2, double f2, const double tolerance)
Definition ridders.hpp:83
#define suanpan_debug(...)
Definition suanPan.h:347