#include #include #include #define A -3 #define B 3 double Func(double x){ return x*x*x*x*x - 5.2*x*x*x + 5.5*x*x - 7*x; } double ModifiedFunc(double x){ return x*x*x*x*x - 5.2 * fabs(x*x*x) + 5.5*x*x - 7*x; } double trapezoidalIntegral(int n, double previousResult, double (*func)(double x)) { double result = 0.0; double h; int i; h = (B - A) / (double)n; //Разобьем отрезок [a, b] на N интервалов длиной h if (n == 1){ result = (func(A) + func(B)) * h / 2; for (i = 1; i < n; i++) { result += func(A + i * h) * h; } }else{ result = previousResult/2.0; //Использовать результат n/2 for (i = 1; i < n; i += 2) { result += func(A + i * h) *h; } } return result; } double Integral(double eps, int *k, int *n, double (*func)(double x)){ (*n) = 1; double next= trapezoidalIntegral(*n, 0, func); double prev; (*k) = 0; do{ (*n) = (*n)*2; prev = next; next = trapezoidalIntegral(*n, prev, func); (*k) = (*k)+1; } while (fabs(next - prev)/3 >= eps); return next; } int main(){ FILE *f = fopen("data.txt", "w"); if (f == NULL) { printf("Error opening file!\n"); return 1; } int i, k, n; double Iexact = 99.0; double eps = 0.1; double result; for(i = 0; i<9; i++){ result = Integral(eps, &k, &n, Func); fprintf(f, "%.15f %d %.15f \n", fabs(Iexact-result), k, log2((double)(B-A)/n)); eps = eps/10; } fclose(f); return 0; }