Guest User

Untitled

a guest
Nov 25th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. #include "UtilitiesP.h"
  2. #include "Simpson.h"
  3.  
  4. int main(void)
  5. {
  6. double agm(1/functionsP::agm(1, 2));
  7. double integral( (2/constantsP::kPi) * Simpson(0, constantsP::kPi*0.5, constantsP::kEps, functionsP::eliptic));
  8. assert(fabs(agm-integral)<constantsP::kEps);
  9.  
  10. double firstVal(constantsP::kPi*0.5);
  11. integral = Simpson(constantsP::kAlmostZero, 10000, constantsP::kEps, functionsP::Dirichlet);
  12.  
  13. std::cout << firstVal << std::endl;
  14. std::cout << integral << std::endl;
  15.  
  16. double secondVal(sqrt(constantsP::kPi)*0.5);
  17. integral = Simpson(constantsP::kAlmostZero, 12, constantsP::kEps, functionsP::Puasson);
  18.  
  19. std::cout << secondVal << std::endl;
  20. std::cout << integral << std::endl;
  21.  
  22. double thirdVal(constantsP::kPi/sin(constantsP::kNumberFromEuler*constantsP::kPi));
  23. integral = Simpson(constantsP::kAlmostZero, 13, constantsP::kEps, functionsP::Euler);
  24.  
  25. std::cout << thirdVal << std::endl;
  26. std::cout << integral << std::endl;
  27.  
  28.  
  29. return 0;
  30. }
  31.  
  32. #include <stdexcept>
  33. #include <iostream>
  34.  
  35. //#define NDEBUG
  36. #include <cassert>
  37.  
  38. namespace constantsP
  39. {
  40. const double kPi(3.1415926535897932);
  41. const double kEps(1.e-12);
  42. const double kAlmostZero(1.e-7);
  43. const double kBigNumber(30);
  44. const double kNumberFromEuler(0.4);
  45. };
  46.  
  47. namespace functionsP
  48. {
  49. double agm(const double&, const double&);
  50. double eliptic(const double&);
  51. double Dirichlet(const double&);
  52. double Puasson(const double&);
  53. double Euler(const double&);
  54. };
  55.  
  56. #include "UtilitiesP.h"
  57.  
  58. double functionsP::agm(const double& a, const double& b)
  59. {
  60. if(a <= 0 || b <= 0)
  61. {throw std::invalid_argument("Arithmetic-geometric mean is defined only for 0 < a < b.");}
  62.  
  63. double aPrev(a), bPrev(b), aCurrent(a), bCurrent(b);
  64. do
  65. {
  66. aPrev = aCurrent;
  67. bPrev = bCurrent;
  68. aCurrent = sqrt(aPrev*bPrev);
  69. bCurrent = (aPrev+bPrev)*0.5;
  70. }while((aPrev < aCurrent) && (bCurrent < bPrev) && (aPrev < bPrev));
  71.  
  72. double res((aPrev <= aCurrent)?aPrev:bPrev);
  73.  
  74. return res;
  75. }
  76.  
  77. double functionsP::eliptic(const double& x)
  78. {
  79. return 1/sqrt(pow(1*sin(x), 2) + pow(2*cos(x), 2));
  80. }
  81.  
  82. double functionsP::Dirichlet(const double& x)
  83. {
  84. return sin(2*x)/x;
  85. }
  86.  
  87. double functionsP::Puasson(const double& x)
  88. {
  89. return exp(-(x*x));
  90. }
  91.  
  92. double functionsP::Euler(const double& x)
  93. {
  94. return pow(x, constantsP::kNumberFromEuler-1)/(1+x);
  95. }
  96.  
  97. #include <cmath>
  98.  
  99. double Simpson (const double& a, const double& b, const double& eps, double(*const f)(const double&));
  100.  
  101. #include "Simpson.h"
  102.  
  103. double Simpson (const double& a, const double& b, const double& eps, double(*const f)(const double&))
  104. {
  105. double step((b-a)*0.5);
  106. double s1(step*(f(a)+f(b))), s2(0), s4(4*step*f(a+step));
  107. double previousSum(0), currentSum(s1+s4);
  108. int n(2);
  109. do
  110. {
  111. previousSum = currentSum;
  112. n += n;
  113. step *= 0.5;
  114.  
  115. s1 *= 0.5;
  116. s2 = 0.5*s2+0.25*s4;
  117.  
  118. s4 = 0;
  119. for(int i(1); i < n; i+=2)
  120. {s4 += f(a+i*step);}
  121. s4 = 4*step*s4;
  122.  
  123. currentSum = s1+s2+s4;
  124. }
  125. while(eps<fabs(previousSum-currentSum));
  126.  
  127. return currentSum/3;
  128. }
Add Comment
Please, Sign In to add comment