daily pastebin goal
71%
SHARE
TWEET

Untitled

a guest Mar 23rd, 2019 61 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top