#include <math.h> |
#define ACY 1.0E–6 accuracy for estimates, function, and finite difference values |
#define h 1.0E–7 infinitesimal for finite diferences |
double GRF(float (*func)(double), double A, double B, int n) |
{ |
double X, fX, dX, A, fA, dA, B, fB, dB, a, fa, da, b, fb, db; |
while ( (fabs(B-A)>ACY) && (–n>0) ) |
{ |
double fA=(*func)(A); |
double dA=((*func)(A+h)-(*func)(A))/h; |
if ((fabs(fA)< ACY) || (fabs(dA)< ACY)) // zero or extremum |
return A; |
fB=(*func)(B); |
dB=((*func)(B+h)-(*func)(B))/h; |
if ((fabs(fB)< ACY) || (fabs(dB)< ACY)) // zero or extremum |
return B; |
X=A+fabs(fA)/(fabs(fA)+fabs(fB))*(B-A); |
fX=(*func)(X); |
dX=((*func)(X+h)-(*func)(X))/h; |
if ((fabs(fX)< ACY) || (fabs(dX)< ACY)) // zero or extremum |
return X; |
if ((fA*fX<0) || (dA*dX<0)) |
B = X; |
else |
if ((fX*fB<0) || (dX*dB<0)) |
A = X; |
} |
} |