Utoljára aktív 1 month ago

Integration from string playground

Revízió a74e3ecab2d665d6d34e777ea7140d480071f1c1

integrate.py Eredeti
1#!/usr/bin/env python
2import math, re
3
4parser = re.compile('integrate (.*) from ([0-9]+\.?[0-9]*) to ([0-9]+\.?[0-9]*)( )?(step)? ([0-9]+\.?[0-9]*)?')
5
6safeFuncs = {
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
25minimumStepSize = 0.0001
26
27def 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
43def 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