[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