1#ifndef ROOTFINDERFORCSR_H
2#define ROOTFINDERFORCSR_H
6#include <gsl/gsl_errno.h>
7#include <gsl/gsl_math.h>
8#include <gsl/gsl_roots.h>
38 if (
std::abs(x1.imag()) < 1
e-9 && x1.real() > 0.0)
41 std::complex<double>
C2 =
C1 * std::complex<double>(-0.5, -0.5 *
sqrt(3));
43 if (
std::abs(x2.imag()) < 1
e-9 && x2.real() > 0.0)
46 std::complex<double> C3 =
C1 * std::complex<double>(-0.5, 0.5 *
sqrt(3));
48 if (
std::abs(x3.imag()) < 1
e-9 && x3.real() > 0.0)
67 for (i = 1; i < size; ++ i) {
71 if (oldValue * value < 0.0) {
95 return 4.0 *
a_m * x * xsqr + 3.0 *
b_m * xsqr +
d_m;
100 int iter = 0, max_iter = 100;
101 const gsl_root_fsolver_type *
T;
102 gsl_root_fsolver *solver;
111 T = gsl_root_fsolver_brent;
112 solver = gsl_root_fsolver_alloc (
T);
113 gsl_root_fsolver_set (solver, &F, x_lo, x_hi);
118 status = gsl_root_fsolver_iterate (solver);
119 root = gsl_root_fsolver_root (solver);
120 x_lo = gsl_root_fsolver_x_lower (solver);
121 x_hi = gsl_root_fsolver_x_upper (solver);
122 status = gsl_root_test_interval (x_lo, x_hi,
125 while (status == GSL_CONTINUE && iter < max_iter &&
computeValue(root) > tol);
127 gsl_root_fsolver_free (solver);
157 return p->
a_m * x * xcube + p->
b_m * xcube + p->
d_m * x + p->
e_m;
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
Tps< T > sqrt(const Tps< T > &x)
Square root.
PETE_TBTree< FnCopysign, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > copysign(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
constexpr double e
The value of.
RootFinderForCSR(double a, double b, double d, double e)
std::vector< double > thirdOrderRoots_m
T computeValue(const T &x) const
std::complex< double > deltaZero_m
std::pair< double, double > getSearchRange() const
T computeDerivative(T x) const
double searchRoot(const double &tol)
bool hasPositiveRealRoots()
std::complex< double > deltaOne_m
std::pair< double, double > searchRange_m
static double computeValueGSL(double x, void *params)