Hamilton LaboratoriesHamilton C shell 2012User guideSamples


Oregon Coast

Previous | Next

#  Trapeziodal rule numeric integration of function f() from a to b,
#  using n intervals

#  Copyright (c) 1995-2012 by Hamilton Laboratories.  All rights reserved.

#  Sample usage:
#  Integrate the sin() function from 0 to 1, using 500 intervals

#     trapz sin 0 1 500

#  Compare this result with the "exact" integration:

#     calc cos(0) - cos(1)

#  The area in each interval is (f(x) + f(x + dx))*dx/2.  Summing
#  the areas of all the intervals gives the total area, but a
#  simple optimization is to move the multiplication by dx out of
#  the loop and to observe that the divide by 2 is unnecessary
#  except for the values of f() at the endpoints a and b since,
#  everywhere else, the end of one interval is the beginning of
#  the next.

#  Note the use of eval lets me paste in the name of the function
#  for the call, then cause the C shell to compile and run the
#  resulting string.  The circumflex characters at the end of each
#  line are there just to let me break the string across multiple
#  lines for readability.

proc trapz( f, a, b, n)
   local i, area, dx
   @ dx = (b - a)/n
   eval  "@ area = ($f (a) + $f (b))/2 ^
         for i = 1 to n - 1 do         ^
            @ area += $f (a + i*dx)    ^
   @ area *= dx
   return area

trapz $argv

Previous | Next