Nullpunkt einer Funktion(y-Achse)
-
Hey Leute,
ich arbeite an einem Programm, dass den Nullpunkt einer Funkton auf der Y-Achse ausgibt.
Beispiel:
f(x)=x*x+2*x-3 // x*x = x²
f(0)=0²+2*0-3 // Es wird einfach x=0 gemacht
f(0)=-1
also die Y-Koordinate = -1
.
.
.
.So weit so gut.....
Das wäre die Vorgehensweise, ansich ja ganz simpel. Nun muss das auch ein Computer erledigen können. Ich dachte an folgendes://...... class Token{ public: char kind; double value; }; Token get_token(); vector<Token>tok; int main() { while (cin){ Token t = get_token(); tok.push_back(t); } //...... for(int i=0;i<tok.size();++i){ if(tok[i].value==x){ tok[i].value=0 } //........ }Gut, jetzt wäre ja schonmal nach dem x gesucht worden und es wäre durch 0 ersetzt worden....
Jetzt muss aber der Term noch ausgerechnet werden, um auf y zu kommen. Dabei gelten natürlich auch alle Rechenregeln, wie "Punkt-vor-Strich" etc.Wie kann ich jetzt die Token wieder zu einem Term zusammensetzen und diesen dann ,mit berücksichtigung der Rechenregeln, aurechnen lassen?
Ein Beispielcode würde mir sehr weiter helfen.
-
Ich sag mal so: Du übernimmst dich, wenn du das selber programmieren möchtest. Gewaltig. Mathematik zu parsen, besonders wenn es mehr sein soll als +-*/, ist ganz schön schwer zu programmieren.
Irgendwo geistert hier im Forum ein recht ausgereifter Parser rum, den sicherlich gleich jemand verlinkt, aber soweit ich mich erinnere wird der auch seine Probleme mit z.B. Potenzen bekommen.
-
Okay, das mit den Potenzen ist unwichtig. Wenn es sich um eine quadratische Funkton handelt, wird das nicht als z.b. x² sondern als x*x vom Benutzer eingegeben. Es geht also eigentlich nur um funktionen mit -,+,* . Geteilt ,Klammern, Potenzen etc. können erstmal ausser Acht gelassen werden.
-
Golfi1812 schrieb:
Okay, das mit den Potenzen ist unwichtig. Wenn es sich um eine quadratische Funkton handelt, wird das nicht als z.b. x² sondern als x*x vom Benutzer eingegeben. Es geht also eigentlich nur um funktionen mit -,+,* . Geteilt ,Klammern, Potenzen etc. können erstmal ausser Acht gelassen werden.
Ok, ich nehme mal an, dass du das selber schreiben möchtest. Die übliche Idee ist, dass man den Ausdruck zuerst in umgekehrt polnische Notation umschreibt:
http://scriptasylum.com/tutorials/infix_postfix/algorithms/infix-postfix/index.htm
Und das lässt sich dann relativ einfach mit konventionellen Mitteln verarbeiten:
http://scriptasylum.com/tutorials/infix_postfix/algorithms/postfix-evaluation/index.htm
Das gleiche in etwas ausführlicher:
http://lukaszwrobel.pl/blog/math-parser-part-1-introductionOder falls es einfach nur funktionieren soll, kannst du dir ja mal dies hier angucken:
http://muparser.sourceforge.net/
-
Nur am Rande: die Nullstellen von
x²+2x-3sind 1 und -3.
-
Danke, gibt es auch schon Parservorlagen aus denen man sich bedienen kann?
Vielleicht auch dazu ein paar Links, denn das selbst zu schreiben wäre aufwendig, ist ja nur ein "Testprojekt" möchte da nicht so viel Zeit investieren...
-
Selberschreiben ist schon ok. Siehe "recursive descent parser".
Ansonsten schau bei "Dankert Parser".
-
OK, dann empfehle ich auch mal wieder meinen Funktionsparser: http://www.c-plusplus.net/forum/p1780654#1780654