fork(1) download
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. // Funkcja kwadratowa
  7. double f(double x, double a, double b, double c)
  8. {
  9. return a * x * x + b * x + c;
  10. }
  11.  
  12. // Metoda bisekcji
  13. double bisekcja(double left, double right, double a, double b, double c,
  14. double epsilon, int max_iter)
  15. {
  16. double mid;
  17.  
  18. if (f(left, a, b, c) * f(right, a, b, c) >= 0)
  19. {
  20. cout << "Funkcja nie zmienia znaku w przedziale." << endl;
  21. return NAN;
  22. }
  23.  
  24. for (int i = 0; i < max_iter; i++)
  25. {
  26. mid = (left + right) / 2.0;
  27.  
  28. if (fabs(f(mid, a, b, c)) < epsilon)
  29. return mid;
  30.  
  31. if (f(left, a, b, c) * f(mid, a, b, c) < 0)
  32. right = mid;
  33. else
  34. left = mid;
  35. }
  36.  
  37. return (left + right) / 2.0;
  38. }
  39.  
  40. int main()
  41. {
  42. double a, b, c;
  43. double left, right;
  44. double epsilon;
  45. int max_iter;
  46.  
  47. cout << "Podaj wspolczynnik a: ";
  48. cin >> a;
  49. cout << "Podaj wspolczynnik b: ";
  50. cin >> b;
  51. cout << "Podaj wspolczynnik c: ";
  52. cin >> c;
  53.  
  54. cout << "Podaj lewy koniec przedzialu: ";
  55. cin >> left;
  56. cout << "Podaj prawy koniec przedzialu: ";
  57. cin >> right;
  58.  
  59. cout << "Podaj dokladnosc epsilon: ";
  60. cin >> epsilon;
  61. cout << "Podaj maksymalna liczbe iteracji: ";
  62. cin >> max_iter;
  63.  
  64. double wynik = bisekcja(left, right, a, b, c, epsilon, max_iter);
  65.  
  66. if (!isnan(wynik))
  67. cout << "Przyblizone miejsce zerowe: " << wynik << endl;
  68.  
  69. return 0;
  70. }
  71.  
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Podaj wspolczynnik a: Podaj wspolczynnik b: Podaj wspolczynnik c: Podaj lewy koniec przedzialu: Podaj prawy koniec przedzialu: Podaj dokladnosc epsilon: Podaj maksymalna liczbe iteracji: Funkcja nie zmienia znaku w przedziale.