23 Tracer tr(
"FindMaximum2::Fit");
24 enum State {Start, Restart, Continue, Interpolate, Extrapolate,
26 State TheState = Start;
27 Real z,w,
x,x2,g,l1,l2,l3,d1,d2=0,d3;
29 int np = Theta.
Nrows();
33 Theta1 = Theta; HP = 0.0; g = 0.0;
43 tr.ReName(
"FindMaximum2::Fit/Start");
44 Value(Theta1,
true, l1, oorg);
48 tr.ReName(
"FindMaximum2::Fit/ReStart");
50 if (conv) { TheState = Convergence;
break; }
51 if (counter++ > n_it) { TheState = Fail;
break; }
54 H3 = H1 * z; K = (H3 - HP) * g; HP = H3;
56 if (g==0.0) K1 = 0.0;
else K1 = K * 0.2 + K1 * 0.6;
62 tr.ReName(
"FindMaximum2::Fit/Continue");
63 Theta2 = Theta1 + H1 + K;
64 Value(Theta2,
false, l2, oorg);
65 if (counter++ > n_it) { TheState = Fail;
break; }
68 H1 *= 0.5; K *= 0.25; d1 *= 0.5; g *= 2.0;
69 TheState = Continue;
break;
74 tr.ReName(
"FindMaximum2::Fit/Interpolate");
75 z = d1 + d2 - 3.0 * (l2 - l1);
77 if (w < 0.0) { TheState = Extrapolate;
break; }
79 if (1.5 * w + d1 < 0.0)
80 { TheState = Extrapolate;
break; }
81 if (d2 > 0.0 && l2 > l1 && w > 0.0)
82 { TheState = Extrapolate;
break; }
83 x = d1 / (w + d1); x2 =
x *
x; g /=
x;
84 Theta3 = Theta1 + H1 *
x + K * x2;
85 Value(Theta3,
true, l3, oorg);
86 if (counter++ > n_it) { TheState = Fail;
break; }
90 {
x *= 0.5; x2 =
x*
x; g *= 2.0; d1 *=
x; H1 *=
x; K *= x2; }
93 x = 0.5 * (
x-1.0); x2 =
x*
x; Theta1 = Theta2;
94 H1 = (H1 + K * 2.0) *
x;
95 K *= x2; g = 0.0; d1 =
x * d2; l1 = l2;
97 TheState = Continue;
break;
100 if (l3 >= l1 && l3 >= l2)
101 { Theta1 = Theta3; l1 = l3; TheState = Restart;
break; }
105 { H1 *=
x; K *= x2; Theta2 = Theta3; d1 *=
x; d2 = d3*
x; }
108 Theta1 = Theta2; Theta2 = Theta3;
109 x -= 1.0; x2 =
x*
x; g = 0.0; H1 = (H1 + K * 2.0) *
x;
110 K *= x2; l1 = l2; l2 = l3; d1 =
x*d2; d2 =
x*d3;
111 if (d1 <= 0.0) { TheState = Start;
break; }
113 TheState = Interpolate;
break;
116 tr.ReName(
"FindMaximum2::Fit/Extrapolate");
117 Theta1 = Theta2; g = 0.0; K *= 4.0; H1 = (H1 * 2.0 + K);
118 d1 = 2.0 * d2; l1 = l2;
119 TheState = Continue;
break;
125 Theta = Theta1;
return;
virtual void Value(const ColumnVector &, bool, Real &, bool &)=0
virtual bool NextPoint(ColumnVector &, Real &)=0
virtual Real LastDerivative(const ColumnVector &)=0