integrate.py
· 1.7 KiB · Python
Bruto
#!/usr/bin/env python
import math, re
parser = re.compile('integrate (.*) from ([0-9]+\.?[0-9]*) to ([0-9]+\.?[0-9]*)( )?(step)? ([0-9]+\.?[0-9]*)?')
safeFuncs = {
'acos' : math.acos,
'asin' : math.asin,
'atan' : math.atan,
'atan2' : math.atan2,
'ceil' : math.ceil,
'cos' : math.cos,
'e' : math.e,
'exp' : math.exp,
'floor' : math.floor,
'log' : math.log,
'log10' : math.log10,
'pi' : math.pi,
'pow' : math.pow,
'sin' : math.sin,
'sqrt' : math.sqrt,
'tan' : math.tan
}
minimumStepSize = 0.0001
def runStringIntegral(f, a, b, step=0.1):
s = 0
i = a
sandbox = { t:safeFuncs[t] for t in safeFuncs.keys()}
if step == 0:
sandbox["x"] = a
return eval(f, {"__builtins__":None}, sandbox)
while i < b:
sandbox["x"] = i
s = s + eval(f, {"__builtins__":None}, sandbox)
i += step
s /= (1.0 / step)
return s
def parseAndRunInteg(message):
data = parser.match(message)
if not data == None:
formula, a, b, _, _, step = data.groups()
if step == None:
step = 0.1
if float(step) < minimumStepSize:
print "Sorry, I dont do integrations with stepsize < %s" % minimumStepSize
return None
#print "Calculating %s from %s to %s with step %s" %(formula, a, b, step)
print "The result of %s is: %s" %(message, runStringIntegral(formula, float(a), float(b), float(step)))
else:
print "Sorry I did not understand"
'''
Tests
'''
#parseAndRunInteg("integrate sin(x) from 0 to 3.14 step 0.1") # Should be near 2
#parseAndRunInteg("integrate sin(x) * pi from 0 to 3.14 step 0.1") # Should be near 6.28
#parseAndRunInteg("integrate x ** 2 from 0 to 10 step 0.001") # Should be near 333
#parseAndRunInteg("integrate x ** 2 from 1 to 4 step 0.000001") # Should print error
| 1 | #!/usr/bin/env python |
| 2 | import math, re |
| 3 | |
| 4 | parser = re.compile('integrate (.*) from ([0-9]+\.?[0-9]*) to ([0-9]+\.?[0-9]*)( )?(step)? ([0-9]+\.?[0-9]*)?') |
| 5 | |
| 6 | safeFuncs = { |
| 7 | 'acos' : math.acos, |
| 8 | 'asin' : math.asin, |
| 9 | 'atan' : math.atan, |
| 10 | 'atan2' : math.atan2, |
| 11 | 'ceil' : math.ceil, |
| 12 | 'cos' : math.cos, |
| 13 | 'e' : math.e, |
| 14 | 'exp' : math.exp, |
| 15 | 'floor' : math.floor, |
| 16 | 'log' : math.log, |
| 17 | 'log10' : math.log10, |
| 18 | 'pi' : math.pi, |
| 19 | 'pow' : math.pow, |
| 20 | 'sin' : math.sin, |
| 21 | 'sqrt' : math.sqrt, |
| 22 | 'tan' : math.tan |
| 23 | } |
| 24 | |
| 25 | minimumStepSize = 0.0001 |
| 26 | |
| 27 | def runStringIntegral(f, a, b, step=0.1): |
| 28 | s = 0 |
| 29 | i = a |
| 30 | sandbox = { t:safeFuncs[t] for t in safeFuncs.keys()} |
| 31 | |
| 32 | if step == 0: |
| 33 | sandbox["x"] = a |
| 34 | return eval(f, {"__builtins__":None}, sandbox) |
| 35 | |
| 36 | while i < b: |
| 37 | sandbox["x"] = i |
| 38 | s = s + eval(f, {"__builtins__":None}, sandbox) |
| 39 | i += step |
| 40 | s /= (1.0 / step) |
| 41 | return s |
| 42 | |
| 43 | def parseAndRunInteg(message): |
| 44 | data = parser.match(message) |
| 45 | if not data == None: |
| 46 | formula, a, b, _, _, step = data.groups() |
| 47 | if step == None: |
| 48 | step = 0.1 |
| 49 | |
| 50 | if float(step) < minimumStepSize: |
| 51 | print "Sorry, I dont do integrations with stepsize < %s" % minimumStepSize |
| 52 | return None |
| 53 | |
| 54 | #print "Calculating %s from %s to %s with step %s" %(formula, a, b, step) |
| 55 | print "The result of %s is: %s" %(message, runStringIntegral(formula, float(a), float(b), float(step))) |
| 56 | else: |
| 57 | print "Sorry I did not understand" |
| 58 | |
| 59 | ''' |
| 60 | Tests |
| 61 | ''' |
| 62 | #parseAndRunInteg("integrate sin(x) from 0 to 3.14 step 0.1") # Should be near 2 |
| 63 | #parseAndRunInteg("integrate sin(x) * pi from 0 to 3.14 step 0.1") # Should be near 6.28 |
| 64 | #parseAndRunInteg("integrate x ** 2 from 0 to 10 step 0.001") # Should be near 333 |
| 65 | #parseAndRunInteg("integrate x ** 2 from 1 to 4 step 0.000001") # Should print error |
| 66 |