/* Title: Example of trapezoidal numerical integration method */ #include #include const double zero = 0.0, two = 2.0; double f(double); int numf; main() { FILE *fp; double a, b, x, trueint, sum, sumend, h; double trap, paster, error, ratio; int j, k, n; if ((fp = fopen("trapezoidal.output", "w")) == NULL) { printf("\n\n Cannot open file trapezoidal.output\n"); return(1); } while (1) { printf("\n\n Give number of integrand : "); scanf("%d", &numf); if (numf == 0) { fclose(fp); return(0); } printf("\n Give integration limits a and b : "); scanf("%lf %lf", &a, &b); printf("\n Give true answer, if known"); printf("\n if unknown, give zero : "); scanf("%lf", &trueint); fprintf(fp, "\n\n Number of integrand = %d", numf); fprintf(fp, "\n Integration limits = %e %e", a, b); fprintf(fp, "\n True = %e", trueint); sumend = (f(a) + f(b))/two; sum = zero; for (j=1; j <= 9; j++) { n = pow(2.0, (double)j); h = (b-a)/n; for (k=1; k <= n-1; k += 2) { x = a + k*h; sum = sum + f(x); } trap = h*(sumend + sum); error = trueint - trap; if (j == 1) { paster = error; fprintf(fp, "\n n = %3d trap = %17.10e", n, trap); fprintf(fp, " error = %9.2e", error); } else { ratio = paster/error; paster = error; fprintf(fp, "\n n = %3d trap = %17.10e", n, trap); fprintf(fp, " Error = %9.2e Ratio = %9.2e", error, ratio); } printf("\n n = %d \t Error = %e", n, error); } } } double f(double x) { double pi = 3.14159265358979; double result; switch (numf) { case 1: result = exp(-x*x); break; case 2: result = 1.0/(1.0 + x*x); break; case 3: result = 1.0/(2.0 + cos(x)); break; case 4: result = exp(x)*cos(4.0*x); break; case 5: result = x*x*sqrt(x); break; case 6: result = exp(cos(x)); break; case 7: result = 1.0/(1.0 + pow((x-pi), 2.0)); break; case 8: result = sqrt(x); break; } return(result); }