Home
Install
Use
Develop
Support
News
Credits
hosted by
|
20template< class T, class U>
29static unsigned iter_max = 100;
31template< typename T, class Unary>
32 T Brent (Unary func, T x1, T x2, T tol, T root = 0)
38 T fa = func(a) - root;
39 T fb = func(b) - root;
41 if ((fa > 0.0 && fb > 0.0) || (fa < 0.0 && fb < 0.0)) {
42 Error error (InvalidParam, "Brent", "Root must be bracketed:");
43 error << " f(" << x1 << ")=" << fa << " f(" << x2 << ")=" << fb;
49 for ( unsigned iter=0; iter<iter_max; iter++) {
53 if ((fb > 0.0 && fc > 0.0) || (fb < 0.0 && fc < 0.0)) {
58 if (fabs(fc) < fabs(fb)) {
66 T tol1 = 2.0*EPS*fabs(b) + 0.5*tol;
68 if (fabs(xm) <= tol1 || fb == 0.0) {
72 if (fabs(e) >= tol1 && fabs(fa) > fabs(fb)) {
80 p=s*(2.0*xm*q*(q-r)-(b-a)*(r-1.0));
81 q=(q-1.0)*(r-1.0)*(s-1.0);
86 T min1=3.0*xm*q-fabs(tol1*q);
88 if (2.0*p < (min1 < min2 ? min1 : min2)) {
108 throw Error (InvalidState, "Brent", "maximum iterations exceeded");
115#define CG (0.3819660)
117template< typename T, class Unary>
118 T Brent_min (Unary func, T x1, T x2, T x3, T tol, int func_sign=1)
122 T u=x2, v=x2, w=x2, x=x2;
126 fx = ((T)func_sign) * func(x);
132 for ( unsigned ii=0; ii<iter_max; ii++) {
134 T tol1 = tol * fabs(x) + ZEPS;
137 if (fabs(x-xm) <= (tol2-0.5*(b-a)))
140 if (fabs(e) > tol1) {
143 T p = (x-v)*q - (x-w)*r;
149 if (fabs(p) >= fabs(0.5*q*etemp) || p<=q*(a-x) || p>=q*(b-x)) {
150 e = x>=xm ? a-x : b-x;
155 if (u-a < tol2 || b-u < tol2)
159 e = x>=xm ? a-x : b-x;
163 u = fabs(d)>=tol1 ? x+d : x+sign(tol1,d);
164 fu = ((T)func_sign) * func(u);
174 if (fu<=fw || w==x) {
177 } else if (fu<=fv || v==x || v==w) {
183 throw Error (InvalidState, "Brent_min", "maximum iterations exceeded");
A convenient exception handling class. Definition Error.h:54
Generated using doxygen 1.14.0
|