Ninth Week Examples  --- Quadrature:
   Riemann Sums: Left Endpoint Rule; Midpoint Rule.
  Trapezoid Rule. Simpson's Rule.
Following D. Milicic  
Tenth Week Examples.
 Numerical Integration 
Riemann Sums: Left endpoint, Right endpoint and Midpoint Rules. 
/* Milicic   
Riemann sum--Left endpoint Rule
riemann1.c                           */
#include <stdio.h>
double f( double x) {
  return(x*x) ;
}
int main() {
  double a, b, delta, integral;
  int i,n;
  a = 0;
  b = 1;
  n = 100000;
  delta = (b-a)/n;
  integral = 0.0;
  for (i=0; i < n; i=i+1)
    integral = integral + f(a + i*delta)*delta;
  printf("The integral of f from %f to %f is equal to %f\n",a,b,integral);
}   
/* Milicic  
Riemann sum--Right endpoint rule
 riemann2.c                             */
#include <stdio.h>
double f( double x) {
  return(x*x) ;
}
int main() {
  double a, b, delta, integral;
  int i,n;
  a = 0;
  b = 1;
  n = 100000;
  delta = (b-a)/n;
  integral = 0.0;
  for (i=0; i < n; i=i+1)
    integral = integral + f(a + (i+1)*delta)*delta;
  printf("The integral of f from %f to %f is equal to %f\n",a,b,integral);
}
Midpoint Rule
/*****************************************************************************
Treibergs                                                        Feb. 27, 2006 
Midpoint Rule. Input endpoints a, b. Add up the areas of the strips with
heights taken at the midpoints of the intervals.
midpoint.c
*****************************************************************************/
      
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
double
f ( double x );
int 
main ( void ) 
{
    double a, am2, b, c, h, s;
    int i=1, n;
    
    printf ( "Midpoint Rule\n\n" );
    printf ( " Enter the left and right endpoints : " );
    scanf ( "%lf %lf", &a, &b );
    
    if( a > b)                         /*  swap a  and  b  if a > b   */
    {
       c=a;
       a=b;
       b=c;
    }
  
    printf("\n Number of intervals    Midpoint Approximation of Integral\n");
    
    for ( n=1;  n <= 20; n++)
    {
       h = (b - a) / n;
       am2 = a + h/2.0;
       s=0.0;
       
       for( i = 0; i < n; i++ )
                s = s + f ( am2 + i*h );
                
       printf (" %14d\t\t %21.15f\n", i,  s*h);
     }
     printf ( "\t    Actual int =%22.15f\n", 4.0*( atan(b) - atan(a) ) );
    
     return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
double
f ( double x )
{
   return 4.0/(1.0 + x*x) ;
}
 Trapezoid Rule 
/*****************************************************************************
Treibergs                                                        Feb. 27, 2006 
Trapezoid Rule. Input endpoints a, b. Integrate given function using trapezoid 
rule with  n  intervals.
trapezoid1.c
*****************************************************************************/
      
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
double
f ( double x );
int 
main ( void ) 
{
    double a, am2, b, c, h, h2, s;
    int i=1, n;
    
    printf ( "Trapezoid Rule\n\n" );
    printf ( " Enter the left and right endpoints : " );
    scanf ( "%lf %lf", &a, &b );
    
    if( a > b)                         /*  swap a  and  b  if a > b   */
    {
       c=a;
       a=b;
       b=c;
    }
  
    printf("\n Number of intervals    Trapezoid Approximation of Integral\n");
    
    for ( n=1;  n <= 20; n++)
    {
       h = (b - a) / n;
       h2 = h / 2.0;
       s=0.0;
       
       for( i = 1; i < n; i++ )
                s = s + f ( a + i*h );
                
       printf (" %14d\t\t %21.15f\n", i, (f(a)+f(b))*h2+ s*h);
     }
     printf ( "\t    Actual int =%22.15f\n", 4.0*( atan(b) - atan(a) ) );
    
     return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
double
f ( double x )
{
   return 4.0/(1.0 + x*x) ;
}
/*Milicic    
trapezoid Rule
 trapezoid.c          */
#include <stdio.h>
double f( double x) {
  return(x*x) ;
}
int main() {
  double a, b, delta, integral;
  int i,n;
  a = 0;
  b = 1;
  n = 100000;
  delta = (b-a)/n;
  integral = 0.0;
  for (i=0; i < n; i=i+1)
    integral = integral + (f(a + i*delta)+f(a+(i+1)*delta))/2*delta;
  printf("The integral of f from %f to %f is equal to %f\n",a,b,integral);
}   
 Simpson's Rule 
/*****************************************************************************
Treibergs                                                         Mar. 1, 2006 
Simpson's Rule. 
Input endpoints a, b. Integrate given function using Simpson's rule. Double 
the number of intervals each step. Note that at each step, we only need
to evaluate the function at the points midway between the points from the 
previous step. But this is nothing more than the midpoint rule. Then we use 
the fact that Simpson's rule for 2n intervals is (trapezoid + 2 midpoint)/3.
simpson.c
*****************************************************************************/
      
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
double
f ( double x );
int 
main ( void ) 
{
    double a, ap2, b, c, h, s, t;
    int i = 1,  m, n = 1;
    
    printf ( "Trapezoid / Midpoint / Simpson's Rules\n\n" );
    printf ( " Enter the left and right endpoints : " );
    scanf ( "%lf %lf", &a, &b );
    
    if( a > b)                         /*  swap a  and  b  if a > b   */
    {
       c = a;
       a = b;
       b = c;
    }
  
    printf("\n       n      Trapezoid Approx.      Midpoint Approx.       Simpson's Rule\n");
    
    h = b - a;
    t = ( f ( a )  +  f ( b ) ) / 2.0;
    for ( m = 1;  m <= 17; m++ )
    {
       ap2 = a  +  h / 2.0 ;
       s = 0.0;
       
       for( i = 0; i < n; i++ )
                s = s  +  f ( ap2  +  i * h );
                
       printf (" %9d %22.15f %22.15f %22.15f\n", n, t * h, s * h, (t  +  2.0 * s) * h / 3.0 );
       t = t + s;
       h = h / 2.0;
       n = 2 * n;
     }
     printf ( "\t\t\t\t\t      Actual int =%21.15f\n", 4.0 * ( atan(b) - atan(a) ) );
    
     return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
double
f( double x )
{
    return 4.0 / ( 1.0  +  x * x );
}
/*  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =
     Try the quadratic function like this instead! Simpson's rule is accurate on 
     quadratics by the way its defined. Be sure to replace the last printf by
     printf ( "\t\t\t\t\t      Actual int =%21.15f\n", ( b * b * b  -  a * a * a ) / 3.0 );
double
f( double x )
{
return x*x;
}                   
                                                                                           */
/* Milicic
Simpson's method
simpson.c                */
#include <stdio.h>
double f(double x) {
  return(x*x) ;
}
int main() {
  double a, b, delta, integral;
  int i,n;
  a = 0;
  b = 1;
  n = 100000;
  delta = (b-a)/n;
  integral = 0.0;
  for (i=0; i < n; i=i+1)
    integral = integral + (f(a+i*delta)+4*f(a+(i+0.5)*delta)+f(a+(i+1)*delta))/6*delta;
  printf("The integral of f from %lf to %lf is equal to %lf\n",a,b,integral);
}   
/*  Treibergs                  Mar. 6, 2006
Left-Right-Trapezoid Rules  
These give lower, upper and trapezoid sum for increasing function.
We loop through the number of intervals for each sum. Then compute
the sum for that number of intervals. Note that the subtotal over the
middle  m - 1  intervals occurs in each of the three sums.
today.c                                   */
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
double
f( double x );
int
main(void)
{
    double s, a, b, d;
    int  i, m, n = 20;
    printf ( " Enter left and right endpoint : " );
    scanf ( "%lf%lf", &a, &b );
    printf ( " n \t\tLeft\t\t Right\t\t      Trapezoid\n" );
    for( m = 2; m < = n; m++ )
    {
        s = 0.0;
        d = ( b  -  a ) / m;
        for ( i = 1; i < m;  i++ )
            s = s + f ( a  +  i * d );
        printf ( "%4d%21.15f%21.15f%21.15f\n", m, ( f ( a )  +  s ) * d, ( f ( b )  +  s ) * d, 
                                                   ( 0.5 * ( f ( a )  +  f ( b ) )  +  s ) * d  );
    }
    printf ( "  Actual integral = %47.15f\n", ( b * b * b  -  a * a * a ) / 3.0 );
    return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
double
f( double x )
{
    return  sqrt( .96 + x*x*x);
}
/*****************************************************************************
Treibergs                                                         Mar. 8, 2006 
Trapezoid and Midpoint Rule. 
Input endpoints a, b. Integrate given function using trapezoid and midpoint 
rules. Double the number of intervals each step. Note that at each step, we 
only need to evaluate the function at the points midway between the points 
from the previous step. 
today1.c
*****************************************************************************/
      
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
double
f ( double x );
int 
main ( void ) 
{
    double a, ahalf, b, c, e1, e2, h, s, t;
    int i=1,  m, n=1;
    
    printf ( " trapezRule\n\n" );
    printf ( " Enter the left and right endpoints : " );
    scanf ( "%lf %lf", &a, &b );
    
    printf("\n  n \t Trapezoid Rule\t  Midpoint Rule\t       Midpt. Error    Trap. Error\n");
    
    h = b  -  a;
    e1 = h * h * h / 3.0;
    e2 = 2.0 * e1;
    t = ( f ( a )  + f ( b ) ) / 2.0;
    for ( m = 1;  m <= 15; m++ )
    {
       ahalf = a  +  h / 2.0 ;
       s = 0.0;
       
       for( i = 0; i < n; i++ )
                s = s + f ( ahalf  +  i * h );
                
       printf ( "%5d%19.15f%19.15f  %14.6e  %14.6e\n", n, t*h, s*h, e1/n/n, e2/n/n);
       t = t  +  s;
       h = h / 2.0;
       n = 2 * n;
     }
     printf ( "\t  Actual int =%21.15f\n", 4.0 * ( atan(b) - atan(a) ) );
    
     return EXIT_SUCCESS;
}
double
f ( double x )
{
    return 4.0 / ( 1.0  +  x * x );
}
/*****************************************************************************
Treibergs                                                         Mar. 8, 2006 
Simpson's Rule. 
Input endpoints a, b. Integrate given function using Simpson's rule. Double 
the number of intervals each step. Note that at each step, we only need
evaluate the function at the points midway between the points from the 
previous step. Use the fact that Simpson's rule is (trap + 2 midpt)/3
For Simpson's rule with  n  intervals, the error is  
E = (b-a)^5 M / ( 2880 n^4 ) 
where  M  = sup{ |f''''(c)| : c real }.  In case  f = 4/(1+x^2) then  M  = 96.
(Careful: in the calculus text "n" is something else: it is the number of
half intervals, which is our  2n.)
Recall that error estimates error of method and does not include round-off.
today.c
*****************************************************************************/
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
double
f ( double x );
      
main ( void ) 
{
    double a, ahalf, b, e, h, s, t;
    i = 1, m, n = 1;
    printf ( " Rule\n\n" );
    printf ( " Enter the left and right endpoints : " );
    scanf ( "%lf %lf", &a, &b );
    printf ( "\n\tn \t  Simpson's Rule\t  Theoretical Error in Simpson's Rule\n" );
    h = b  -  a;
    e = h * h * h * h * h / 30.0;
    t = ( f ( a )  +  f ( b ) ) / 2.0;
    for ( m = 1;  m <= 15; m++ )
    {
            ahalf = a  +  h / 2.0 ;
            s = 0.0;
            for( i = 0; i < n; i++ )
                          s = s + f ( ahalf  +  i * h );
            printf ("%11d %24.15f %28.15e\n", n, (t + 2*s) * h / 3, e / ( (double)n * n * n * n ) );
            t = t  +  s;
            h = h / 2.0;
            n = 2 * n;
     }
     printf ( "Actual int =%24.15f\n", 4.0 * ( atan ( b ) - atan ( a ) ) );
     return EXIT_SUCCESS;
}
/* * * * * * * * * * * * * * * * * * * * * * */
                   
f( double x )    
{  
    return 4.0 / ( 1.0  +  x * x );
 }