/* * bisect.c : Bisektions-Verfahren für * * f(x) := cos(x) - x = 0 * * a, b ..... Startintervall bzw. Bisektionsintervall * xacc ..... Genauigkeit der Näherungslösung */ #include #include #include #define sign(a) ( (a) >= 0.0 ? 1.0 : -1.0 ) /* Signumfunktion */ #define MAXITER 40 /* * f(x) */ double f( double x ) { return(cos(x) - x); } int main( void ) { double a, b, xmid, fa, fb, fmid, xacc; int j; printf("a : "); scanf("%lf", &a); printf("b : "); scanf("%lf", &b); printf("xacc : "); scanf("%lf", &xacc); fa = f(a); fb = f(b); if ( sign(fa)*sign(fb) > 0.0 ) { fprintf(stderr, "bisect: f(a), f(b) haben gleiches Vorzeichen\n"); exit(1); } /* Bisektionsschleife */ for ( j = 1; j <= MAXITER; j++ ) { xmid = a + 0.5*(b - a); fmid = f(xmid); printf("xm = %12.8f |b-a| = %14.7e f(xm) = %14.7e\n", xmid, fabs(b-a), fmid); if ( sign(fa)*sign(fmid) < 0.0 ) { /* linkes Teilintervall */ b = xmid; } else { /* rechtes Teilintervall */ a = xmid; fa = fmid; } if ( fabs(b - a) < xacc ) { printf("s = %12.8f\n", a + 0.5*(b - a)); break; } } if ( j > MAXITER ) { printf("bisect: MAXITER ueberschritten\n"); exit(1); } return(0); }