6 #define WANT_STREAM // include.h will get stream fns 7 #define WANT_MATH // include.h will get math fns 25 if ((!minXinf && X <= minX) || (!maxXinf && X >= maxX))
33 Real y = operator()();
41 Select = Exception::Select;
42 AddMessage(
"Error detected by solution package\n");
43 AddMessage(a_what); AddMessage(
"\n");
68 y[0] = -
y[0];
y[1] = -
y[1];
y[2] = -
y[2];
75 x[J] = (
x[I]*
y[K] -
x[K]*
y[I])/(
y[K] -
y[I]);
82 Real YJK, YIK, YIJ, XKI, XKJ;
83 YJK =
y[J] -
y[K]; YIK =
y[I] -
y[K]; YIJ =
y[I] -
y[J];
85 XKJ = (
x[K]*
y[J] -
x[J]*
y[K])/YJK;
86 if (
square(YJK/YIK)>(
x[K] -
x[J])/XKI ||
94 XKI = (
x[K]*
y[I] -
x[I]*
y[K])/YIK;
95 x[I] = (XKJ*
y[I] - XKI*
y[J])/YIJ;
102 enum Loop { start, captured1, captured2, binary, finish };
103 Tracer et(
"OneDimSolve::Solve");
107 if (Dev<0.0) {
hpol=-1; Dev = -Dev; }
110 if (!
function.IsValid(X))
112 Loop TheLoop = start;
122 if (!
function.maxXinf &&
x[
U] >
function.maxX)
123 x[
U] = (
function.maxX + X) / 2.0;
124 if (!
function.minXinf &&
x[
U] <
function.minX)
125 x[
U] = (
function.minX + X) / 2.0;
128 if (
y[
U] > 0.0) { TheLoop = captured1;
Captured =
true;
break; }
138 if (!
function.maxXinf &&
x[
U] >
function.maxX)
139 x[
U] = (
function.maxX +
x[
C]) / 2.0;
140 if (!
function.minXinf &&
x[
U] <
function.minX)
141 x[
U] = (
function.minX +
x[
C]) / 2.0;
144 if (
y[
U] > 0) { TheLoop = captured2;
Captured =
true;
break; }
150 if (TheLoop != start )
break;
160 if (
y[
C] < 0.5*
y[
L]) {
State(
C,
L,
U); TheLoop = binary;
break; }
169 { TheLoop = captured1;
break; }
173 if (
y[
C] > 0.5*
y[
L]) { TheLoop = captured2;
break; }
174 else {
State(
C,
L,
U); TheLoop = captured1;
break; }
185 if (TheLoop != binary)
break;
186 TheLoop = captured1;
break;
SolutionException(const char *a_what=0)
void State(int I, int J, int K)
void Linear(int, int, int)
virtual bool IsValid(Real X)
static unsigned long Select
void Quadratic(int, int, int)
Real Solve(Real Y, Real X, Real Dev, int Lim=100)