Kent
Jacob S. wrote:
I think this thing is screaming for better structure, but previous attempts at using oop for it have failed.
I think Derintegral is okay, I'm focusing on FunctionGrapher5.py--but you can comment on both.
(To Johan Nilsson: I haven't had time to implement Simpson's rule instead of Reimann's sum yet... but I have gotten it to work faster anyway.)
I will probably expand the code yet... Add extra things like find area between curve and x axis in interval [a,b]...
Any suggestions are greatly appreciated. If you want the code to work on your machine, you'll need to have my Derintegral.py sys.path, obviously.
#### Start of FunctionGrapher5.py ################### from __future__ import division from visual import * import Derintegral import os, random from math import * ja = 0
scenexdefault = 375
def start(): for objects in scene.objects: objects.visible = 0 scene.title = "Function Grapher by Jacob, Inc." scene.x = scenexdefault scene.visible=1 scene.exit=0 scene.userspin = 0 scene.range=(10,10,1) scene.background=(1,1,1) global xaxis global yaxis xaxis = curve(pos=[(100,0,0),(-100,0,0)],color=color.black) yaxis = curve(pos=[(0,100,0),(0,-100,0)],color=color.black) global radiusaxis global radiusaxis2 radiusaxis = curve(pos=[(-100,-100),(100,100)],color=color.black) radiusaxis2 = curve(pos=[(-100,100),(100,-100)],color=color.black) radiusaxis.visible = 0 radiusaxis2.visible = 0
start() d = 1 print """\ List of Commands: clear quit remove lines return lines gotl # (Graph One Tangent Line) w/optional x coordinate gatl # (Graph All Tangent Lines) w/optional step gonl # (Graph One Normal Line) w/optional x coordinate ganl # (Graph All Normal Lines) w/optional step
Function Syntax: [y,x,or r] = function [range] ["s" followed by float for step] Brackets mean that it's not required. So, in effect, you don't have to type a function """
def graphit(type,f,range2,step): li = curve(color=color.blue) if type in ['y','x']: x = -15 radiusaxis.visible = 0 radiusaxis2.visible = 0 while -15 <= x <= 15: if eval(range2): try: a = f(x) if -15 <= a <= 15: if type == 'y': li.append(pos=(x,a,0)) elif type == 'x': li.append(pos=(a,x,0)) else: li = curve(color=color.blue) except: pass else: li = curve(color=color.blue) x = x+step elif type == 'r': exec "def m(t): return f(t)*cos(t)" exec "def n(t): return f(t)*sin(t)" t = 0 while 0 <= t <= 10*pi: if eval(range2): try: li.append(pos=(m(t),n(t),0)) except: li = curve(color=color.blue) t = t+step
print 'Please type in functions in below. '
while 1:
lists=[]
y = raw_input(">")
if y == 'clear':
scene.visible=0
start()
print "-"*36
continue
elif y == 'quit':
scene.visible = 0
del scene
break
elif y == 'remove lines':
a = [radiusaxis,radiusaxis2,xaxis,yaxis]
for x in a:
x.visible = 0
d = 0
continue
elif y == 'return lines':
a = [radiusaxis,radiusaxis2,xaxis,yaxis]
for x in a:
x.visible = 1
d = 1
continue
elif y.startswith('gatl'):
try:
step2 = float(y.lstrip("gatl "))
except:
step2 = 0.5
x = -20
while -20 <=x<= 20:
try:
der = Derintegral.diffatpt(f,x)
if abs(der)<=25:
if type == 'y':
curve(pos=[(-15,eval("der*(-15-x)+f(x)")),(15,eval("der*(15-x)+f(x)"))],color=color.red)
else:
curve(pos=[(eval("der*(-15-x)+f(x)"),-15),(eval("der*(15-x)+f(x)"),15)],color=color.red)
except:
pass
x = x + step2
continue
elif y.startswith('ganl'):
try:
step2 = float(y.lstrip("ganl "))
except:
step2 = 0.5
x = -20
while -20 <=x<= 20:
try:
der = Derintegral.diffatpt(f,x)
if abs(der)<=25:
if type == 'y':
curve(pos=[(-15,eval("(-1/der)*(-15-x)+f(x)")),(15,eval("(-1/der)*(15-x)+f(x)"))],color = color.red)
else:
curve(pos=[(eval("(-1/der)*(-15-x)+f(x)"),-15),(eval("(-1/der)*(15-x)+f(x)"),15)],color = color.red)
except:
pass
x = x + step2
continue
elif y.startswith('gotl'):
try:
x = float(y.lstrip('gotl '))
except:
x = float(raw_input('What x coordinate do you want the tangent line at? '))
der = Derintegral.diffatpt(f,x)
try:
if abs(der)<= 25:
if type == 'y':
curve(pos=[(-15,eval("der*(-15-x)+f(x)")),(15,eval("der*(15-x)+f(x)"))],color=color.red)
else:
curve(pos=[(eval("der*(-15-x)+f(x)"),-15),(eval("der*(15-x)+f(x)"),15)],color=color.red)
except:
pass
continue
elif y.startswith('gonl'):
try:
x = float(y.lstrip('gonl '))
except:
x = float(raw_input('What x coordinate do you want the tangent line at? '))
der = Derintegral.diffatpt(f,x)
try:
if abs(der)<= 25:
if type == 'y':
curve(pos=[(-15,eval("(-1/der)*(-15-x)+f(x)")),(15,eval("(-1/der)*(15-x)+f(x)"))],color=color.red)
else:
curve(pos=[(eval("(-1/der)*(-15-x)+f(x)"),-15),(eval("(-1/der)*(15-x)+f(x)"),15)],color=color.red)
except: pass continue elif y.startswith('getpt'): y = y.lstrip("getpt ") if y: m = float(eval(y)) else: m = float(eval(raw_input("f(?) "))) try: print f(m) except ValueError: print "Math Domain Error" continue elif y == 'regraph': graphit(type,f,range2,step) continue if y.count(" = ") == 1: y = y.split(" = ") type = y[0].lower() y = y[1] y = y.replace("y","x") if type == 'r': defaultrange = '0<=t<=5*pi' y = y.replace('x','t') if d == 1: radiusaxis.visible = 1 radiusaxis2.visible = 1 else: defaultrange = '-15<=x<=15' else: type = 'y' defaultrange = '-15<=x<=15' y = y.split(" ",1) tempfunct = y.pop(0) if y: y = y[0] if y.count('st'): if y.startswith('st'): y = y.lstrip('st') step = float(y) else: y = y.split(" ") step = float(y.pop().lstrip('st')) y = " ".join(y) range2 = defaultrange else: range2 = y step = 0.005 else: range2 = defaultrange step = 0.005 y = tempfunct range2 = range2.replace('and','or') range2 = range2.replace(',','<=x<=') try: exec "def f(x): return %s" % y except: continue graphit(type,f,range2,step) ###### End of FunctionGrapher5.py ###########
#### Start of Derintegral.py ########## from __future__ import division import psyco psyco.full() from math import *
def diffatpt(funct,pt): """Return the derivative of a function at a specific point. """ sminc = 1e-10 x = pt+sminc y2 = funct(x) x2 = x x = pt-sminc y1 = funct(x) x1 = x slope = (y2-y1)/(x2-x1) return slope
def defintegral(fofx,x,max1): total = 0 step = 1e-5 exec "def f(x): return %s" % fofx while x <= max1: try: total = total+f(x) except: pass x = x+step return abs(total*step) ######End of Derintegral.py ##########
Like I said, any comments appreciated. Jacob Schmidt _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor