12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #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;
- }
-
-
|