Advertisement
Guest User

Untitled

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