24template <
typename Function,
typename Real>
26derivative(Function y, Real x, Real delta_target = Real{1.0e-6},
27 Real dx = Real{0.01},
unsigned it_limit = 250) {
30 for (
auto i = 0u;; ++i) {
31 const auto dydx0 = dydx;
32 const auto dy = 0.5 * (y(x + dx) - y(x - dx));
34 delta = std::abs(dydx - dydx0);
35 if (1.1 * delta < delta_target || i > it_limit)
39 return {dydx, 1.1 * delta};
54template <
typename Function,
typename Real>
55std::pair<Real, Real>
Newtons(Function f, Real x,
56 Real delta_target = Real{1.0e-6},
57 Real dx = Real{0.01},
unsigned it_limit = 250) {
59 for (
auto i = 0u;; ++i) {
61 const auto df =
derivative(f, x, delta_target, dx, 4).first;
64 if (std::abs(delta) < delta_target || i > it_limit)
67 return {x, 1.1 * delta};
82template <
typename Function,
typename Real>
83std::pair<Real, Real>
Newtons(Function f, Real x, std::pair<Real, Real> bounds,
84 Real delta_target = Real{1.0e-6},
85 Real dx = Real{0.01},
unsigned it_limit = 250) {
87 for (
auto i = 0u;; ++i) {
89 const auto df =
derivative(f, x, delta_target, dx, 4).first;
92 if (x < bounds.first) {
96 if (x > bounds.second) {
100 if (std::abs(delta) < delta_target || i > it_limit)
103 return {x, 1.1 * delta};
double Real
Data type used to store integrals.
Definition QkTable.hpp:32
double f(RaB r, PrincipalQN n, DiracQN k, Zeff z, AlphaFS a)
Upper radial component.
Definition DiracHydrogen.cpp:71
General-purpose utility library.
Definition Array.hpp:23
std::pair< Real, Real > derivative(Function y, Real x, Real delta_target=Real{1.0e-6}, Real dx=Real{0.01}, unsigned it_limit=250)
Numerical derivative of y(x) at point x; returns {dy/dx, error}.
Definition Methods.hpp:26
std::pair< Real, Real > Newtons(Function f, Real x, Real delta_target=Real{1.0e-6}, Real dx=Real{0.01}, unsigned it_limit=250)
Solves f(x) = 0 using Newton's method; returns {root, error}.
Definition Methods.hpp:55