1 //static const char* sccsid = "@(#)math_BracketMinimum.cxx 3.2 95/01/10"; // Do not delete this line. Used by sccs.
2 #include <math_BracketMinimum.ixx>
4 #include <StdFail_NotDone.hxx> // waiting for NotDone Exception
5 #include <math_Function.hxx>
8 #define CGOLD 0.3819660
14 #define MAX(a,b) ((a) > (b) ? (a) : (b))
15 #define SIGN(a,b) ((b) > 0.0 ? fabs(a) : -fabs(a))
16 #define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d)
19 void math_BracketMinimum::Perform(math_Function& F,
20 const Standard_Real A,
21 const Standard_Real B) {
24 Standard_Real ulim, u, r, q, f, fu, dum;
26 Done = Standard_False;
29 Standard_Real Lambda = GOLD;
31 OK = F.Value(Ax, FAx);
35 OK = F.Value(Bx, FBx);
39 SHFT(dum, Ax, Bx, dum);
40 SHFT(dum, FBx, FAx, dum);
42 Cx = Bx + Lambda * (Bx - Ax);
43 OK = F.Value(Cx, FCx);
46 r = (Bx - Ax) * (FBx -FCx);
47 q = (Bx - Cx) * (FBx -FAx);
48 u = Bx - ((Bx - Cx) * q - (Bx - Ax) * r) /
49 (2.0 * SIGN(MAX(fabs(q - r), TINY), q - r));
50 ulim = Bx + GLIMIT * (Cx - Bx);
51 if((Bx - u) * (u - Cx) > 0.0) {
68 u = Cx + Lambda * (Cx - Bx);
72 else if((Cx - u) * (u - ulim) > 0.0) {
76 SHFT(Bx, Cx, u, Cx + GOLD * (Cx - Bx));
79 SHFT(FBx, FCx, fu, f);
82 else if ((u - ulim) * (ulim - Cx) >= 0.0) {
88 u = Cx + GOLD * (Cx - Bx);
93 SHFT(FAx, FBx, FCx, fu);
101 math_BracketMinimum::math_BracketMinimum(math_Function& F,
102 const Standard_Real A,
103 const Standard_Real B) {
105 myFA = Standard_False;
106 myFB = Standard_False;
110 math_BracketMinimum::math_BracketMinimum(math_Function& F,
111 const Standard_Real A,
112 const Standard_Real B,
113 const Standard_Real FA) {
115 myFA = Standard_True;
116 myFB = Standard_False;
120 math_BracketMinimum::math_BracketMinimum(math_Function& F,
121 const Standard_Real A,
122 const Standard_Real B,
123 const Standard_Real FA,
124 const Standard_Real FB) {
127 myFA = Standard_True;
128 myFB = Standard_True;
133 void math_BracketMinimum::Values(Standard_Real& A, Standard_Real& B, Standard_Real& C) const{
135 StdFail_NotDone_Raise_if(!Done, " ");
141 void math_BracketMinimum::FunctionValues(Standard_Real& FA, Standard_Real& FB, Standard_Real& FC) const{
143 StdFail_NotDone_Raise_if(!Done, " ");
149 void math_BracketMinimum::Dump(Standard_OStream& o) const {
151 o << "math_BracketMinimum ";
153 o << " Status = Done \n";
154 o << " The bracketed triplet is: " << endl;
155 o << Ax << ", " << Bx << ", " << Cx << endl;
156 o << " The corresponding function values are: "<< endl;
157 o << FAx << ", " << FBx << ", " << FCx << endl;
160 o << " Status = not Done \n";