Gebrochenrationale Funktionen
@Jaga: Wo genau liegt denn das Problem? Die Frage ist IMHO ein ganz klein wenig zu allgemein gestellt. Was willst Du analysieren? Warum kannst Du sie nicht plotten? Stolperst Du darüber das im Nenner auch mal eine 0 vorkommen kann und das natürlich nicht sein darf, beziehungsweise die Funktion an der Stelle undefiniert ist!?
Also das problem liegt irgendwo im Analyseteil von meinem Funktionsplotter.
Alle anderen Funktionen (Sinus cosinus Potenzen und so weiter) funktionieren alle nur eben die gebrochen rationalen nicht.
Momentan werden nur die Asymptoten geplottet.
Hier mal meine Formelanalyse:
Alle anderen Funktionen (Sinus cosinus Potenzen und so weiter) funktionieren alle nur eben die gebrochen rationalen nicht.
Momentan werden nur die Asymptoten geplottet.
Hier mal meine Formelanalyse:
Code: Alles auswählen
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]
self.formula_finish = ''.join(formula_replace)
form = parser.expr(self.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)
FASTER! HARDER! LOUDER!
@Jaga: Das beantwortet die Frage(n) nicht. Wo *genau* liegt das Problem? Warum wird nicht geplottet? Fehlermeldung(en)? Wie sieht das mit den Werten aus? Hast Du überall die erwarteten Werte? Wenn nicht, wo nicht und welche hast Du, und welche hast Du erwartet, und warum? Wie sähe ein minimales aber lauffägiges Beispiel aus?
@Jaga: Überprüf das doch einfach. Du hast ja offensichtlich eine problematische Formel. Gehe Dein Programm Schritt für Schritt durch und überprüfe ob an jeder Stelle im Programm die von Dir erwarteten Werte brechnet werden. Lass Dir das Ergebnis von `eval()` ausgeben. Dann siehst Du doch ob das funktioniert oder nicht.
@Jaga: Stimmen die Werte denn? Irgendetwas ungewöhnliches in den Werten? NaN-Werte?
@Jaga: Was heisst Du hast keine Ahnung? Das kann man doch überprüfen. Zum Beispiel die Daten in eine Datei speichern und mit `matplotlib` ausserhalb Deines Programms mal plotten lassen. Und ob NaN-Werte enthalten sind kann man auch einfach mal überprüfen. Oder vielleicht etwas anderes. Herauszufinden was bei Numpy-Arrays passiert wenn eine Division durch 0 gemacht wird überlasse ich Dir mal als Übung.
Also:
Ich habe die Werte für die Funktion 1/x mal getestet.
Sprich ich habe mir die self.x und self.y Werte printen lassen,die riesigen ausgegebenen Matrizen kopiert und diese dann in einem andren Programm erneut versucht zu plotten.
Ergebnis war ein syntax error mittten in der self.y Matrix.
Nur was heißt das jetzt?
Ich habe die Werte für die Funktion 1/x mal getestet.
Sprich ich habe mir die self.x und self.y Werte printen lassen,die riesigen ausgegebenen Matrizen kopiert und diese dann in einem andren Programm erneut versucht zu plotten.
Ergebnis war ein syntax error mittten in der self.y Matrix.
Nur was heißt das jetzt?
FASTER! HARDER! LOUDER!
@Jaga: Das heisst, dass man die Zeichenkettendarstellung von Objekten nicht einfach als Quelltext nehmen kann. Bei einigen geht das, bei den allermeisten geht das nicht. Du müsstest die Daten in einem dafür vorgesehenen Format speichern und wieder laden. Numpy hat zum Beispiel Funktionen um sie in Textdateien zu speichern.
Du könntest das aber auch einfach mal ohne Dein Programm mit weniger Datenpunkten, vielleicht 10 oder so, einfach mal interaktiv in einer Python-Shell ausprobieren. Achte dabei darauf, dass der erwähnte besondere Fall in den Daten enthalten ist, also der Ausschnitt den Du berechnest, nicht stetig ist.
Du könntest das aber auch einfach mal ohne Dein Programm mit weniger Datenpunkten, vielleicht 10 oder so, einfach mal interaktiv in einer Python-Shell ausprobieren. Achte dabei darauf, dass der erwähnte besondere Fall in den Daten enthalten ist, also der Ausschnitt den Du berechnest, nicht stetig ist.
Also mit Genauigkeit(Abstand zwischen den zu berechnenden Punkten) = 0.5 siehts ganz gut aus und für f(x) = 1/(2-x) erhalte ich diese self.y Matrix:
(Startwert: -5 Endwert: 5)
[ 0.14285714 0.15384615 0.16666667 0.18181818 0.2 0.22222222
0.25 0.28571429 0.33333333 0.4 0.5 0.66666667
1. 2. inf -2. -1. -0.66666667
-0.5 -0.4 ]
Und jetzt wäre nur die Frage was sagt mir das?
(Startwert: -5 Endwert: 5)
[ 0.14285714 0.15384615 0.16666667 0.18181818 0.2 0.22222222
0.25 0.28571429 0.33333333 0.4 0.5 0.66666667
1. 2. inf -2. -1. -0.66666667
-0.5 -0.4 ]
Und jetzt wäre nur die Frage was sagt mir das?
FASTER! HARDER! LOUDER!
@Jaga: Jetzt könntest Du probieren das zu plotten. Dann wäre geklärt ob der Unendlich-Wert ein Problem darstellt.
@Jaga: jetzt könntest Du Dich fragen, warum das Plotten von wenigen Punkten geht und mit vielen Punkten nicht das Ergebnis erscheint, das Du Dir gedacht hast. Und was dieses komische "1e9" links oben wohl bedeuten mag.
So Problem gefunden aber keine Lösung dafür.
Und zwar lautet das Schlagwort Fließkomma-Arithmetik.
Bei bestimmten Genauigkeitswerten erhalte ich wider erwartend nicht x= 0 sondern x=-1,77...*10**-14 also nur "fast" 0, und somit auch falsche y-Werte.
Habt ihr irgendwelche Ideen wie ich den ganzen Spaß mit Fließkomma-Arirthmetik in Matrizen einbauen kann? :K
Und zwar lautet das Schlagwort Fließkomma-Arithmetik.
Bei bestimmten Genauigkeitswerten erhalte ich wider erwartend nicht x= 0 sondern x=-1,77...*10**-14 also nur "fast" 0, und somit auch falsche y-Werte.
Habt ihr irgendwelche Ideen wie ich den ganzen Spaß mit Fließkomma-Arirthmetik in Matrizen einbauen kann? :K
FASTER! HARDER! LOUDER!
@Jaga: Da kannst Du im Grunde nichts gegen machen. Aber was war denn genau das Problem?