lab10.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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){
  7. return x*x*x*x*x - 5.2*x*x*x + 5.5*x*x - 7*x;
  8. }
  9. double ModifiedFunc(double x){
  10. return x*x*x*x*x - 5.2 * fabs(x*x*x) + 5.5*x*x - 7*x;
  11. }
  12. double trapezoidalIntegral(int n, double previousResult, double (*func)(double x)) {
  13. double result = 0.0;
  14. double h;
  15. int i;
  16. h = (B - A) / (double)n; //Разобьем отрезок [a, b] на N интервалов длиной h
  17. if (n == 1){
  18. result = (func(A) + func(B)) * h / 2;
  19. for (i = 1; i < n; i++) {
  20. result += func(A + i * h) * h;
  21. }
  22. }else{
  23. result = previousResult/2.0; //Использовать результат n/2
  24. for (i = 1; i < n; i += 2) {
  25. result += func(A + i * h) *h;
  26. }
  27. }
  28. return result;
  29. }
  30. double Integral(double eps, int *k, int *n, double (*func)(double x)){
  31. (*n) = 1;
  32. double next= trapezoidalIntegral(*n, 0, func);
  33. double prev;
  34. (*k) = 0;
  35. do{
  36. (*n) = (*n)*2;
  37. prev = next;
  38. next = trapezoidalIntegral(*n, prev, func);
  39. (*k) = (*k)+1;
  40. } while (fabs(next - prev)/3 >= eps);
  41. return next;
  42. }
  43. int main(){
  44. FILE *f = fopen("data.txt", "w");
  45. if (f == NULL) {
  46. printf("Error opening file!\n");
  47. return 1;
  48. }
  49. int i, k, n;
  50. double Iexact = 99.0;
  51. double eps = 0.1;
  52. double result;
  53. for(i = 0; i<9; i++){
  54. result = Integral(eps, &k, &n, Func);
  55. fprintf(f, "%.15f %d %.15f \n", fabs(Iexact-result), k, log2((double)(B-A)/n));
  56. eps = eps/10;
  57. }
  58. fclose(f);
  59. return 0;
  60. }