bisection method for finding roots | Newbie | | Join Date: Apr 2007
Posts: 1
| | Quote:
Originally Posted by salman patni hi myself patni salman i am studied in amit collage aurangabad.i need solution of bisection method program using c language with algorithm Hi
Please try the following program nd do tell me if it works or not.
priya -
/* bisection.c: Implements the bisection method for finding roots.
-
*
-
*
-
*
-
/*
-
-
Solves f(x) = 0, given an initial interval [a,b] such that f has
-
differing signs at the endpoints. Quits when f((a+b)/2) is close
-
enough to zero. Function f must be continuous. It must be implemented
-
as double f(double) in this file or elsewhere. We include an example
-
implementation with f(x) = 3x^3 - x - 1. The endpoints may be
-
specified with -a and -b options. They default to a = 0, b = 1.0.
-
If the endpoints don't have the required property the program quits
-
with an error.
-
-
The algorithm bisects the initial interval successively, until
-
the value of f at the midpoint differs from zero by less than
-
TOLERANCE, which defaults to .00000001. (It can be set on the
-
command line with -t option.) The final result is the midpoint
-
of the last interval. Which of the two bisected halves is retained
-
at a given stage is determined by calculating f at the endpoints,
-
so that the condition of different signs at the endpoints is
-
preserved.
-
-
The program reports the current interval, and the values of f at the
-
endpoints at each stage.
-
-
The algorithm is also implemented in a user callable function.
-
-
*/
-
-
/* compile: cc -o bisection.c -lm
-
-
Use -D_SHORT_STRINGS if your compiler does not support multiline
-
string constants.
-
-
Use -DHAVEF and link object file containing implementation of
-
function declared as double f(double) if you want to solve a non
-
default equation. In this case, also -DEQUATION= so the printout
-
will give the correct heading.
-
-
Use -DNOMAIN and -DHAVEF if you only want to link in function implemented
-
below with declaration
-
-
double bisection(double a, double b, double(*f)(double), double tolerance);
-
-
It is up to the caller to make sure the endpoints and f are suitable.
-
You're toast if they're not.
-
-
*/
-
-
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<math.h>
-
-
#ifndef EQUATION
-
#define EQUATION "3x^3 - x - 1 = 0"
-
#endif
-
#define VERSION "1.0"
-
#define USAGE "bisection [ -a float -b float -t float -h -v]"
-
#ifndef _SHORT_STRINGS
-
#define HELP "\nbisection [ -a float -b float -t float -h -v ]\n\n\
-
Find root of linked function f using bisection method.\n\n\
-
-a: Use next argument as left endpoint of initial interval.\n\
-
-b: Use next argument as right endpoint of initial interval.\n\
-
-t: Use next argument as tolerance. Quit when f(midpoint) dips below this.\n\
-
-v: Print version number and exit. \n\
-
-h: Print this helpful information. \n\n"
-
#else
-
#define HELP USAGE
-
#endif
-
-
/* Default values */
-
#define TOLERANCE .00000001
-
#define LEFT 0.0
-
#define RIGHT 1.0
-
#define MAXPASS 256
-
-
#ifndef HAVEF
-
/* Here is the default function f's implementation. */
-
-
double f(double x){
-
-
return 3.0*x*x*x - x - 1.0;
-
}
-
#else
-
extern double f(double);
-
#endif
-
-
#ifndef NOMAIN
-
int
-
main(int argc, char **argv)
-
{
-
double tolerance = TOLERANCE;
-
double a = LEFT;
-
double b = RIGHT;
-
double c,d,e,mid;
-
int j=0,n=1;
-
-
/* Process command line */
-
while(++j < argc){
-
if(argv[j][0] == '-')
-
switch(argv[j][1]){
-
case 'a':
-
case 'A':
-
if(j+1 >= argc){
-
fprintf(stderr,"%s\n",USAGE);
-
exit(1);
-
}
-
a = atof(argv[j+1]);
-
j++;
-
continue;
-
case 'b':
-
case 'B':
-
if(j+1 >= argc){
-
fprintf(stderr,"%s\n",USAGE);
-
exit(1);
-
}
-
b = atof(argv[j+1]);
-
j++;
-
continue;
-
case 't':
-
case 'T':
-
if(j+1 >= argc){
-
fprintf(stderr,"%s\n",USAGE);
-
exit(1);
-
}
-
tolerance = atof(argv[j+1]);
-
if(tolerance <= 0.0){
-
fprintf(stderr,"tolerance must be
-
-
positive.\n");
-
exit(1);
-
}
-
j++;
-
continue;
-
case 'v':
-
case 'V':
-
printf("%s\n",VERSION);
-
exit(0);
-
case '?':
-
case 'h':
-
case 'H':
-
printf("%s\n",HELP);
-
exit(0);
-
default:
-
fprintf(stderr,"bisection: unkown option %s\n",
-
argv[j]);
-
exit(1);
-
}
-
}
-
-
-
/* Check necessary conditions */
-
-
if( b < a ){
-
fprintf(stderr,"Error: initial endpoints are swapped.\n");
-
exit(1);
-
}
-
c = f(a); d = f(b);
-
if(((c>0.0)&&(d>0.0))||((c<0.0)&&(d<0.0))){
-
-
fprintf(stderr,"f has same sign at enpoints. Cannot continue.\n");
-
exit(1);
-
}
-
-
/* loop until desired tolerance */
-
-
printf("\n\nBisection method solution of %s:\n\n",EQUATION);
-
while(1){
-
-
mid = (a+b)/2.0;
-
e = f(mid);
-
printf("%2d. f[%10.8f,%10.8f] = [%10.8f,%10.8f]\n",
-
n,a,b,c,d,e);
-
if(fabs(e) < tolerance){
-
-
printf("\nSolution is x = %10.8f at tolerance
-
-
%9.8f.\n\n",mid,tolerance);
-
exit(0);
-
}
-
if( c > 0.0)
-
if(e < 0.0) b = mid;
-
else a = mid;
-
if( c < 0.0)
-
if(e > 0.0) b = mid;
-
else a = mid;
-
-
c = f(a); d = f(b);
-
n++;
-
if(n>MAXPASS) exit(1); /* obviously not converging */
-
}
-
-
return 0;
-
-
}
-
#endif
-
-
double bisection(double a, double b, double(*f)(double),double tolerance)
-
{
-
-
double mid,c,d,e;
-
-
c = f(a); d = f(b);
-
while(1){
-
-
mid = (a+b)/2.0;
-
e = f(mid);
-
if(fabs(e) < tolerance)break;
-
if( c > 0.0)
-
if(e < 0.0) b = mid;
-
else a = mid;
-
if( c < 0.0)
-
if(e > 0.0) b = mid;
-
else a = mid;
-
-
c = f(a); d = f(b);
-
}
-
return mid;
-
}
|  | Moderator | | Join Date: Nov 2006 Location: USA
Posts: 3,957
| | | re: bisection method for finding roots Quote:
Originally Posted by epriya Hi
Please try the following program nd do tell me if it works or not.
priya epriya-
This thread has been idle for several months, and posting your own question in it is called 'hijacking' and is considered very rude. I have split your thread from the other.
Just out of curiousity, what stopped you from trying it? Did you try plugging it into a compiler?
|  | | | | Forums
Visit our community forums for general discussions and latest on Bytes
/bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 229,155 network members.
|