Zuletzt aktiv 1 month ago

Integration from string playground

integrate.py Originalformat
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 return "Sorry, I dont do integrations with stepsize < %s" % minimumStepSize
52
53 return "The result of %s is: %s" %(message, runStringIntegral(formula, float(a), float(b), float(step)))
54 else:
55 return "Sorry I did not understand"
56
57'''
58 Tests
59'''
60#parseAndRunInteg("integrate sin(x) from 0 to 3.14 step 0.1") # Should be near 2
61#parseAndRunInteg("integrate sin(x) * pi from 0 to 3.14 step 0.1") # Should be near 6.28
62#parseAndRunInteg("integrate x ** 2 from 0 to 10 step 0.001") # Should be near 333
63#parseAndRunInteg("integrate x ** 2 from 1 to 4 step 0.000001") # Should print error
64