# 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) ^ end" @ area *= dx return area end trapz $argv |