/* Zadanie: Napisz probram znajdujacy miejsce zerowe dowolnej funkcji metoda bisekcji. Algorytm bisekcji rozwiazuje rownanie, czyli szuka miejsc zerowych funkcji jednej zmiennej wedlug nastepujacego schematu: 1. Podaj przedzial [a, b] wewnatrz ktorego przeprowadzane beda poszukiwania (przedzial dziedziny funkcji). 2. Sprawdz czy przypadkiem f(a) lub f(b) nie jest rowne 0, jesli tak to zakoncz program zwracajac rozwiazanie problemu. 3. Sprawdz czy f(a) ∗ f (b) < 0, w przeciwnym razie zakoncz program komunikatem o bledzie, bo nie mamy miejsca zerowego w danym przedziale. 4. Niech c = (b + a)/2 (nasz kandydat na miejsce zerowe funkcji). 5. Jesli f(c) = 0 zwroc c jako rozwiazanie. 6. Jesli b − a < eps zakoncz program zwracajac c jako odpowiedz; eps jest tutaj dokladnoscia z jaka szukamy miejsca zerowego. 7. W przeciwnym wypadku jesli f (c) ∗ f (b) < 0 przypisz zmiennej a wartosc zmiennej c i wroc do punktu (4), w przeciwnym razie przypisz zmiennej b wartosc zmiennej c i wroc do punktu (4). Po znalezieniu rozwiazania, wypisz je na ekran. */ #include #include #include using namespace std; // tutaj definiuje tzw. zmienne globalne, ktore beda widoczne w kazdym miejscu naszego kodu; dodatkowo do zdefiniowania dokladnosci algorytmu uzylam slowa kluczowego CONST - wartosc zmiennych zainicjalizowanych ze slowem kluczowym conts musi byc podana przed kompilacja programu, w ten sposob definiujemy wartosci stale, referencyjne, itp... const double EPS0 = 0.0000000001; // zmienna globalna widoczna w kazdym miejcu naszego kodu, tu trzyma dokladnosc porownania z zerem const double EPSX = 0.0000000001; // zmienna globalna widoczna w kazdym miejcu naszego kodu, tu trzyma dokladnosc wyznaczenia pierwiastka double funkcja(double x){ //funkcja, ktorej miejsce zerowe jest poszukiwane return x-4; } double bisekcja(double a, double b){ //algorytm bisekcji double fa, fb, f0, x0; fa = funkcja(a); fb = funkcja(b); if(fabs(fa) < EPS0){ x0 = a; } else if(fabs(fb) < EPS0) x0 = b; else{ while(fabs(a - b) > EPSX){ x0 = (a + b) / 2; f0 = funkcja(x0); if(fabs(f0) < EPS0) break; if(fa * f0 < 0) b = x0; else{ a = x0; fa = f0; } } } return x0; } int main(){ double a, b, x0; cout << "Podaj zakres poszukiwan pierwiastka:" << endl; cout << "a = "; cin >> a; cout << "b = "; cin >> b; if(funkcja(a) * funkcja(b) > 0) cout << "Miejsce zerowe funkcji poza przedzialem" << endl; else{ x0=bisekcja(a,b); cout << "\nx0 = " << setprecision(8) << fixed << x0 << endl; } cout << endl; return 0; }