kp.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define A -3
  5. #define B 3
  6. double Func(double x, int *count){
  7. (*count)+=1;
  8. return x*x*x*x*x - 5.2*x*x*x + 5.5*x*x - 7*x;
  9. }
  10. double trapezoidalIntegral(int n, double previousResult, double (*func)(double x, int *count), int *count) {
  11. double result = 0.0;
  12. double h;
  13. int i;
  14. h = (B - A) / (double)n;
  15. if (n == 1){
  16. result = (func(A, count) + func(B, count)) * h / 2;
  17. for (i = 1; i < n; i++) {
  18. result += func(A + i * h, count) * h;
  19. }
  20. }else{
  21. result = previousResult/2.0;
  22. for (i = 1; i < n; i += 2) {
  23. result += func(A + i * h, count) *h;
  24. }
  25. }
  26. return result;
  27. }
  28. double Integral1(double eps, int *n, double (*func)(double x, int *count), int *count){
  29. (*n) = 1;
  30. double next= trapezoidalIntegral(*n, 0, func, count);
  31. double prev;
  32. do{
  33. (*n) = (*n)*2;
  34. prev = next;
  35. next = trapezoidalIntegral(*n, prev, func, count);
  36. } while (fabs(next - prev)/3 >= eps);
  37. return next;
  38. }
  39. double rado_2(double a, double b, double (*func)(double x, int *count), double fb, int *count){
  40. double x1 = (2*a+b)/3;
  41. return 3*(b-a)*func(x1, count)/4+(b-a)*fb/4;
  42. }
  43. double rado_3(double a, double b, double (*func)(double x, int *count), double fb, int *count){
  44. double x1 = ((6+sqrt(6))*a + (4-sqrt(6))*b)/10;
  45. double x2 = ((6-sqrt(6))*a + (4+sqrt(6))*b)/10;
  46. double A1 = (16-sqrt(6));
  47. double A2 = (16+sqrt(6));
  48. double A3 = 4;
  49. return (b-a)*(A1*func(x1, count) + A2*func(x2, count) + A3*fb)/36;
  50. }
  51. double Integral2(double eps, double a, double b, int *n, double (*func)(double x, int *count), int *count){
  52. int i;
  53. double left, right, step, fright;
  54. double R2, R3;
  55. (*n) = 1;
  56. fright = func(b, count);
  57. R2 = rado_2(a,b,func,fright, count);
  58. R3 = rado_3(a,b,func,fright, count);
  59. while (fabs(R2 - R3) >= eps){
  60. R2 = 0.0;
  61. R3 = 0.0;
  62. (*n) = (*n)*2;
  63. step = (b-a)/(*n);
  64. right = a;
  65. for (i=0;i<(*n);i++){
  66. left = right;
  67. right = left + step;
  68. fright = func(right, count);
  69. R2 += rado_2(left, right, func, fright, count);
  70. R3 += rado_3(left, right, func, fright, count);
  71. }
  72. }
  73. return R3;
  74. }
  75. int main(){
  76. FILE *f = fopen("data.txt", "w");
  77. if (f == NULL) {
  78. printf("Error opening file!\n");
  79. return 1;
  80. }
  81. int i, k, n, h;
  82. double Iexact = 99.0;
  83. double eps = 0.1;
  84. double result;
  85. for(i = 0; i<9; i++){
  86. k = 0;
  87. result = Integral1(eps, &n, Func, &k);
  88. fprintf(f, "%.15f %d\n", fabs(Iexact-result), k);
  89. eps = eps/10;
  90. }
  91. fprintf(f, "--------------------\n");
  92. eps = 0.1;
  93. for(i = 0; i<9; i++){
  94. h = 0;
  95. result = Integral2(eps, A, B, &n, Func, &h);
  96. fprintf(f, "%.15f %d\n", fabs(Iexact - result), h);
  97. eps = eps*0.1;
  98. }
  99. fclose(f);
  100. return 0;
  101. }