Binary Search for Finding Roots

Hi there,

I'm new to this forum and java programming. I've been trying to write a code that can find the roots of a function via Binary Search.

The idea is to pick two numbers that I know surround the root, because the function is positive in one end and negative in the other. Then I repeatedly divide the area in half and move either the lower or upper bound appropriately, until the difference becomes smaller than Epsilon (a constant I define).

The function I'm experimenting with is: f(x) = x^3 - 14*x^2 + 59*x - 65.

I've come down to the following code, however now I'm stuck and I don't get the correct result. I've calculated it manually and the root is ~1.72

The Code:

public class BSearchRoot {

static double Eplison = 1;

public static void main( String args[] ) {

double f, a, b, c, d, high, low, x;;

int flag;

x = 10; // Calculate the function with x = 10

a = x*x*x;

b = 14*(x*x);

c = 59*x;

d = 65;

f = a - b + c - d;

while (f == 0) { // Check if the root is 10

System.out.println("Root is: "+x);

return;

}

while (f < 0) { // Find the upper bound by adding 10 to x until f becomes higher than 0

x = x + 10;

a = x*x*x;

b = 14*(x*x);

c = 59*x;

d = 65;

f = a - b + c - d;

}

high = x; // Set the upper bound

System.out.println("Original high is: "+high); //Print the upper bound

while (f > 0) { // Find the lower bound by subtracting 10 from x until f becomes lower than 0

x = x - 10;

a = x*x*x;

b = 14*(x*x);

c = 59*x;

d = 65;

f = a - b + c - d;

}

low = x; // Set the lower bound

System.out.println("Original low is: "+low);

flag = -1; // Control whether or not to use the upper or lower bound

while ((high-low) > Eplison) { // Do while the difference is > Eplison

if (flag == -1) { // Calculate the lower bound

x = low;

a = x*x*x;

b = 14*(x*x);

c = 59*x;

d = 65;

f = a - b + c - d;

low = x/2.0; // Divide the area in half

flag = -flag;

}

else {

x = high; // Upper bound

a = x*x*x;

b = 14*(x*x);

c = 59*x;

d = 65;

f = a - b + c - d;

high = x/2; // Divide the area in half

flag = -flag;

}

}

// Print the results

System.out.println("high is: "+high);

System.out.println("low is: "+low);

System.out.println("x is: "+x);

System.out.println("f is: "+f);

}

}

When I run the code I get the output:

Original high is: 10.0

Original low is: 0.0

high is: 0.625

low is: 0.0

x is: 1.25

f is: -11.171875

I want to get the output where f is as low as possible.

Any help/criticism is greatly appreciated.

Thank you in advanced.