There has been alot of talk on this list about using list comprehensions lately, and this could be one of those useful places. While I don't have time to experiment with real code, I would suggest changing your function to look like:

steps = [ min_x + i*delta_x for i in range(steps) ]
totalarea = sum([ eval(func_x)*delta_x for x in steps ])

Since list comprehensions are significantly faster than while loops, this could be a big speed boost.

There may be a mistake or two in the above code, but hopefully the idea will be helpful.

Bill

TJ wrote:

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

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to