mein Problem ist eigentlich relativ einfach umschrieben. Bei meinem Funktionsplotter funktionierte die Plot-Funktion einwandfrei, bis ich etwas an der Ableitung verändert habe. Jetzt wird das Koordinatensystem angezeit und auch ein Kästchen mit der Funktion und zugehörigen farbe aber die eigentliche Funktion ist nicht da. Wo ist mein Fehler?
Danke im voraus!
Hier mein Code:
Code: Alles auswählen
import matplotlib.pyplot as plt
import numpy as np
import Tkinter
from sympy.parsing.sympy_parser import parse_expr
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
import parser
import re
import sympy as sp
REPLACE_DIC = {'sin' : 'np.sin',
'arcsin' : 'np.arcsin',
'sinh' : 'np.sinh',
'arcsinh' : 'np.arcsinh',
'cos' : 'np.cos',
'arccos' : 'np.arccos',
'cosh' : 'np.cosh',
'arccosh' : 'np.arccosh',
'tan' : 'np.tan',
'arctan' : 'np.arctan',
'tanh' : 'np.tanh',
'arctanh' : 'np.arctanh',
'ln' : 'np.log',
'log' : 'np.log',
'log10' : 'np.log10',
'exp' : 'np.exp',
'^' : '**',
'sqrt' : 'np.sqrt',
'pi' : 'np.pi',
}
class App():
def __init__(self, master):
self.master = master
master.protocol("WM_DELETE_WINDOW", self.ende)
self.initUI()
def ende(self):
self.master.destroy()
self.master.quit()
def initUI(self):
self.master.title("Funktionsplotter")
self.label_funktion = Tkinter.Label(self.master, text = "Funktion: f(x)")
self.label_funktion.grid(row = 0, column = 0)
self.entry_funktion = Tkinter.Entry(self.master, width = 120)
self.entry_funktion.grid(row = 0, column = 1)
self.label_startwert = Tkinter.Label(self.master, text = "Startwert der Funktion:")
self.label_startwert.grid(row = 2, column = 0)
self.entry_startwert = Tkinter.Entry(self.master, width = 15)
self.entry_startwert.grid(row = 2, column = 1)
self.label_endwert = Tkinter.Label(self.master, text = "Endwert der Funktion:")
self.label_endwert.grid(row = 3, column = 0)
self.entry_endwert = Tkinter.Entry(self.master, width = 15)
self.entry_endwert.grid(row = 3, column = 1)
self.label_genauigkeit = Tkinter.Label(self.master, text = "Abstand zwischen zu berechnenden Punkten:")
self.label_genauigkeit.grid(row = 4, column = 0)
self.entry_genauigkeit = Tkinter.Entry(self.master, width = 15)
self.entry_genauigkeit.grid(row = 4, column = 1)
self.plot_button = Tkinter.Button(self.master, text = "Funktion plotten", command = self.plot)
self.plot_button.grid(row = 0, column = 4)
self.hinzufueg_button = Tkinter.Button(self.master, text = "Zum Plot hinzufügen", command = self.hinzufuegen)
self.hinzufueg_button.grid(row = 3, column = 4)
self.tangenten_button = Tkinter.Button (self.master, text = "Tangente einzeichnen im Punkt:", command = self.tangente)
self.tangenten_button.grid(row = 5, column = 4)
self.entry_tangentenpunkt = Tkinter.Entry(self.master, width = 7)
self.entry_tangentenpunkt.grid(row = 6, column = 4)
fig = plt.figure()
self.canvas = FigureCanvasTkAgg(fig, master=self.master)
self.toolbar = NavigationToolbar2TkAgg(self.canvas, self.master)
self.canvas.get_tk_widget().grid(row=5, column=1)
self.toolbar.grid(row=7, column=1)
def formel_analysieren(self, genauigkeit, startwert, endwert):
self.x = np.arange(float(startwert),
float(endwert),
float(genauigkeit))
x = self.x
formula_raw = self.entry_funktion.get().replace('e^x', 'exp(x)')
formula_raw_exp = formula_raw.replace('e^', 'exp')
formula_list = re.split('(\W)', formula_raw_exp)
formula_replace = [REPLACE_DIC.get(item,item) for item in formula_list]
formula_finish = ''.join(formula_replace)
form = parser.expr(formula_finish).compile()
try:
self.y = eval(form)
self.legend = self.entry_funktion.get()
except NameError:
self.y = np.sin(self.x)
self.legend = 'sin(x)'
return (self.x,self.y,self.legend)
def plot(self):
self.formel_analysieren(self.get_startwert(),
self.get_endwert(),
self.get_genauigkeit())
plt.clf()
plt.plot(self.x,self.y, label=self.legend)
plt.grid('on')
plt.xlabel('x - Achse')
plt.ylabel('y - Achse')
legend = plt.legend()
legend.draggable(state=True)
plt.gcf().canvas.draw()
def hinzufuegen(self):
self.formel_analysieren()
plt.plot(self.x,self.y, label=self.legend)
legend = plt.legend()
legend.draggable(state=True)
plt.gcf().canvas.draw()
def tangente(self):
self.formel_analysieren(0.0005,
float(self.entry_tangentenpunkt.get())-0.0001,
float(self.entry_tangentenpunkt.get())+0.0001)
plt.plot(self.x,self.y,'o')
np.set_printoptions(precision=3)
plt.text(self.x, self.y, [float(np.round(self.x, decimals=3)),
float(np.round(self.y, decimals=3))])
self.ableitung(self.entry_tangentenpunkt.get())
plt.plot([self.x+1,self.x-1],[self.y+self.slope,self.y-self.slope])
plt.gcf().canvas.draw()
def ableitung(self, val):
x = sp.Symbol('x')
formula = self.formula_finish
form = self.formula_finish.replace('np.', '')
sympy_exp = parse_expr(form)
df = sympy_exp.diff(x)
self.slope = df.evalf(subs={x:val})
def get_genauigkeit(self):
if self.entry_genauigkeit.get() is None:
return 0.01
else:
return self.entry_genauigkeit.get()
def get_startwert(self):
if self.entry_startwert.get() is None:
return -5
else:
return self.entry_startwert.get()
def get_endwert(self):
if self.entry_endwert.get() is None:
return 5
else:
return self.entry_endwert.get()
def main():
root = Tkinter.Tk()
app = App(root)
root.mainloop()
if __name__ == '__main__':
main()
