C++ Ableitung über Taylorreihe?

11/28/2014 17:15 Belur#1
Hey,

habe in der Uni im Moment ein Projekt am laufen.
Es soll mathematische Funktionen ausrechnen können. Das ganze funktioniert bislang mit Java und Antlr4.

Also Antlr4 generiert mir Bäume die in etwa aussehen:
[Only registered and activated users can see links. Click Here To Register...]
Der generierte TreeWalker iteriert dann darüber und ruft die entsprechenden Funktionen im Listener auf. So wird das ganze dann berechnet.
Damit lassen sich dann Ausdrücke wie: f(a,b)=2*a-5*b^2; f(3,4); oder einfach nur Rechnungen wie 5-(2*3) ausrechnen.

Nun soll hinzukommen, dass eine C++ Routine die Ableitung an einer bestimmten Stelle ausrechnet. Also f(x)=x^2; f'(2); oder Ähnliches.
Das ganze soll über die JNI Schnittstelle implementiert werden.

Erste Aufgabe soll es sein, erstmal eine solche Ableitung an einer Stelle x0 zu berechnen in einer C++ Funktion. Da wir uns C++ jetzt selbst aneignen müssen bin ich ziemlich ratlos wie man in C++ "rechnet".

In Java kann ich einen String ja nur ausrechnen indem ich über Bäume iteriere und dann Funktionen im Listener aufrufe, die dann Ergebnise auf einen Stack pushen und verrechnen.
In C++ hab ich jetzt natürlich weder einen TreeWalker, noch Antlr4, noch einen Listener etc.
Gibt es eine Datenstruktur oder irgendwelche andere Verfahren um eine Funktion zu berechnen oder wie geht man das am besten an?

Denke wir sollen keine fertig implementieren Schnittstellen nehmen sondern sowas "händisch" machen.

Hoffe jemand hat da einen Ansatz ;)

Grüße
11/30/2014 21:05 Tasiro#2
In C++ gehst du genauso vor wie in anderen Sprachen - parsen und (möglicherweise implizit) den Baum durchlaufen. Für den ersten Teil kannst du z. B. ANTLR 3, Boost.Spirit oder eine der vielen Yacc-Varianten nutzen. Oder du kannst den Parser selbst schreiben, wovon ich im Folgenden ausgehen werde. Es bietet sich in der Regel an, davor einen Lexer zu verwenden.
Sofern du explizit einen Syntaxbaum konstruierst (in diesem Fall eine gute Idee, so musst du den Ausdruck nicht jedes Mal neu parsen, wie es AutoIt tut), kannst du das Besucher-Entwurfsmuster für die einzelnen Syntaxknoten verwenden, wobei du bei jedem Besuch das Ergebnis des aktuellen Teilausdruckes zurückgibst oder alternativ deine Stapel-Variante verwendest.

Davon abgesehen halte ich es nicht für die beste Idee, mit einem Parser in C++ anzufangen, insbesondere, wenn man von einer Sprache wie Java kommt.