#include <math_Function.hxx>
#include <StdFail_NotDone.hxx>
-#define CGOLD 0.3819660
-#ifdef MAX
-#undef MAX
-#endif
-#define MAX(a,b) ((a) > (b) ? (a) : (b))
-#define SIGN(a,b) ((b) > 0.0 ? fabs(a) : -fabs(a))
-#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d)
+static const Standard_Real CGOLD = 0.3819660; //0.5*(3 - sqrt(5));
+
+
+//=======================================================================
+//function : SHFT
+//purpose : Shifts arguments
+//=======================================================================
+inline void SHFT(Standard_Real &theA, Standard_Real &theB,
+ Standard_Real &theC, Standard_Real &theD)
+{
+ theA = theB;
+ theB = theC;
+ theC = theD;
+}
//=======================================================================
//function : math_BrentMinimum
Standard_Real tol1, tol2, u, v, w, xm;
Standard_Real e = 0.0;
Standard_Real d = RealLast();
-
+
a = ((ax < cx) ? ax : cx);
b = ((ax > cx) ? ax : cx);
x = w = v = bx;
if (!myF) {
OK = F.Value(x, fx);
- if(!OK) return;
+ if (!OK) return;
}
fw = fv = fx;
- for(iter = 1; iter <= Itermax; iter++) {
+ for (iter = 1; iter <= Itermax; iter++) {
xm = 0.5 * (a + b);
tol1 = XTol * fabs(x) + EPSZ;
tol2 = 2.0 * tol1;
- if(IsSolutionReached(F)) {
+ if (IsSolutionReached(F)) {
Done = Standard_True;
return;
}
- if(fabs(e) > tol1) {
+ if (fabs(e) > tol1) {
r = (x - w) * (fx - fv);
q = (x - v) * (fx - fw);
p = (x - v) * q - (x - w) * r;
q = 2.0 * (q - r);
- if(q > 0.0) p = -p;
+ if (q > 0.0) p = -p;
q = fabs(q);
etemp = e;
e = d;
- if(fabs(p) >= fabs(0.5 * q * etemp)
- || p <= q * ( a - x) || p >= q * (b - x)) {
- e = (x >= xm ? a - x : b - x);
- d = CGOLD * e;
+ if (fabs(p) >= fabs(0.5 * q * etemp)
+ || p <= q * (a - x) || p >= q * (b - x)) {
+ e = (x >= xm ? a - x : b - x);
+ d = CGOLD * e;
}
else {
- d = p / q;
- u = x + d;
- if(u - a < tol2 || b - u < tol2) d = SIGN(tol1, xm - x);
+ d = p / q;
+ u = x + d;
+ if (u - a < tol2 || b - u < tol2) d = Sign(tol1, xm - x);
}
}
else {
e = (x >= xm ? a - x : b - x);
d = CGOLD * e;
}
- u = (fabs(d) >= tol1 ? x + d : x + SIGN(tol1, d));
+ u = (fabs(d) >= tol1 ? x + d : x + Sign(tol1, d));
OK = F.Value(u, fu);
- if(!OK) return;
- if(fu <= fx) {
- if(u >= x) a = x; else b = x;
+ if (!OK) return;
+ if (fu <= fx) {
+ if (u >= x) a = x; else b = x;
SHFT(v, w, x, u);
SHFT(fv, fw, fx, fu);
}
else {
- if(u < x) a = u; else b = u;
- if(fu <= fw || w == x) {
- v = w;
- w = u;
- fv = fw;
- fw = fu;
+ if (u < x) a = u; else b = u;
+ if (fu <= fw || w == x) {
+ v = w;
+ w = u;
+ fv = fw;
+ fw = fu;
}
- else if(fu <= fv || v == x || v == w) {
- v = u;
- fv = fu;
+ else if (fu <= fv || v == x || v == w) {
+ v = u;
+ fv = fu;
}
}
}