4 #include <gsl/gsl_errno.h> 5 #include <gsl/gsl_roots.h> 18 const gsl_root_fsolver_type *_solver_type =
nullptr;
20 gsl_root_fsolver *_solver =
nullptr;
29 std::optional<double> _result;
32 int _status = GSL_CONTINUE;
37 size_t MAX_STEPS = 100;
45 inline int next_step(
double epsabs,
double epsrel) {
47 if (gsl_root_fsolver_iterate(_solver) != GSL_SUCCESS) {
48 throw std::runtime_error(
nmx_msgx(_status));
51 _currentRoot = gsl_root_fsolver_root(_solver);
53 _xmin = gsl_root_fsolver_x_lower(_solver);
55 _xmax = gsl_root_fsolver_x_upper(_solver);
59 _status = gsl_root_test_interval(_xmin, _xmax, epsabs, epsrel);
71 RootBracketing(T &pobj,
const gsl_root_fsolver_type *type = gsl_root_fsolver_bisection)
72 : _solver_type{ type } {
74 _solver = gsl_root_fsolver_alloc(_solver_type);
79 F.function = [](
double x,
void *params) ->
double {
80 auto *myFn =
static_cast<T *
>(params);
89 if (_solver !=
nullptr) {
90 gsl_root_fsolver_free(_solver);
98 inline bool converged()
const {
return _status == GSL_SUCCESS; }
104 inline auto xminmax()
const {
return std::make_pair(_xmin, _xmax); }
111 return gsl_root_fsolver_name(_solver);
124 auto apply(
double xmin,
double xmax, FN fn,
double epsabs,
double epsrel) {
127 gsl_root_fsolver_set(_solver, &F, _xmin, _xmax);
128 for (
size_t i = 1; i <= MAX_STEPS && _status == GSL_CONTINUE; ++i) {
129 next_step(epsabs, epsrel);
130 if (_status == GSL_SUCCESS) {
131 _result = _currentRoot;
133 fn(i, _xmin, _xmax, _currentRoot);
146 inline auto apply(
double xmin,
double xmax,
double epsabs,
double epsrel) {
149 gsl_root_fsolver_set(_solver, &F, _xmin, _xmax);
150 for (
size_t i = 1; i <= MAX_STEPS && _status == GSL_CONTINUE; ++i) {
151 next_step(epsabs, epsrel);
152 if (_status == GSL_SUCCESS) {
153 _result = _currentRoot;
179 const gsl_root_fdfsolver_type *_solverType;
181 gsl_root_fdfsolver *_solver =
nullptr;
183 gsl_function_fdf FDF;
189 size_t _iteration = 0;
191 std::optional<double> _foundRoot;
194 size_t MAX_STEPS = 100;
203 inline void next_step(
double epsabs,
double epsrel) {
205 _status = gsl_root_fdfsolver_iterate(_solver);
209 _xnew = gsl_root_fdfsolver_root(_solver);
211 _status = gsl_root_test_delta(_xnew, _xold, epsabs, epsrel);
213 if (_status == GSL_SUCCESS) {
224 FDFSolver(T &obj,
const gsl_root_fdfsolver_type *type = gsl_root_fdfsolver_newton) {
226 _solver = gsl_root_fdfsolver_alloc(_solverType);
230 FDF.f = [](
double x,
void *params) {
231 return static_cast<T *
>(params)->
f(x);
234 FDF.df = [](
double x,
void *params) {
235 return static_cast<T *
>(params)->df(x);
238 FDF.fdf = [](
double x,
void *params,
double *
f,
double *df) {
239 T *obj =
static_cast<T *
>(params);
249 if (_solver !=
nullptr) {
250 gsl_root_fdfsolver_free(_solver);
259 return gsl_root_fdfsolver_name(_solver);
266 inline bool converged()
const {
return _status == GSL_SUCCESS; }
285 inline auto apply(
double startval,
double epsabs = 0,
double epsrel = 1e-3) {
287 gsl_root_fdfsolver_set(_solver, &FDF, _xnew);
289 next_step(epsabs, epsrel);
290 }
while (_status == GSL_CONTINUE && _iteration < MAX_STEPS);
303 auto apply(
double startval, FN fn,
double epsabs = 0,
double epsrel = 1e-3) {
305 gsl_root_fdfsolver_set(_solver, &FDF, _xnew);
307 next_step(epsabs, epsrel);
308 fn(_iteration, _xold, _xnew);
310 }
while (_status == GSL_CONTINUE && _iteration < MAX_STEPS);
auto xminmax() const
xminmax obere und untere Intervallgrenze
auto apply(double startval, FN fn, double epsabs=0, double epsrel=1e-3)
apply Nullstellensuche
const char * method_used() const
method_used
auto apply(double xmin, double xmax, FN fn, double epsabs, double epsrel)
apply startet Nullstellensuche
static void error_if(const std::string &s, bool arg)
error_if Fehler wenn Bedingung erfüllt ist
auto apply(double xmin, double xmax, double epsabs, double epsrel)
apply startet Nullstellensuche
bool converged() const
converged Status der Nullstellensuche
bool converged() const
converged Status der Nullstellensuche
FDFSolver(T &obj, const gsl_root_fdfsolver_type *type=gsl_root_fdfsolver_newton)
FDFSolver Konstruktor.
double result() const
getRoot Abfrage der gefundenen Nullstelle
The RootBracketing class gsl-Klasse für das Bisektionsverfahren.
double result() const
result liefert die Nullstelle nur falls eine gefunden wurde, sonst wird eine Ausnahme ausgeworfen...
RootBracketing(T &pobj, const gsl_root_fsolver_type *type=gsl_root_fsolver_bisection)
RootBracketing Konstruktor.
const char * method_used() const
method_used
double f(double x, void *params)
f
auto apply(double startval, double epsabs=0, double epsrel=1e-3)
apply Nullstellensuche
The FDFSolver class Nullstellensuche Funktion und ihre Ableitung werden benötigt. ...