31 #pragma package(smart_init)
33 #define SMALL_NUM_1 1E-14
34 #define SMALL_NUM_2 1E-28
37 const double FACTOR = 1.6;
38 const unsigned NTRY = 50;
40 double f1 = fn (x1, pvData), f2 = fn (x2, pvData);
48 for (j = 1; j <= NTRY; j++) {
49 if (f1*f2 < 0.)
return 1;
50 if (fabs (f1) < fabs (f2)) {
63 const double FACTOR = 1.6;
64 const unsigned NTRY = 50;
76 double deltaT=xEnd-xStart;
90 x1 = (x1>xStart)?x1:xStart;
92 x2 = (x2<xEnd)?x2:xEnd;
95 double f1 = fn (x1, pvData), f2 = fn (x2, pvData);
103 for (j = 1; j <= NTRY; j++) {
104 if (f1*f2 < 0.)
return 1;
105 if (fabs (f1) < fabs (f2) && x1 > xStart )
107 if (x1+FACTOR*(x1-x2) > xStart)
109 x1 += FACTOR*(x1-x2);
115 f1 = fn (x1, pvData);
117 else if (x2 < xEnd ) {
118 if (x2+FACTOR*(x2-x1) < xEnd)
120 x2 += FACTOR*(x2-x1);
126 f2 = fn (x2, pvData);
135 unsigned n,
double xb1[],
double xb2[],
unsigned nb,
void* pvData) {
136 unsigned i, nbb = nb;
137 double x = x1, dx = (x2-x1)/n,
141 for (i = 1; i <= n; i++) {
152 if (nbb == nb)
return nb;
160 const unsigned JMAX = 50;
161 double fmid = fn (x2, pvData),
f = fn (x1, pvData), rtbis, dx;
179 for (j = 1; j <= JMAX; j++) {
184 fmid = fn (xmid, pvData);
185 if (fmid <= 0.) rtbis = xmid;
186 if ((fabs (dx) <= xacc)||(fmid == 0.))
return rtbis;
194 const double &xacc,
void* pvData) {
195 const unsigned MAXIT = 40;
196 double flo = fn (x1, pvData), fhi = fn (x2, pvData), xl, xh, dx, dummy;
220 for (j = 1; j <= MAXIT; j++) {
221 double rtflsp = xl+dx*flo/(flo-fhi),
222 f = fn (rtflsp, pvData),
223 del = (
f < 0.)? xl-rtflsp: xh-rtflsp;
235 if ((fabs (del) <= xacc)||(
f == 0.))
return rtflsp;
244 const double &x1,
const double &x2,
const double &xacc,
void* pvData) {
245 const unsigned JMAX = 20;
246 double rtnewt = .5*(x1+x2);
249 for (j = 1; j <= JMAX; j++) {
250 double f = fn (rtnewt, pvData), fs = df (rtnewt, pvData),
254 if ((x1-rtnewt)*(rtnewt-x2) < 0.)
259 if (fabs (dx) < xacc)
return rtnewt;
267 const double &x1,
const double &x2,
const double &xacc,
void* pvData) {
268 const unsigned JMAX = 100;
270 double fl = fn (x1, pvData), fh = fn (x2, pvData), xl, xh;
286 double rtsafe = .5*(x1+x2);
287 double dxold = fabs (x2-x1),
289 double f = fn (rtsafe, pvData), fp = df (rtsafe, pvData);
291 for (
unsigned j = 1; j <= JMAX; j++) {
292 if ( ( ((rtsafe-xh)*fp-
f)*((rtsafe-xl)*fp-
f) >= 0 ) ||
293 ( fabs (2*
f) > fabs (dxold*fp) ) ) {
297 if (xl == rtsafe)
return rtsafe;
302 double temp = rtsafe;
304 if (temp == rtsafe)
return rtsafe;
306 if (fabs (dx) < xacc)
return rtsafe;
307 f = fn (rtsafe, pvData);
308 fp = df (rtsafe, pvData);
309 if (
f < 0) xl = rtsafe;