36 void (*funcd)(
double,
double *,
double *),
40 double df, dx, dxold, f, fh, fl;
41 double temp, xh, xl, rts;
43 (*funcd)(x1, &fl, &df);
44 (*funcd)(x2, &fh, &df);
45 if((fl > 0.0 && fh > 0.0) || (fl < 0.0 && fh < 0.0)) {
49 if(fl == 0.0)
return x1;
50 if(fh == 0.0)
return x2;
58 rts = 0.5 * (x1 + x2);
59 dxold =
fabs(x2 - x1);
61 (*funcd)(rts, &f, &df);
62 for(j = 1; j <=
MAXIT; j++) {
63 if((((rts - xh)*df - f) * ((rts - xl)*df - f) >= 0.0)
64 || (
fabs(2.0 * f) >
fabs(dxold * df))) {
68 if(xl == rts)
return rts;
74 if(temp == rts)
return rts;
76 if(
fabs(dx) < xacc)
return rts;
77 (*funcd)(rts, &f, &df);
84 writeBetError(
"Maximum number of iterations exeeded in findRoot");
double findRoot(void(*funcd)(double, double *, double *), double x1, double x2, double xacc)
void writeBetError(std::string err)
PETE_TUTree< FnFabs, typename T::PETE_Expr_t > fabs(const PETE_Expr< T > &l)