Gebrochenrationale Funktionen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Jaga
User
Beiträge: 64
Registriert: Mittwoch 21. August 2013, 13:18

Hat hier wirklich niemand eine Idee wie ich eine gebrochenrationale Funktion analysieren und anschließend plotten kann? Mit eval funktionierts nicht.
FASTER! HARDER! LOUDER!
BlackJack

@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!?
Jaga
User
Beiträge: 64
Registriert: Mittwoch 21. August 2013, 13:18

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:

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!
BlackJack

@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
User
Beiträge: 64
Registriert: Mittwoch 21. August 2013, 13:18

Ich erhalte keine Fehlermeldungen und wieso nur die Asymptoten gezeichnet werden weiß ich selbst nicht.
Wäre es möglich dass es mit der eval-Funktion nicht funktioniert?
FASTER! HARDER! LOUDER!
BlackJack

@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
User
Beiträge: 64
Registriert: Mittwoch 21. August 2013, 13:18

Also wenn ich mir den eval-Teil mit 'print' ausgeben lasse, erhalte ich eine riesige Matrix.
FASTER! HARDER! LOUDER!
BlackJack

@Jaga: Stimmen die Werte denn? Irgendetwas ungewöhnliches in den Werten? NaN-Werte?
Jaga
User
Beiträge: 64
Registriert: Mittwoch 21. August 2013, 13:18

Ich habe keine Ahnung. :K aber ich denke schon
FASTER! HARDER! LOUDER!
BlackJack

@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.
Jaga
User
Beiträge: 64
Registriert: Mittwoch 21. August 2013, 13:18

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?
FASTER! HARDER! LOUDER!
BlackJack

@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.
Jaga
User
Beiträge: 64
Registriert: Mittwoch 21. August 2013, 13:18

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?
FASTER! HARDER! LOUDER!
BlackJack

@Jaga: Jetzt könntest Du probieren das zu plotten. Dann wäre geklärt ob der Unendlich-Wert ein Problem darstellt.
Jaga
User
Beiträge: 64
Registriert: Mittwoch 21. August 2013, 13:18

Das habe ich schon getan.
Es sieht zwar etwas eckig aus was ja auch normal ist bei einem Abstand von 0.5 aber ansonsten ist alles super.
Und jetzt?
FASTER! HARDER! LOUDER!
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Jaga
User
Beiträge: 64
Registriert: Mittwoch 21. August 2013, 13:18

ok wieso geht das denn nicht?
und was bedeutet dieser Wert?
FASTER! HARDER! LOUDER!
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jaga: an Deiner Stelle würde ich langsam die x-Rasterung von groß auf fein verändern und schauen, was passiert.
Jaga
User
Beiträge: 64
Registriert: Mittwoch 21. August 2013, 13:18

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
FASTER! HARDER! LOUDER!
BlackJack

@Jaga: Da kannst Du im Grunde nichts gegen machen. Aber was war denn genau das Problem?
Antworten