Professional Documents
Culture Documents
新建文本文档
新建文本文档
h>
#include <math.h>
// Function prototype
double brent(double (*f)(double), double x1, double x2, double x3, double eps);
int main(void)
{
// Test function
double f(double x) { return x*x*x - x*x - x - 1; }
// Tolerance
double eps = 1e-5;
// Find root
double root = brent(f, x1, x2, x3, eps);
return 0;
}
double brent(double (*f)(double), double x1, double x2, double x3, double eps)
{
double a = fmin(x1, fmin(x2, x3));
double b = fmax(x1, fmax(x2, x3));
double fa = f(a);
double fb = f(b);
if (fa * fb > 0)
{
printf("Error: Function has same sign at both endpoints.\n");
return NAN;
}
double c = a;
double fc = fa;
double s = 0;
double fs = 0;
double d = 0;
double tmp1 = (3 * a + b) / 4;
double tmp2 = (3 * b + a) / 4;
if ((s > tmp1 && s < tmp2) || (s > tmp2 && s < tmp1))
{
// Bisection
s = (a + b) / 2;
}
fs = f(s);
d = c;
c = b;
if (fa * fs < 0)
{
b = s;
fb = fs;
}
else
{
a = s;
fa = fs;
}
tmp = fa;
fa = fb;
fb = tmp;
}