Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. //Daniel Dobrowolski
  2. #include <cmath>
  3.  
  4.  
  5. bool sgn(double var)
  6. {
  7. return var >= 0.0f;
  8. }
  9.  
  10. void bisection(double(*f)(double), double &a, double &b, double &aVar, double &bVar)
  11. {
  12. double c = (a + b) / 2;
  13. double var = f(c);
  14.  
  15. if (sgn(aVar) == sgn(var))
  16. {
  17. a = c;
  18. aVar = var;
  19. }
  20. else if (sgn(bVar) == sgn(var))
  21. {
  22. b = c;
  23. bVar = var;
  24. }
  25. }
  26.  
  27. double sieczne(double a, double b, double aVar, double bVar)
  28. {
  29. return (bVar*a - aVar * b) / (bVar - aVar);
  30. }
  31.  
  32.  
  33.  
  34. bool checkVar(double var, double eps)
  35. {
  36. if (std::abs(var) <= eps)
  37. return true;
  38.  
  39. return false;
  40. }
  41.  
  42. double wyznaczMiejsceZerowe(
  43. double(*f)(double), // funkcja której zera szukamy w [a, b]
  44. double a, // lewy koniec przedziału
  45. double b, // prawy koniec przedziału
  46. int M, // maksymalna dozwolona liczba wywołań funkcji f
  47. double eps, // spodziewana dokładność zera
  48. double delta // wystarczający błąd bezwzględny wyniku
  49. )
  50. {
  51. double static startSieeczne = (1.0f / 64.0f);
  52.  
  53. double varA = f(a);
  54. if (checkVar(varA, eps))
  55. return a;
  56.  
  57. double varB = f(b);
  58. if (checkVar(varB, eps))
  59. return b;
  60.  
  61.  
  62. do {
  63.  
  64. if (sgn(varA) == sgn(varB))
  65. {
  66. double c = sieczne(a, b, varA, varB);
  67. varA = varB;
  68. a = b;
  69. varB = f(c);
  70. b = c;
  71. }
  72. else
  73. {
  74. if (std::abs(a - b) <= startSieeczne)
  75. {
  76. double c = sieczne(a, b, varA, varB);
  77. varA = varB;
  78. a = b;
  79. varB = f(c);
  80. b = c;
  81. }
  82. else
  83. {
  84. bisection(f, a, b, varA, varB);
  85. }
  86. }
  87.  
  88. } while (std::abs(a - b) > delta && !checkVar(varB, eps));
  89.  
  90. return b;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement