ampsci
c++ program for high-precision atomic structure calculations of single-valence systems
Loading...
Searching...
No Matches
Methods.hpp
1#pragma once
2#include <cmath>
3#include <functional>
4#include <utility>
5
6namespace qip {
7
10
15template <typename Function, typename Real>
16std::pair<Real, Real>
17derivative(Function y, Real x, Real delta_target = Real{1.0e-6},
18 Real dx = Real{0.01}, unsigned it_limit = 250) {
19 Real dydx{0.0};
20 Real delta{1.0};
21 for (auto i = 0u;; ++i) {
22 const auto dydx0 = dydx;
23 const auto dy = 0.5 * (y(x + dx) - y(x - dx));
24 dydx = dy / dx;
25 delta = std::abs(dydx - dydx0);
26 if (1.1 * delta < delta_target || i > it_limit)
27 break;
28 dx *= 0.5;
29 }
30 return {dydx, 1.1 * delta};
31}
32
34
40template <typename Function, typename Real>
41std::pair<Real, Real> Newtons(Function f, Real x,
42 Real delta_target = Real{1.0e-6},
43 Real dx = Real{0.01}, unsigned it_limit = 250) {
44 Real delta{1.0};
45 for (auto i = 0u;; ++i) {
46 // const auto df = (f(x + dx) - f(x)) / dx;
47 const auto df = derivative(f, x, delta_target, dx, 4).first;
48 delta = f(x) / df;
49 x = x - delta;
50 if (std::abs(delta) < delta_target || i > it_limit)
51 break;
52 }
53 return {x, 1.1 * delta};
54}
57template <typename Function, typename Real>
58std::pair<Real, Real> Newtons(Function f, Real x, std::pair<Real, Real> bounds,
59 Real delta_target = Real{1.0e-6},
60 Real dx = Real{0.01}, unsigned it_limit = 250) {
61 Real delta{1.0};
62 for (auto i = 0u;; ++i) {
63 // const auto df = (f(x + dx) - f(x)) / dx;
64 const auto df = derivative(f, x, delta_target, dx, 4).first;
65 delta = f(x) / df;
66 x = x - delta;
67 if (x < bounds.first) {
68 x = bounds.first;
69 break;
70 }
71 if (x > bounds.second) {
72 x = bounds.second;
73 break;
74 }
75 if (std::abs(delta) < delta_target || i > it_limit)
76 break;
77 }
78 return {x, 1.1 * delta};
79}
80
81} // namespace qip
double Real
Data type used to store integrals.
Definition QkTable.hpp:15
double f(RaB r, PrincipalQN n, DiracQN k, Zeff z, AlphaFS a)
Upper radial component.
Definition DiracHydrogen.cpp:71
qip library: A collection of useful functions
Definition Array.hpp:9
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)
Slow, but accurate, method of finding derivative of function (y) at a point (x). Returns derivative +...
Definition Methods.hpp:17
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)
Solve f(x) = 0 for x using Newtons method. Returns root + error estimate/.
Definition Methods.hpp:41