fork download
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. // Funkcja f(x), której miejsce zerowe szukamy
  5. double f(double x) {
  6. return pow(x, 3) - 3 * pow(x, 2) + 2 * x - 6;
  7. }
  8.  
  9. // Funkcja implementująca metodę połowienia
  10. void bisection(double a, double b, double epsilon) {
  11. if (f(a) * f(b) >= 0) {
  12. std::cout << "Błędne przedziały. f(a) i f(b) muszą mieć różne znaki." << std::endl;
  13. return;
  14. }
  15.  
  16. double c = a; // Punkt środkowy
  17. while ((b - a) >= epsilon) {
  18. // Znajdź punkt środkowy
  19. c = (a + b) / 2;
  20.  
  21. // Jeśli wartość w c jest bliska zeru, przerywamy
  22. if (fabs(f(c)) < epsilon) {
  23. break;
  24. }
  25.  
  26. // Sprawdź, po której stronie przedziału leży miejsce zerowe
  27. if (f(c) * f(a) < 0) {
  28. b = c;
  29. } else {
  30. a = c;
  31. }
  32. }
  33.  
  34. std::cout << "Miejsce zerowe funkcji: x = " << c << std::endl;
  35. }
  36.  
  37. int main() {
  38. // Przedziały początkowe i dokładność
  39. double a = 1.0; // Początek przedziału
  40. double b = 2.0; // Koniec przedziału
  41. double epsilon = 0.0001; // Dokładność
  42.  
  43. std::cout << "Funkcja: f(x) = x^3 - 3x^2 + 2x - 6" << std::endl;
  44. std::cout << "Przedział: [" << a << ", " << b << "]" << std::endl;
  45. std::cout << "Dokładność: " << epsilon << std::endl;
  46.  
  47. bisection(a, b, epsilon);
  48.  
  49. return 0;
  50. }
  51.  
Success #stdin #stdout 0.01s 5264KB
stdin
 
stdout
Funkcja: f(x) = x^3 - 3x^2 + 2x - 6
Przedział: [1, 2]
Dokładność: 0.0001
Błędne przedziały. f(a) i f(b) muszą mieć różne znaki.