Hi,
I was wondering how to write code that allowed a user to input a mathematical expression for evaluation. For example, I've written a simple method that calculates Riemann sums.

``````def riemann(hgLoc, a, b, intervals):
sums = 0.0
size = float(b - a) / intervals
for i in range(0, intervals):
sums = sums + ((i+ hgLoc) * size + a) ** 2 #It's hard coded to f(x) = x ^ 2 right now...
sums *= size
return sums``````

Is there any way for it to do the following?

``````def riemann(hgLoc, a, b, intervals, USERINPUTEXPRESSION):
sums = 0.0
size = float(b - a) / intervals
for i in range(0, intervals):
sums = sums + USERINPUTEXPRESSION((i+ hgLoc) * size + a)
sums *= size
return sums``````

(Also is it possible to do this in Java?)
Thanks for any responses.

2
Contributors
2
Replies
3
Views
7 Years
Discussion Span
Last Post by pyTony

Alright I think I found a reasonable way to do this by using strings and eval().

``````def riemannFunc(hgLoc, a, b, intervals, func):
sums = 0.0
size = float(b - a) / intervals
for i in range(0, intervals):
x = ((i+ hgLoc) * size + a)
sums = sums + eval(func)
sums *= size
return sums

>>> riemannFunc(1, 0, 10, 100, "x**2")
338.35000000000008``````

If anyone knows a better way to do this (apart from checking which I'm going to work on checking later) please let me know.

I have not better alternative that only this interactive loop. Remember to mark thread solved if you think it solved.

``````from math import *
def riemannFunc(hgLoc, a, b, intervals, func):
sums = 0.0
size = float(b - a) / intervals
for i in range(0, intervals):
x = ((i+ hgLoc) * size + a)
sums = sums + eval(func)
sums *= size
return sums

def evalx(func):
x=1
try:
if func.find('x')!=-1:
y=eval(func)
return func
except NameError,SyntaxError:
pass
raise ValueError,"Formula was not containing x or contains other errors."

def interactive():
print "Give empty line to finish"
while True:
try:
func= raw_input('Give formula containing x: ')
if not func: break
func=evalx(func)
hgLoc=float(raw_input('Give hgLoc: '))
a=float(raw_input('Give a: '))
b=float(raw_input('Give b: '))
intervals=int(raw_input('Give intervals: '))
print 'Result: ',riemannFunc(hgLoc, a, b, intervals,func)
print '='*60
except ValueError as e:
print e

if __name__=="__main__":
interactive()``````

Edited by pyTony: n/a

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.