#include <iostream>
#include <iomanip>
#include <cmath>
#include <vector>
#include <utility>
#define MINX (-20.0f)
//MAXX Happens to be an upper bound for all zeroes of the function...
#define MAXX (1.0f)
#define NUM_INTERVALS (1000000)
#define NUM_BISECTION_ITERATIONS (30)
using namespace std;
double f( double x) {
return 5 * x * exp ( - x) * cos ( x) + 1 ;
}
//Used for Newton's method, if so desired... but that isn't used here.
double df( double x) {
return - 5 * exp ( - x) * x* sin ( x) + 5 * exp ( - x) * x * sin ( x) - 5 * exp ( - x) * x * cos ( x) ;
}
double bisection_method( double x0, double x1) {
for ( unsigned int i = 0 ; i < NUM_BISECTION_ITERATIONS; i++ ) {
double midpoint = 0.5 * x0 + 0.5 * x1;
f( x0) * f( midpoint) < 0 ? x1 = midpoint : x0 = midpoint;
}
return 0.5 * x0 + 0.5 * x1;
}
int main( int argc, char ** argv) {
vector< pair< double , double >> relevant_intervals;
for ( unsigned int i = 0 ; i < NUM_INTERVALS - 1 ; i++ ) {
double x0 = MINX + ( MAXX - MINX) / NUM_INTERVALS * ( i) ;
double x1 = MINX + ( MAXX - MINX) / NUM_INTERVALS * ( i + 1 ) ;
if ( f( x0) * f( x1) < 0 )
relevant_intervals.push_back ( make_pair( x0, x1) ) ;
}
cout << fixed << setprecision( 20 ) ;
for ( const auto & x : relevant_intervals) {
cout << "One solution is approximately " << bisection_method( x.first , x.second ) << endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dXRpbGl0eT4KCiNkZWZpbmUgTUlOWCAoLTIwLjBmKQovL01BWFggSGFwcGVucyB0byBiZSBhbiB1cHBlciBib3VuZCBmb3IgYWxsIHplcm9lcyBvZiB0aGUgZnVuY3Rpb24uLi4KI2RlZmluZSBNQVhYICgxLjBmKQojZGVmaW5lIE5VTV9JTlRFUlZBTFMgKDEwMDAwMDApCiNkZWZpbmUgTlVNX0JJU0VDVElPTl9JVEVSQVRJT05TICgzMCkKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpkb3VibGUgZihkb3VibGUgeCl7CglyZXR1cm4gNSAqIHggKiBleHAoLXgpICogY29zKHgpICsgMTsKfQoKLy9Vc2VkIGZvciBOZXd0b24ncyBtZXRob2QsIGlmIHNvIGRlc2lyZWQuLi4gYnV0IHRoYXQgaXNuJ3QgdXNlZCBoZXJlLgpkb3VibGUgZGYoZG91YmxlIHgpewoJcmV0dXJuIC01ICogZXhwKC14KSp4KnNpbih4KSArIDUgKiBleHAoLXgpICogeCAqIHNpbih4KSAtIDUgKiBleHAoLXgpICogeCAqIGNvcyh4KTsKCn0KCmRvdWJsZSBiaXNlY3Rpb25fbWV0aG9kKGRvdWJsZSB4MCwgZG91YmxlIHgxKXsKCWZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgTlVNX0JJU0VDVElPTl9JVEVSQVRJT05TOyBpKyspewoJCWRvdWJsZSBtaWRwb2ludCA9IDAuNSp4MCArIDAuNSp4MTsKCQlmKHgwKSAqIGYobWlkcG9pbnQpIDwgMCA/IHgxID0gbWlkcG9pbnQgOiB4MCA9IG1pZHBvaW50OwoJfQoJcmV0dXJuIDAuNSp4MCArIDAuNSp4MTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KXsKCXZlY3RvcjxwYWlyPGRvdWJsZSwgZG91YmxlPj4gcmVsZXZhbnRfaW50ZXJ2YWxzOwoJZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBOVU1fSU5URVJWQUxTIC0gMTsgaSsrKXsKCQlkb3VibGUgeDAgPSBNSU5YICsgKE1BWFggLSBNSU5YKSAvIE5VTV9JTlRFUlZBTFMgKiAoaSk7CgkJZG91YmxlIHgxID0gTUlOWCArIChNQVhYIC0gTUlOWCkgLyBOVU1fSU5URVJWQUxTICogKGkgKyAxKTsKCQlpZiAoZih4MCkgKiBmKHgxKSA8IDApCgkJCXJlbGV2YW50X2ludGVydmFscy5wdXNoX2JhY2sobWFrZV9wYWlyKHgwLCB4MSkpOwoJfQoJY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMjApOwoJZm9yIChjb25zdCBhdXRvICYgeCA6IHJlbGV2YW50X2ludGVydmFscyl7CgkJY291dCA8PCAiT25lIHNvbHV0aW9uIGlzIGFwcHJveGltYXRlbHkgIiA8PCBiaXNlY3Rpb25fbWV0aG9kKHguZmlyc3QsIHguc2Vjb25kKSA8PCBlbmRsOwoJfQp9