[Tutor] Advise...

TJ tgrimes at teleport.com
Wed Jan 26 09:15:29 CET 2005


>What is the function? 3*x*x
>What is the minimum? 2
>What is the maximum? 5
>117.000435
>
>Which, considering that it is supposed to be exactly 117, It's darn 
>good. Unfortunately, it also takes about
>10 seconds to do all that.
>Any suggestions? Any advice? TIA
>Jacob Schmidt
>

Jacob,

You can get better accuracy with orders of magnitude fewer steps by 
evaluating the function at the midpoint of each step rather than the 
low value.  This has the added benefit of yielding the same result 
when stepping x up (2 to 5) or down (5 to 2).

Here's some modified code (I don't have psyco):

########################
from __future__ import division
import time
        
def reimannSum(func_x, min_x, max_x, steps):
     start = time.time()
     totalArea = 0
     #precalculate step size
     delta_x = 1 / steps
     #set x to midpoint of first step
     x = min_x + delta_x / 2
     while min_x <= x <= max_x:
         totalArea += eval(func_x) * delta_x
         x += delta_x
     return totalArea, steps, time.time() - start

stepsList = [100000, 10000, 1000, 500, 200, 100]
fmt = 'Area: %f  Steps: %d   Time: %f'

for steps in stepsList:
     print fmt % reimannSum('3 * x * x', 2, 5, steps)
########################


The results on my machine are:

Area: 117.000000  Steps: 100000   Time: 44.727405
Area: 117.000000  Steps: 10000   Time: 4.472391
Area: 116.999999  Steps: 1000   Time: 0.454841
Area: 116.999997  Steps: 500   Time: 0.223208
Area: 116.999981  Steps: 200   Time: 0.089651
Area: 116.999925  Steps: 100   Time: 0.044431

TJ



More information about the Tutor mailing list