/* Bisection method */
#include <math.h>
#include <stdio.h>
#define MAX_ITER 40
double fof(double x);
main()
{
double a,b,mid, f_a,f_b,f_mid;
double error_bound,tolerance;
int iteration;
printf("enter the range\n");
scanf("%lf %lf",&a,&b);
mid = 0.5 * (b+a);
f_a = fof(a);
f_b = fof(b);
if (f_a * f_b > 0.0)
{
printf("Sorry: bad initial points -- may not bracket a root\n
Try again\n");
exit(1);
}
f_mid = fof(mid);
iteration = 0;
tolerance = .0001;
error_bound = .5 * (b - a);
printf("i a b mid f_of_a f_of_b f_mid err_bound\n");
printf("%d %1.4lf %1.4lf %1.4lf %1.4lf %1.4lf %1.4lf %1.4lf\n",
iteration,a,b,mid,f_a,f_b,f_mid,error_bound);
while ((error_bound > tolerance) && (iteration < MAX_ITER))
{
if (f_a * f_mid < 0.0) {
b = mid;
f_b = f_mid;
mid = .5 * (a+mid);
}
else {
a = mid;
f_a = f_mid;
mid = .5 * (b+mid);
}
f_mid = fof(mid);
error_bound = .5 * (b - a);
iteration++;
printf("%d %lf %lf %lf %lf %lf %lf %lf\n",
iteration,a,b,mid,f_a,f_b,f_mid,error_bound);
}
printf("\nSolution is x = %lf function = %lf iterations = %d
error_bound = %lf\n\n\n", mid,f_mid,iteration,error_bound);
}
double fof(double x)
{
/* You can chose any of these functional forms or you can write your own */
/*return(x - tan(x));*/
/*return(exp(x) - x*x + 3.0*x -2.0);*/
/*return(x*x*x - 25.0); */
return(x*x*x - x - 1.0);
}