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 );
}