You are on page 1of 2

#include <stdio.

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; }

// Initial guess points


double x1 = 0;
double x2 = 1;
double x3 = 2;

// Tolerance
double eps = 1e-5;

// Find root
double root = brent(f, x1, x2, x3, eps);

printf("Root = %f\n", root);

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;

while (fabs(b - a) > eps)


{
if (fa != fc && fb != fc)
{
// Inverse quadratic interpolation
s = (a * fb * fc / ((fa - fb) * (fa - fc)))
+ (b * fa * fc / ((fb - fa) * (fb - fc)))
+ (c * fa * fb / ((fc - fa) * (fc - fb)));
}
else
{
// Secant method
s = b - fb * (b - a) / (fb - fa);
}

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;
}

if (fabs(fa) < fabs(fb))


{
double tmp = a;
a = b;
b = tmp;

tmp = fa;
fa = fb;
fb = tmp;
}

printf("Method: %s, a = %f, b = %f, s = %f, error = %f

You might also like